在 Spring Boot 中使用 gRPC 进行通讯(一)

在 Spring Boot 项目的开发中,编写服务不止可以使用 Rest API 的形式,也可以使用基于 Grpc 的方式。

gRPC是由Google主导开发的RPC框架,默认使用HTTP/2协议并使用ProtoBuf进行序列化。与通常的 Rest API相比,主要的特点是:

  1. 性能更好。
  2. 支持双向通讯。

缺点主要是编程相对复杂很多。

本文以一个简单的示例来说明如何在 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:${protobuf.version}:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${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 定义语言定义了服务接口

生成并打包

在项目命令行中执行:

1
mvn install

通过在 pom.xml 中定义的插件: protobuf-maven-plugin, maven会完成将 protobuf 定义的接口生成对应的 java 文件,并完成编译,打包的工作。

下一步

在下一步,我们将定义 gRPC 的服务端

本文标题:在 Spring Boot 中使用 gRPC 进行通讯(一)

文章作者:晨星

发布时间:2019年12月31日 - 16:12

最后更新:2020年09月16日 - 08:09

原始链接:https://www.mls-tech.info/java/springboot-use-grpc/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。