🎉🎉《Spring Boot实战案例合集》目前已更新149个案例,我们将持续不断的更新。文末有电子书目录。
💪💪永久更新承诺
我们郑重承诺,所有订阅合集的粉丝都将享受永久免费的后续更新服务。
💌💌如何获取
订阅我们的合集《点我订阅》,并通过私信联系我们,我们将第一时间将电子书发送给您。
环境:SpringBoot3.4.2
1. 简介
什么是gRPC?
gRPC 是一个现代化的开源高性能远程过程调用(RPC)框架,可在任何环境中运行。它能够通过可插拔的负载均衡、追踪、健康检查和认证支持,高效地连接数据中心内部和跨数据中心的服务。同时,它也适用于分布式计算的“最后一公里”,用于连接设备、移动应用和浏览器与后端服务。
Spring gRPC
Spring gRPC 项目为开发 gRPC 应用程序提供了一个与 Spring 生态兼容的 API 和抽象层。该项目包含一个核心库,它使得在 gRPC 中使用依赖注入变得轻而易举,此外还有一个 Spring Boot 启动器(starter),它能让你轻松地在 Spring Boot 应用程序中开始使用 gRPC。
接下来,我们将通过Spring gRPC详细的实现一个RPC调用。
2.1 准备依赖
<dependency><groupId>io.grpc</groupId><artifactId>grpc-services</artifactId></dependency><dependency><groupId>org.springframework.grpc</groupId><artifactId>spring-grpc-server-web-spring-boot-starter</artifactId></dependency>
同时,我们还需要配置build,这样我们可以直接通过proto文件生成对应的java文件
<build><extensions><extension><groupId>kr.motd.maven</groupId><artifactId>os-maven-plugin</artifactId><version>1.7.1</version></extension></extensions><plugins><plugin><groupId>org.graalvm.buildtools</groupId><artifactId>native-maven-plugin</artifactId><configuration><buildArgs><buildArg>--verbose</buildArg></buildArgs></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-deploy-plugin</artifactId><configuration><skip>true</skip></configuration></plugin><plugin><groupId>io.spring.javaformat</groupId><artifactId>spring-javaformat-maven-plugin</artifactId><version>${spring-javaformat-maven-plugin.version}</version><executions><execution><phase>validate</phase><inherited>true</inherited><goals><goal>validate</goal></goals></execution></executions></plugin><plugin><groupId>io.github.ascopes</groupId><artifactId>protobuf-maven-plugin</artifactId><version>3.1.2</version><configuration><protocVersion>${protobuf-java.version}</protocVersion><binaryMavenPlugins><binaryMavenPlugin><groupId>io.grpc</groupId><artifactId>protoc-gen-grpc-java</artifactId><version>${grpc.version}</version><classifier>${os.detected.classifier}</classifier><options>jakarta_omit,@generated=omit</options></binaryMavenPlugin></binaryMavenPlugins><outputDirectory>src/main/java</outputDirectory></configuration><executions><execution><goals><goal>generate</goal></goals></execution></executions></plugin></plugins></build>
2.2 编写proto文件
在src/main/protobuf目录下新建hello.proto文件,内容如下:
syntax = "proto3";option java_multiple_files = true;option java_package = "com.pack.grpc.proto";option java_outer_classname = "HelloWorldProto";// 定义服务service Simple {// 发生消息rpc SayHello(HelloRequest) returns (HelloReply) {}rpc StreamHello(HelloRequest) returns (stream HelloReply) {}}// 请求消息message HelloRequest {string name = 1;}// 响应消息message HelloReply {string message = 1;}
2.3 根据proto生成java文件
接下来,我们需要在项目的根目录下执行如下的命令:
mvnw clean package
执行完成后,将生成的java文件保存到 src/main/java下的com.pack.grpc.proto包中,如下所示:
2.4 定义gRPC服务
public class GrpcServerService extends SimpleGrpc.SimpleImplBase {private static Logger log = LoggerFactory.getLogger(GrpcServerService.class);public void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) {log.info("Hello, {}", req.getName());if (req.getName().startsWith("error")) {throw new IllegalArgumentException("Bad name: " + req.getName());}if (req.getName().startsWith("internal")) {throw new RuntimeException();}HelloReply reply = HelloReply.newBuilder().setMessage("Hello ==> " + req.getName()).build();responseObserver.onNext(reply);responseObserver.onCompleted();}public void streamHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) {log.info("Hello, {}", req.getName());int count = 0;while (count < 10) {HelloReply reply = HelloReply.newBuilder().setMessage("Hello(" + count + ") ==> " + req.getName()).build();responseObserver.onNext(reply);count++;try {Thread.sleep(1000L);} catch (InterruptedException e) {Thread.currentThread().interrupt();responseObserver.onError(e);return;}}responseObserver.onCompleted();}}
下面配置该服务地址信息:
spring:grpc:server:host: 0.0.0.0port: 9090ssl:secure: falseenabled: falseservlet:enabled: false
通过上面的配置,我们的gRPC服务将运行在9090端口上。
2.5 定义gRPC客户端
客户端导入上面通过proto生成java文件后,我们只需要定义如下的bean即可:
public class GRpcConfig {SimpleGrpc.SimpleBlockingStub stub(GrpcChannelFactory channels) {//return SimpleGrpc.newBlockingStub(channels.createChannel("0.0.0.0:9090"));//也可以通过命名通道方式return SimpleGrpc.newBlockingStub(channels.createChannel("local"));}}
接下来,还需要在配置文件中进行如下配置:
spring:grpc:client:default-channel:secure: falsessl:enabled: falsechannels:local:address: 0.0.0.0:9090
以上我们就完成了gRPC server/client所有代码。
2.6 测试
在客户端,我们只需要注入上面定义的:SimpleGrpc.SimpleBlockingStub bean就可以使用了。
public class GrpcController {private final SimpleGrpc.SimpleBlockingStub stub;public GrpcController(SimpleBlockingStub stub) {this.stub = stub;}public ResponseEntity<?> invoke(String message) throws Exception {HelloRequest request = HelloRequest.newBuilder().setName(message).build();return ResponseEntity.ok(stub.sayHello(request).getMessage());}}
输出结果
成功!!!
推荐文章
在Spring Boot中具有多个实现的接口正确注入的6种方式
基于 Spring Boot 玩转JPA各种锁的应用(乐观锁,悲观锁)
Spring Boot 零侵入慢SQL监控,支持JDBC/JPA/MyBatis
优雅!Spring Boot 一个注解轻松实现敏感词检查,支持多场景
性能排名第一的模板引擎 JTE 在 Spring Boot 中的应用
请不要自己写!Spring Boot 一个注解搞定逻辑删除,支持JPA/MyBatis
新选择!基于Spring Boot监听MySQL日志Binlog实现数据实时同步
绝了!Spring Boot凭@JsonView注解,强大到逆天


