RPC( Remote Procedure Call ) 远程调用过程。
1. 定义了一个接口文件,描述了对象,对象成员,接口方法等一系列信息。
2.通过RPC 框架提供的编译器,将接口说明文件编译成对应的语言文件。
2. 在客户端和服务端分别引用 RPC 编译器生成的文件,即可像调用本地方法一样远程调用。
RPC 通信过程如下:
1. 客户端以正常方式调用客户桩(client stub)
2. 客户桩生成一个消息,然后调用本地操作系统。
3. 客户端操作系统将消息发送给原程操作系统。
4. 远程操作系统将消息交给服务器桩
5. 服务器桩将参数提取出来,然后调用服务过程
6. 服务器执行要求的操作,操作完成后将结果返回给服务器桩,
7. 服务器桩将结果打包成一个消息, 然后调用本地操作系统。
8. 服务器操作系统将含有结果的消息发送给客户端操作系统
9. 客户端操作系统将消息交给客户桩
10. 客户桩将结果提取出来,返回给他的调用方
Thrift 作用于各个服务之间的 RPC 通信,支持跨语言,thrift 是一个典型的 CS 框架,客户端服务端可以使用不同的语言开发, thrift 通过 IDL (Interface Description Language) 来关联客户端和服务器。
在这里插入图片描述
在这里插入图片描述
代表 thrift 客户端和服务端之间的传输数据的协议,指的是客户端和服务端传输数据的格式,比如 Json, thrift 中有如下格式:
Thrift 支持的 Server 模型
thrift 支持 struct 类型,可以将一些数据类型聚合到一块。
struct People {
1:string name;
2:i32 age;
3:string gender;
}
thrift 支持枚举类型
enum Gender {
MALE,
FEMALE
}
thrift 支持异常类型
exception RequestException {
1:i32 code;
2:string reason;
}
thrift 定义 Service. 格式如下:
service HelloWorldService {
// service中可以定义若干个服务,相当于Java Interface中定义的方法
string doAction(1:string name, 2:i32 age);
}
thrift 支持给类型定义别名
typedef i32 int
typedef i64 long
thrift. 支持常量的定义
const i32 MAX_RETRIES_TIME = 10;
const string MY_WEBSITE = "http://facebook.com";
thrift 支持命名空间,相当于 Java 中的package.
namespace java com.test.thrift.demo
#、//、/**/都可以作为thrift文件中的注释。
thrift提供两个关键字required和optional,分别用于表示对应的字段是必填的还是可选的(推荐尽量使用optional),如下
struct People {
1:required string name;
2:optional i32 age;
}
thrift也支持文件包含,相当于CPP中的include,Java中的import,使用关键字include:
include "global.thrift"
// data.thrift
namespace java thrift.generated
namespace py py.thrift.generated
typedef i16 short
typedef i32 int
typedef i64 long
typedef bool boolean
typedef string String
// struct关键字用于定义结构体,相当于面向对象编程语言中的类
struct Person {
// 相当于定义类中的成员,并生成相应的get和set方法,optional表示username这个成员可以没有
1: optional String username,
2: optional int age,
3: optional boolean married
}
// 定义一个异常类型,用于接口中可能抛出的异常
exception DataException {
1: optional String message,
2: optional String callStack,
3: optional String date
}
// 定义服务接口
service PersonService {
Person getPersonByUsername(1: required String username) throws (1: DataException data),
void savePerson(1: required Person person)
}
执行 thrift --gen java src/thrift/data.thrift 生成代码.
thrift 如何安装,可参考 https://wangxiaoming.blog.csdn.net/article/details/114317905
客户端可以像调用本地的方法一样调用服务端的方法
生成代码结构如下:
微信号:程序员开发者社区
博客:CSDN 王小明
关注我们,了解更多