近期学习 grpc-java,从 demo 入手,进行学习
grpc 的基础知识暂不整理,后续有时间再整理一波,这一篇主要是记录一个简单的 grpc 使用 springboot 创建的 demo。
我整个 demo 分成三个 Project :
- grpc-springboot-demo-api:用于存放 proto 文件,生成Java 代码
- grpc-springboot-demo-server:服务端代码
- grpc-springboot-demo-consumer:客户端代码
demo-api(proto)
创建一个最简单的 proto 文件,请求跟相应都只包含一个 String 的对象。
syntax = "proto3";
option java_package = "grpc.springboot.demo.api";
option java_outer_classname = "HelloWorldService";
package helloworld;
// 定义服务
service HelloWorld {
rpc SayHello (HelloRequest) returns (HelloResponse) {}
}
// 定义请求体
message HelloRequest {
string message = 1;
}
// 定义相应内容
message HelloResponse {
string message = 1;
}
文件创建好之后,需要进行编译,pom文件中需要引入相关插件:
<?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>com.parallelline1996</groupId>
<artifactId>grpc-springboot-demo-api</artifactId>
<version>1.0.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-all</artifactId>
<version>1.12.0</version>
</dependency>
</dependencies>
<build>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.4.1.Final</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.0</version>
<configuration>
<protocArtifact>com.google.protobuf:protoc:3.0.0:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.0.0:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>6</source>
<target>6</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
完成后,直接通过 maven 工具的 install 指令,推到本地仓库即可,构建时,便会自动生成我们需要的类。
demo-server
服务端项目的目录结构:
- Starter:springboot 的启动类
- GrpcServerConfiguration:grpc 服务端的启动类
- HelloServerImpl:提供服务的实现类
首先 pom 文件,主要是导入 springboot 的启动的依赖,以及 grpc 的依赖,以及我们上面的 api 项目。
<?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>com.parallelline1996</groupId>
<artifactId>grpc-springboot-demo-server</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.parallelline1996</groupId>
<artifactId>grpc-springboot-demo-api</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- spring boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-all</artifactId>
<version>1.28.1</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.0-jre</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.21.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
Starter 启动类:
@SpringBootApplication
public class Starter implements CommandLineRunner {
private GrpcServerConfiguration configuration;
public Starter(GrpcServerConfiguration configuration) {
this.configuration = configuration;
}
// 启动 grpc 服务端
@Override
public void run(String... args) throws Exception {
configuration.start();
}
// 启动 springboot 容器
public static void main(String[] args) {
SpringApplication.run(Starter.class, args);
}
}
GrpcServerConfiguration grpc 服务端启动类:
这里注意:如果不在创建 Server 指定线程池,则会使用 grpc-java 中提供的默认线程池响应从客户端发送的请求(后续关于 Server 的创建,会再写博客说明)。也可以直接指定线程池,只需调用 ServerBuilder.executor(executor)
即可。
@Component
public class GrpcServerConfiguration {
private static final Logger logger