rpc之thrift
一.介绍
thrift是一个rpc(remove procedure call)框架,可以实现不同的语言(java、c++、js、python、ruby、c#等)之间的相互调用。是知名的社交网络公司facebook贡献出来,现有apache基金会负责维护的高效的rpc框架。是一种典型的C/S架构模式,我们可以定义一个IDL(Interface Definetion Language)文件,然后通过该文件可以生成对应语言的代码,然后在各语言之间就如同调用本地方法一样,相信之前有做过protobuf或者grpc开发的朋友对这种模式非常的熟悉,当然这种模式是几乎笔者所熟悉的所有的rpc框架都采用的方式。thrift非常使用于大型的且并发量很高的应用,至少在笔者曾经就职的公司的项目上没有出现过任何的性能瓶颈。
二.IDL文件的介绍以及编写
在使用thrift的时候,最关键的部分就是编写IDL文件,首先需要给大家介绍的是thrift的数据类型:
bool 布尔类型 byte 字节 i16 短整型 i32 整型 i64 长整型 double 浮点型 string 字符串
IDL文件定义:
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文件生成对应代码的文件
首先需要下载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(); } } }