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

相关推荐
nlog3n4 分钟前
Java外观模式详解
java·开发语言·外观模式
Mryan200524 分钟前
SpringBoot项目报错: 缺少 Validation
java·spring boot
SnXJi_1 小时前
开源赋能,双驱协同:纷析云财务与进销存软件助力企业数字化转型
java·gitee·开源·开源软件
eternal__day1 小时前
第三期:深入理解 Spring Web MVC [特殊字符](数据传参+ 特殊字符处理 + 编码问题解析)
java·前端·spring·java-ee·mvc
iccb10131 小时前
在线聊天系统中的多窗口数据同步技术解密
java·github
逸狼2 小时前
【JavaEE进阶】MyBatis(5)-MyBatis-plus
java·开发语言
Aphelios3802 小时前
Java全栈面试宝典:线程协作与Spring Bean管理深度解析
java·开发语言·jvm·spring·面试·职场和发展
努力学习的小廉2 小时前
【C++11(中)】—— 我与C++的不解之缘(三十一)
android·java·c++
佬乔2 小时前
xml中配置AOP织入
java·服务器·前端
Eugene__Chen3 小时前
JavaWeb开发基础知识-XML和JSON
java·开发语言·前端