这是我参与「第四届青训营 」笔记创作活动的第2天。
流计算项目的实现需要用到 RPC 技术,在队长的引领下,小组成员进行了rpc、thrift、netty、akka 等的学习。下面是我个人对 rpc 和 thrift 的一些学习笔记。
RPC
RPC 是什么
分布式系统涉及多个节点,节点和节点之间通过消息传递进行通信和协作,因此节点之间的通信是重要环节。
远程过程调用(RPC,Remote Produce Call)是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。是分布式系统中的一个重要通信技术。
RPC 将过程调用的通用编程抽象扩展到了分布式环境,使得节点可以像调用本地过程那样去调用远程结点上的过程。对于调用者,它感知不到远程调用的过程,是透明的。
RPC 只一种设计,具体的实现中可以结合多种协议实现,如HTTP,TCP,UDP等。
RPC 的示例
基于Python Socket 实现一个最基础的 RPC 框架。参考: 使用Python实现RPC框架
-
请求-应答协议:具有两个节点,客户端和服务端(项目中用两个进程模拟)。服务端等待着请求的到来。当客户端调用函数时,RPC模块向服务端发起请求。服务端接收请求、执行函数和返回结果。
-
过程调用:如定义了sum(float a, float b)的加法过程,客户端调用 sum(1, 2) 时,其本地并没有sum这个函数。
此时将通过RPC 机制将函数名、函数参数等传递给服务端,服务端执行并获得了 sum result=3,再将结果返回给客户端。
-
存根过程:负责消息的序列化、反序列化。
-
跨语言:客户端和服务端可以使用不同的编程语言实现。
thrift 基础
thrift 简介
Thrift 是一个成熟的 RPC 框架,能很方便的进行可扩展且跨语言的服务的开发。
thrift 允许通过一个简单的定义文件中的数据类型和服务接口,以作为输入文件,编译器生成代码用来方便地生成 RPC 客户端和服务器通信的无缝跨编程语言。
thrift 入门
上手参考:# 一步步完成thrift rpc示例
使用的主要流程如下:
- 下载thrift编译器,这里直接下载windows 版本。# thrift 下载
- 写.thrift文件,定义传输的数据对象和提供的具体服务 比如写一个hello.thrift,提供的服务是服务端会获取客户端传输过来的 name,并打印出来:
namespace java com.tutorial.thrift.service
service GreetingService {
string sayHello(1:string name)
}
-
运行编译命令:thrift --gen ;自动生成该语言对应的接口文件。 比如 windows版本的 thrift 生成 java 文件:
thrift-0.10.0.exe -gen java hello.thrift -
将 java 文件放入自己的项目中,服务端和客户端的项目都需要放入。
-
服务端 Service 需要实现服务的具体方法:
-
服务端 Server 需要定义 Transport, Protocol, Processor, 启动服务端和关联服务方法
-
客户端 Clinet 创建 transport 连接客户端,并调用RPC 服务接口提供的方法。
-
添加依赖,编译项目,启动 Server, 再运行 Client 端代码,实现客户端 Clinet 到 Server 的 name 数据传递。