一、简介
之前我们研究了一下thrift的一些知识,我们知道他是一个rpc框架,他作为rpc自然是提供了客户端到服务端的访问以及两端数据传输的消息序列化,消息的协议解析和传输,所以我们今天就来了解一下他是如何实现这些功能,并且如何在实际代码中使用。
我们需要搭建环境。
1. 安装Thrift 作用:把IDL语言描述的接口内容,生成对应编程语言的代码,简化开发。我们已经介绍了在mac如何使用brew安装了。
2. 引入依赖 作用:引入thrift针对于某一种编程语言的封装 (网络通信 协议【序列化】)
二、结构和模块
1、Thrift核心对象
1. TTransport
作用:底层封装了rpc的网络通信能力,具体实现有下面三种
TSocket 阻塞IO通信
TNonblockdingTransport 非阻塞网络通信
TFramedTransport 加入了封帧的操作 (压缩后 数据边界问题)
2. TProtocol
作用:底层封装了rpc的关于协议的处理 (序列化方式)
TBinayProtocol 二进制进行序列化
TCompactProtocol 压缩方式 处理二进制
TJSONProtocol JSON进行序列化
这里需要说明一下,当我们的序列化方式走了TCompactProtocol压缩处理的时候,你最好使用TFramedTransport来处理网络通信,因为一旦数据开启了压缩,那就可能传输很大量的数据,数据的模样和原始的不同,此时可能因为缓冲区大小等等出现半包粘包问题。需要解决封帧。其他的方式一般没啥,因为rpc数据量不会很大,一般没有半包粘包,具体问题具体分析吧。而且你能看到他提供多种协议,并不是用的http协议这个最常见的,这个没啥说的,高性能的网络协议,一般都不用http,http的优势是简单通用。
3. TProcessor
作用:进行业务处理,把通信数据 和 业务功能整合在一起。换句话说我们的业务代码就在这里,其实就是把数据拿过来了,开始业务处理了。
4. TServer 服务端
服务端就是用上面的三个组件,组合起来实现具体的服务端逻辑,根据不同的实现有异步的有同步的等等,并且发布服务出去。
2、项目结构
我们在编码之前需要明确一点,就是作为rpc(Remote Procedure Call),远程调用必然存在一个服务的提供者和一个服务的调用者。所以我们必须有的两个模块是rpc-server和rpc-client。
在实际开发的时候,我们比如说服务调用者和提供者可能有相同的数据比如User这个类,那你不能在两边各自都写一个吧,肯定是写一份维护就好了。所以我们还需要一个rpc-common的模块,用来声明那些公用的类,包括一些公用的实体类,还有发起rpc调用的service代理类等等。
于是我们就抽象出了三个模块。
1. thrift-client 代表的是服务的调用者,客户端要想本地方法那样调用远端方法,底层必然是代理。
2. thrift-server 代表的是服务的提供者
2.1. 实现服务接口 :idl语言生成的
2.2. 创建服务端代码
3. thrift-common RPC编程共有的内容 1,实体类型 2,服务接口
3.1. 通过IDL语言 定义 client与服务端 共用的数据类型 和 服务接口
3.2. client server端需要引入 common模块
我们这里是以同一个工程下的模块化的形式搭建项目,实际上你也可以单独创建不同的工程。
3、引入依赖
我们这里是一个项目多个模块,所以我直接在父级项目引入了。
<modules>
<module>thrift-client</module>
<module>thrift-server</module>
<module>thrift-common</module>
</modules>
<properties>
<thrift.version>0.22.0</thrift.version>
<javax.annotation.version>1.3.2</javax.annotation.version>
<slf4j-api.version>1.7.32</slf4j-api.version>
<logback-classic.version>1.2.9</logback-classic.version>
<junit.version>3.8.1</junit.version>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 引入thrift针对于某一种编程语言的封装,java就是maven管理jar,你要是用py开发,那就是pip (网络通信 协议【序列化】)-->
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>${thrift.version}</version>
</dependency>
<dependency>
<group

最低0.47元/天 解锁文章
278

被折叠的 条评论
为什么被折叠?



