rpc之thrift

rpc之thriftjava

一.介紹python

  thrift是一個rpc(remove procedure call)框架,能夠實現不一樣的語言(java、c++、js、python、ruby、c#等)之間的相互調用。是知名的社交網絡公司facebook貢獻出來,現有apache基金會負責維護的高效的rpc框架。是一種典型的C/S架構模式,咱們能夠定義一個IDL(Interface Definetion Language)文件,而後經過該文件能夠生成對應語言的代碼,而後在各語言之間就如同調用本地方法同樣,相信以前有作過protobuf或者grpc開發的朋友對這種模式很是的熟悉,固然這種模式是幾乎筆者所熟悉的全部的rpc框架都採用的方式。thrift很是使用於大型的且併發量很高的應用,至少在筆者曾經就任的公司的項目上沒有出現過任何的性能瓶頸。c++

二.IDL文件的介紹以及編寫apache

  在使用thrift的時候,最關鍵的部分就是編寫IDL文件,首先須要給你們介紹的是thrift的數據類型: c#

bool    布爾類型
byte    字節
i16     短整型
i32     整型
i64     長整型
double  浮點型
string  字符串

     IDL文件定義:windows

namespace java com.test.netty.lesson9

typedef i16 short;
typedef i32 int;
typedef i64 long;
typedef string String;
typedef bool boolean;

//定義結構
struct Person {
    1: optional String name;
    2: optional int age;
    3: optional boolean isMarried;
}

//定義異常
exception DataException {
    1: optional String message;
    2: optional String callStack;
    3: optional String date;
}

//定義服務
service PersonService {
    Person getPersonByName(1: required String name) throws (1: DataException dataException);
    void savePerson(1: required Person person) throws (1: DataException dataException);
}

三. 根據Idl文件生成對應代碼的文件ruby

   首先須要下載thrift,讀者能夠到官網查找對應系統的安裝文件,而後再配置環境變量,windows下很是的簡單,只須要將下載好的thrift.exe文件加入到path下就能夠了。網絡

   在命令行下執行命令:thrift  --gen java test.thrift 架構

                    

四.測試代碼的編寫併發

4.1 服務端代碼

public class ThriftServer {
    public static void main(String[] args) throws TTransportException {
        
        TNonblockingServerSocket socket = new TNonblockingServerSocket(8999);
        
        THsHaServer.Args arg = new THsHaServer.Args(socket).maxWorkerThreads(4).minWorkerThreads(2);
        
        PersonService.Processor<PersonServiceImpl> processor = new PersonService.Processor<>(new PersonServiceImpl());
        
        arg.protocolFactory(new TCompactProtocol.Factory());
        arg.transportFactory(new TFramedTransport.Factory());
        arg.processorFactory(new TProcessorFactory(processor));
        
        TServer server = new THsHaServer(arg);
        
        System.out.println("server begin started...");
        
        server.serve();
    }
}

4.2 客戶端代碼編寫

public class ThriftClient {
    public static void main(String[] args) {
        TTransport transport = new TFramedTransport(new TSocket("localhost", 8999), 600);
        
        TProtocol protocol = new TCompactProtocol(transport);
        
        PersonService.Client client = new PersonService.Client(protocol);
        
        try {
            transport.open();
            Person person = client.getPersonByName("王五");
            System.out.println(person.getAge() + ";;" + person.getName() + ";;" + person.isIsMarried());
            
            Person p = new Person();
            p.setAge(56);
            p.setName("田七");
            p.setIsMarried(false);
            
            client.savePerson(p);
            
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            transport.close();
        } 
    }
}
相關文章
相關標籤/搜索