1. GRPC简介
RPC 全称是 Remote Procedure Call,中文一般译作远程过程调用。RPC 是一种进程间的通信模式,程序分布在不同的地址空间里。简单来说,就是两个进程之间互相调用的一种方式。
gRPC 则是 Google 开源的 RPC 框架,它是一个高性能远程过程调用 (RPC) 框架,可以在任何环境中运行。gRPC 通过对负载均衡、跟踪、健康检查和身份验证的可插拔支持,有效地连接数据中心内和数据中心之间的服务。
在 gRPC 中,客户端应用程序可以直接调用部署在不同机器上的服务端应用程序中的方法,就好像它是本地对象一样,使用 gRPC 可以更容易地创建分布式应用程序和服务。
与许多 RPC 系统一样,gRPC 基于定义服务的思想,指定基于参数和返回类型远程调用的方法。在服务端侧,服务端实现接口,运行 gRPC 服务,处理客户端调用。在客户端侧,客户端拥有存根(Stub,在某些语言中称为客户端),它提供与服务端相同的方法。
因此,我们可以轻松地用 Java 创建 gRPC 服务端,也可以使用 Go、Python 或 Ruby 其他语言创建客户端。
2. idgenerator 模块
模块地址:https://github.com/makemyownlife/shardingsphere-jdbc-demo/idgenerator
1、idgenerator-proto:定义 grpc proto 文件,通过插件将 proto 文件自动转为对应的 Java 类。
2、idgenerator-server:grpc 服务端 ,实现了 grpc 接口。
3. idgenerator-proto
模块 pom 文件,首先引入项目依赖:
配置好依赖之后,还需要添加 grpc 编译插件,该插件可以将 proto 文件自动转为对应的 Java 类。
在配置文件中,我们需要指定了 proto 根目录、生成 Java 文件目录。
我们编写 grpc 描述文件 service.proto 。
这个文件定义了一个用于生成唯一 ID 的服务 IdGeneratorService,包含一个 RPC 方法 getSeqId,客户端可以向该服务发送 IdRequest 消息来请求生成唯一 ID,并得到 IdResult 消息作为响应,其中包含生成的 ID、操作结果的 code 和 message 等信息。
生成的 Java 代码将会按照指定的包名和类名进行组织和命名。
有个细节需要注意的是:
message 中定义的属性的时候,都会给一个数字,例如 id=1,name=2 等,这个数字将来会在二进制消息中标识我们的字段,并且一旦我们的消息类型被使用就不应更改,这个有点像序列化的感觉。
这个 message 编译后的字节内容大概像下面这样:
定义完成之后,我们就需要使用插件来生成对应的 Java 代码了,如下图:
注意,compile 和 compile-custom 两个指令都需要执行。其中 compile 用来编译消息对象,compile-custom 则依赖消息对象,生成接口服务。
执行完这两个指令之后,生成的代码如下图:
4. idgenerator-server
服务端模块依赖 idgenerator-proto 模块,需要实现 rpc 接口 :
1、rpc 接口实现 IdGeneratorGprcImpl
2、GRPC 服务 GrpcServer
最后,我们写一个客户端来测试 GRPC 接口是否连通 :
我们启动服务端,然后执行 ClientTest ,效果见下图: