之前我们团队在 Go 语言上已经统一使用 gRPC + grpc-gateway 来提供 API 服务,最近为了写一个提供一个用于管理分析任务的接口服务,需要使用 Java 来实现(因为需要访问 HBase/HDFS/Flink等,Java 最方便),而 GRPC Gateway 本身是跟语言无关的,所以我就趁着这次机会尝试了一把,发现效果还挺好的
需要了解的基础Protocol buffers 用来序列化数据的框架
gRPC 基于 Protobuff 的 RPC 框架
grpc-gateway 是一个 protoc 的插件,会读取 gRPC 的 proto 定义,然后生成一个把 RESTful 的 API 转换成 gRPC
grpc-gateway 的一些细节
从原理图可知,通过 grpc-gateway 提供的工具,可以生成一个 gateway, gateway 接收 HTTP 请求, 然后把请求再转换成 gRPC 的请求发给 gRPC Server,从 Server 收到响应之后,再将 gRPC 的响应转换为 HTTP 响应返回给客户端
不论 gRPC Server 是通过何种语言实现的,通过 grpc-gateway 都可以实现 HTTP 的方式来访问接口服务
实现
项目组成
dota2-bristleback-job-mgr,是基于 Java + gRPC 提供 RPC 的接口服务
用到的 grpc mvn 插件是 org.xolstice.maven.plugins.protobuf-maven-plugin(这个插件只支持指定一个目录来生成 protobuf/gRPC 的文件,可以用 com.github.os72.prot