在 Spring Boot 项目的开发中,编写服务不止可以使用 Rest API 的形式,也可以使用基于 Grpc 的方式。
gRPC是由Google主导开发的RPC框架,默认使用HTTP/2协议并使用ProtoBuf进行序列化。与通常的 Rest API相比,主要的特点是:
- 性能更好。
- 支持双向通讯。
缺点主要是编程相对复杂很多。
本文以一个简单的示例来说明如何在 Spring Boot 项目中使用 grpc, 使用了 grpc-spring-boot-starter库(官网),
建立服务接口项目
在 grpc 中,使用 protobuf 作为描述语言来定义接口。 接口定义是语言无关的,但在具体语言调用是,需要编译为特定语言的实现。
建立一个简单的 maven 项目:
groupId: cn.com.hohistar.spbt
artifactId: account-grpc-intf
编辑 pom.xml 文件,加入 grpc 的支持,编辑后的 pom.xml 文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>cn.com.hohistar.spbt</groupId> <artifactId>account-grpc-intf</artifactId> <version>1.0-SNAPSHOT</version>
<properties> <protobuf.version>3.11.0</protobuf.version> <grpc.version>1.25.0</grpc.version> </properties>
<dependencies> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-stub</artifactId> <version>1.22.1</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> <version>1.26.0</version> </dependency> </dependencies>
<build> <extensions> <extension> <groupId>kr.motd.maven</groupId> <artifactId>os-maven-plugin</artifactId> </extension> </extensions>
<plugins> <plugin> <groupId>org.xolstice.maven.plugins</groupId> <artifactId>protobuf-maven-plugin</artifactId> <configuration> <protocArtifact>com.google.protobuf:protoc:#123;protobuf.version}:exe:#123;os.detected.classifier}</protocArtifact> <pluginId>grpc-java</pluginId> <pluginArtifact>io.grpc:protoc-gen-grpc-java:#123;grpc.version}:exe:#123;os.detected.classifier}</pluginArtifact> </configuration> <executions> <execution> <goals> <goal>compile</goal> <goal>compile-custom</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
|
定义接口
在 src/main 中新建一个名为 proto 的目录,用来放置接口定义文件。然后在 proto 目录中新建名为 account_service.proto 的文件,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| syntax = "proto3";
package cn.com.hohistar.spbt.grpc;
option java_multiple_files = true; option java_package = "cn.com.hohistar.spbt.grpc"; option java_outer_classname = "AccountSrvProto";
message AccountHistoryRequest {
string prod = 1; int32 orderId = 2; int32 count = 3; }
message AccountHistoryResponse {
string result = 1; }
service AccountHistoryService {
rpc handleOrder (AccountHistoryRequest) returns (AccountHistoryResponse) { } }
|
我们使用 protobuf 定义语言定义了服务接口
生成并打包
在项目命令行中执行:
通过在 pom.xml 中定义的插件: protobuf-maven-plugin, maven会完成将 protobuf 定义的接口生成对应的 java 文件,并完成编译,打包的工作。
下一步
在下一步,我们将定义 gRPC 的服务端