VIP_OSP--基于Thrift的RPC框架的基本原理
公司(VIP)从2015年开始在内部推动Venus框架的使用,开放服务平台(venus-osp)是一款基于Apache Thrift远程调用框架二次开发的高性能、高可扩展的、服务治理的RPC框架。服务端使用IDL进行服务的定义,客户端集成服务的SDK即可调用服务端的服务,开发简单,大部分的公共功能都在Proxy代理层工作,减轻了开发者的负担,使其只需要关注业务部分。下面是对该框架的基本原理的简单介绍。
参考文献:
1. Apache Thrift - 可伸缩的跨语言服务开发框架
2. 公司内部的Venux文档(内网文档,无法分享)
一、Thrift简介
Thrift采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,使用代码生成引擎可以在多种语言之中创建高效、无缝的服务,采用二进制格式进行数据的传输,相对于xml和json体积更小,对于高并发、大数据量的环境更有优势。
1. Hello World示例
Hello.thrift
namespace java service.demo
service Hello{
string helloString(1:string para)
i32 helloInt(1:i32 para)
bool helloBoolean(1:bool para)
void helloVoid()
string helloNull()
}
这段IDL定义了服务的名称和五个方法,Thrift是对IDL的一种具体实现,使用Thrift的工具编译该idl文件,就会生成相应的Hello.java文件。该文件包含了在Hello.thrift文件中描述的服务Hello的接口定义,即Hello.Iface接口,以及服务调用的底层通信细节,包括客户端的调用逻辑Hello.Client以及服务端的处理逻辑Hello.Processor,用于构建客户端和服务端的功能。
创建HelloServiceImpl.java文件并实现Hello.java文件中的Hello.Iface接口,代码:
package service.demo;
import org.apache.thrift.TException;
public class HelloServiceImpl implements Hello.Iface {
public boolean helloBoolean(boolean para) throws TException {
return para;
}
public int helloInt(int para) throws TException {
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return para;
}
public String helloNull() throws TException {
return null;
}
public String helloString(String para) throws TException {
return para;
}
public void helloVoid() throws TException {
System.out.println("Hello World");
}
}
Thrift架构
架构图如下:
图中黄色部分是用户的业务代码,褐色部分是编译工具生成的代码框架,紫色部分和蓝色部分是我们所选择的传输层和传输协议。
Thrift服务器包含用于绑定协议和传输层的基础架构,它提供阻塞、非阻塞、单线程和多线程的模式运行在服务器上。
2.传输协议
Thrift可以让用户选择客户端和服务端之间的传输通信协议的类别,分为文本(text)和二进制(binary)。
TBinaryProtocol:二进制编码格式进行数据传输
TCompactProtocol:高效率的密集的二进制编码协议
TJSONProtocol:使用Json的数据编码协议
TSimpleJSONProtocol:只提供Json读写的协议,适用于脚本语言解析
3.传输层
TSocket:使用阻塞式IO进行传输
TFramedTransport:非阻塞方式,按块的大小进行传输,类似NIO;服务器必须为非阻塞的服务类型
TNonblockingTransport:非阻塞模式,用于构建异步客户端
4.服务端类型
TSimpleServer:单线程服务器,阻塞IO
TThreadPoolServer:多线程服务器,阻塞式IO
TNonblockingServer:多线程服务器,非阻塞IO
二、Venus的配置中心
配置中心实现了集中配置、主动推送、规范配置、配置可读等优点。