前言
前面几篇博客,着重对Apache Thrift
的使用和原理做了介绍。在微服架构流行的今天,自然而然就会想到Spring Boot
和Spring Cloud
作为微服务的基础框架。然而,Spring Cloud
从诞生以来,就基于HTTP
协议的轻量级Restful API
作为服务之间的通信方式。
在微服务架构设计中,可以分为外部服务和内部服务。两者主要区别是:
- 外部服务:基于
Restful
风格的HTTP
协议,通过外网向外部提供服务,相对来说简单并且通用。 - 内部服务:基于
RPC
消息通信的TCP/IP
协议,提供内网服务与服务之间的调用,以达到减少带宽、降低延迟率、提高性能。
一些应用场景,尤其是内部服务需要高频地调用,就需要考虑是否需要改造为RPC
实现,来提高吞吐量和系统性能,比如说鉴权服务一类。
正文
简述
下载 spring-cloud-starter-thrift
并导入IDEA
开发环境,项目地址:https://github.com/ostenant/spring-cloud-starter-thrift
spring-cloud-starter-thrift
提供
Spring Cloud
对
可伸缩的
跨语言服务调用框架
Apache Thrift
的封装和集成。
spring-cloud-starter-thrift
包括客户端spring-cloud-starter-thrift-client
和服务端spring-cloud-starter-thrift-server
两个模块。而spring-cloud-starter-thrift-examples
子模块提供了3
个示例项目:calculator
、deposit
和test
。
- calculator:简单上手项目示例。
- deposit:复杂业务场景项目示例。
- test:性能测试项目示例。
服务端
- 支持
Apache Thrift
的各种原生线程服务模型,包括单线程阻塞模型(simple
)、单线程非阻塞模型(nonBlocking
)、线程池阻塞模型(threadPool
)、半同步半异步模型(hsHa
)和线程选择器模型(threadedSelector
)。 - 支持
Apache Thrift 0.10.0
版本后提供的多路复用处理器,提供服务的统一注册管理功能。 - 支持由服务签名 (服务
ID
+ 客户端Stub
接口名称 + 服务版本号) 唯一标识服务Stub
的具体实现类,支持服务版本的平滑升级。 - 支持
Server Group
形式的启动方式,每个服务实例可以开启多台Thrift Server
,通过不同的端口号暴露给客户端。
客户端
- 支持由服务签名 (服务
ID
+ 客户端Stub
接口名称 + 服务版本号) 唯一标识和调用服务端的Stub
具体实现类。 - 支持
Apache Thrift
的Transport
层的连接池管理,减少了客户端与服务端之间连接的频繁创建和销毁。 - 支持与
Spring Cloud Consul
的无缝集成,客户端通过心跳检测与服务注册中心Consul
保持连接,动态定时的刷新服务列表、监测服务的启用、关闭和健康状态。 - 支持客户端负载均衡,包括随机、轮询的负载均衡策略,客户端的
Thrift
程序通过本地的服务缓存列表实现调用的动态转发。
快速上手
项目结构:
- calculator
- calculator-client
- calculator-iface
- calculator-server
spring-cloud-starter-thrift
使用的是 0.10.0
版本的 thrift
。以calculator
项目入手,首先,通过 Thrift IDL
(接口描述语言) 编写客户端桩Stub
和服务端骨架Skeleton
,通过.thrift
文件定义接口规范。
首先进入 spring-cloud-starter-thrift
根目录,pom.xml
定义如下:
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.icekredit.rpc.thrift.examples</groupId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>calculator-client</module>
<module>calculator-server</module>
<module>calculator-iface</module>
</modules>
<artifactId>calculator</artifactId>
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Dalston.SR4</spring-cloud.version>
</properties>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
</plugin>
</plugins>
</build>
将项目打包并安装到本地Maven
仓库:
mvn clean install
Thrift IDL编写
namespace java com.icekredit.rpc.thrift.example
service CalculatorService {
i32 add(1: i32 arg1, 2: i32 arg2)
i32 subtract(1: i32 arg1, 2: i32 arg2)
i32 multiply(1: i32 arg1, 2: i32 arg2)
i32 division(1: i32 arg1, 2: i32 arg2)
}
下载并安装0.10.0
的 Thrift IDL
编译生成器,下载地址:http://thrift.apache.org/docs/install。通过编译器生成.java
的Stub
类文件。
thrift -gen java ./CalculatorService.thrift
编译器生成的CalculatorService.java
文件。CalculatorService.java
有成千上万行代码。对于开发人员而言,只需要关注以下四个核心接口/类:Iface
、AsyncIface
、Client
和AsyncClient
。
- Iface:服务端通过实现
HelloWorldService.Iface
接口,向客户端的提供具体的同步业务逻辑。 - AsyncIface:服务端