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(); } } }