gRPC-集成Springboot

定义服务接口

复制代码
syntax = "proto3";
 
option java_multiple_files = true;
option java_package = "com.github.xjs.grpcapi";
option java_outer_classname = "ProductProto";
 
package product;
 
service ProductInfo {
  rpc getProduct(ProductId) returns(Product);
}
 
message Product {
  string id = 1;
  string name=2;
  string description=3;
  float price=4;
}
 
message ProductId {
  string value = 1;
}

服务端

首先添加相关依赖:

xml 复制代码
<dependency>
	<groupId>net.devh</groupId>
	<artifactId>grpc-server-spring-boot-starter</artifactId>
	<version>2.15.0.RELEASE</version>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

添加相关的配置

yml 复制代码
server:
  port: 8080
spring:
  application:
    # 这个名字很重要,客户端调用的时候需要指定这个名字
    name: product-service
grpc:
  server:
    port: 9090

服务端service代码:

java 复制代码
@GrpcService
public class ProductInfoImpl extends ProductInfoGrpc.ProductInfoImplBase {
    @Override
    public void getProduct(ProductId request, StreamObserver<Product> responseObserver) {
        System.out.println(TextFormat.printer().escapingNonAscii(false).printToString(request));
        Product product = Product.newBuilder().setId(request.getValue()).setName("三国演义").build();
        responseObserver.onNext(product);
        responseObserver.onCompleted();
    }
}

客户端

添加依赖

xml 复制代码
<dependency>
	<groupId>net.devh</groupId>
	<artifactId>grpc-client-spring-boot-starter</artifactId>
	<version>2.15.0.RELEASE</version>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

添加配置

yml 复制代码
server:
  port: 8081
spring:
  application:
    name: product-client-service
grpc:
  client:
    # #服务名称不能写错,这个需要和server端spring.application.name的定义的名称一致
    product-service:
      address: "static://localhost:9090"
      # 是否开启保持连接(长连接)
      enableKeepAlive: true
      # 保持连接时长(默认20s)
      keepAliveTimeout: 20s
      # 没有RPC调用时是否保持连接(默认false,可禁用避免额外消耗CPU)
      keepAliveWithoutCalls: false
      # 客户端负载均衡策略(round_robin(默认), pick_first)
      defaultLoadBalancingPolicy: round_robin
      # 通信类型
      # plaintext      | plaintext_upgrade           | tls
      # 明文通信且http/2 | 明文通信且升级http/1.1为http/2 | 使用TLS(ALPN/NPN)通信
      negotiationType: plaintext

客户端调用:

java 复制代码
@RestController
public class ProductController {

    // 这个名字是远程要调用的服务的名字,跟配置文件要对应起来
    @GrpcClient("product-service")
    private ProductInfoGrpc.ProductInfoBlockingStub stub;

    @GetMapping("/getProductById")
    public ProductDTO getProductById(Long id){
        ProductId productId = ProductId.newBuilder().setValue(""+id).build();
        Product product = stub.getProduct(productId);
        return ProductDTO.of(product);
    }
}

完整的源码下载:https://github.com/xjs1919/learning-demo/tree/master/grpc-demo

相关推荐
学长毕设19 分钟前
基于springboot的食品仓库管理系统
java·spring boot·后端
步行cgn1 小时前
FormHttpMessageConverter 详解:Spring MVC 中表单数据的读写转换器
java·spring·mvc
龙亘川1 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
金銀銅鐵1 小时前
[Java] 用 CLI 展示 EnumMap 增删键值对时的内部变化
java·源码·ai编程
秋天的怀念_David1 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Raas1002 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
niucloud-admin2 小时前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
霸道流氓气质3 小时前
智能客服组件:分层意图识别、RAG Advisor 与人工转接状态机的 Vue3 + Spring AI 生产级实战
java·人工智能·spring
captain3763 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
心中有你02144 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法