大数跨境
0
0

高性能!Spring 官方支持 gRPC,三行代码搞定

高性能!Spring 官方支持 gRPC,三行代码搞定 Spring全家桶实战案例
2025-07-28
0
导读:炸裂!Spring 官方支持 gRPC,三行代码直接封神
Spring Boot 3实战案例锦集PDF电子书已更新至130篇!

🎉🎉《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.实战案例

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>          <?m2e ignore?>          <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>          <?m2e execute onConfiguration,onIncremental?>          <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服务

@Servicepublic class GrpcServerService extends SimpleGrpc.SimpleImplBase {  private static Logger log = LoggerFactory.getLogger(GrpcServerService.class);  @Override  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();  }  @Override  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:      host0.0.0.0      port9090      ssl:        securefalse        enabledfalse      servlet:        enabledfalse

通过上面的配置,我们的gRPC服务将运行在9090端口上。

2.5 定义gRPC客户端

客户端导入上面通过proto生成java文件后,我们只需要定义如下的bean即可:

@Configurationpublic class GRpcConfig {  @Bean  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: false        ssl:          enabled: false      channels:        local:          address: 0.0.0.0:9090

以上我们就完成了gRPC server/client所有代码。

2.6 测试

在客户端,我们只需要注入上面定义的:SimpleGrpc.SimpleBlockingStub bean就可以使用了。

@RestController@RequestMapping("/grpc")public class GrpcController {  private final SimpleGrpc.SimpleBlockingStub stub;  public GrpcController(SimpleBlockingStub stub) {    this.stub = stub;  }  @GetMapping("/invoke")  public ResponseEntity<?> invoke(String message) throws Exception {    HelloRequest request = HelloRequest.newBuilder()        .setName(message)        .build();    return ResponseEntity.ok(stub.sayHello(request).getMessage());  }}

输出结果

成功!!!


以上是本篇文章的全部内容,如对你有帮助帮忙点赞+转发+收藏

推荐文章

自己动手实现精简版SpringBoot原来如此简单

在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注解,强大到逆天

强大!Spring Boot全新模块化管理方式

Java异步编程7种实现方法,最后一种非常强大

【声明】内容源于网络
0
0
Spring全家桶实战案例
Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
内容 832
粉丝 0
Spring全家桶实战案例 Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
总阅读38
粉丝0
内容832