Thrift步骤

1.定义Thrift服务

即编写.thrift文件:

struct User {
    1: i32 ID
    2: string Name
  }
 
service UserService {
    User GetUserByID(1:i32 userID)
    list<User> GetAllUser() 
} 

service定义的是服务类,struct是传入或者传出的复杂数据类型(支持对象级联)。
语法规范 http://thrift.apache.org/docs/idl

2.编译Thrift

用thrift工具编译上面定义的.thrift文件,然后客户端和服务端都必须持有对应开发语言的服务接口类(这里会生成两个类:User.cs和UserService.cs,假设用C#开发)
在这里插入图片描述
上面是Thrift编译生成的文件中最重要的几个概念:

  • Isync、Iface:相当于服务接口,RPC的主要目的就是让server和client两者通过这个接口进行交互
  • Client:顾名思义客户端需要使用的,客户端持有这个服务对象,并借由这个对象中的Client来向server发起RPC请求(需要以Protocol为参数创建)
  • Processor:serve端使用的,主要是用来解析client的RPC调用,并负责执行响应client(需要以服务具体实现类xxxImp作为参数创建)

3.定义server

A Server pulls together all of the various features described above:

  • Create a transport:实质上就是创建一个socket对象,相当于是对网络输入输出流的抽象
  • Create input/output protocols for the transport:定义原始网络数据流的编码解码规则,不同的序列化格式编码解码规则不同
  • Create a processor based on the input/output protocols:按照某种protocol(编码/解码规则),写入或写出数据流到socket中
  • Create server by certain I/O model:定义服务端IO模式,阻塞式IO、非阻塞式IO(IO多路复用)、多线程阻塞式IO、多线程非阻塞式IO
  • Start server :开启server
  • Wait for incoming connections and hand them off to the processor:等待连接到来,如果连接到来,由processor进行解码
    ,并执行相应的服务程序
  1. 单一服务接口

    //Create a transport
    TServerSocket serverTransport = new TServerSocket(8080, 0, false);
    //Create a processor
    UserService.Processor processor = new UserService.Processor(new UserServiceImp());
    //Create server by certain I/O model
    TServer server = new TThreadPoolServer(processor, serverTransport);
    //Start server and wait for incoming connections and hand them off to the processor
    server.Serve();
    
  2. 多服务接口

    //定义多服务接口,此TMultiplexedProcessor能够处理多个服务的输入输出流
    TMultiplexedProcessor processor = new TMultiplexedProcessor();
    TServerTransport transport = new TServerSocket(port);//监听8800端口
    TServer server = new TThreadPoolServer(processor, transport);
    
    processor.RegisterProcessor("UserService", new UserService.Processor(new UserServiceImp()));
    processor.RegisterProcessor("HelloWorldService", new HelloWorldService.Processor(new HelloWorldServiceImp()));
    
    server.Serve();
    

4.编写Client

在这里插入图片描述
主要步骤:

  1. 就是定义好远程server地址
  2. 定义数据传输(通信)方式transport(一般都是远程socket通信),然后开放这个transport(端口/fd),以便数据写入写出
  3. 然后再定义Protocol,对这个fd中的数据按照protocol的协议(二进制、json等数据格式)进行解析
  4. 再定义好了Protocol之后,便相当于知道了需要传递的数据的格式,以及通信方式,以及远程地址,于是就可以以protocol为参数创建Client了,相当于这个Client中定义了数据序列化方式、通信方式、远程服务地址,所以就可以直接通过Client对象调用远程RPC方法了
发布了69 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/JustKian/article/details/102536629
今日推荐