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

相关推荐
cyforkk30 分钟前
12、Java 基础硬核复习:集合框架(数据容器)的核心逻辑与面试考点
java·开发语言·面试
身如柳絮随风扬5 小时前
Java中的CAS机制详解
java·开发语言
风筝在晴天搁浅7 小时前
hot100 78.子集
java·算法
故事和你918 小时前
sdut-Java面向对象-06 继承和多态、抽象类和接口(函数题:10-18题)
java·开发语言·算法·面向对象·基础语法·继承和多态·抽象类和接口
Configure-Handler8 小时前
buildroot System configuration
java·服务器·数据库
:Concerto9 小时前
JavaSE 注解
java·开发语言·sprint
电商API_180079052479 小时前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫
一点程序10 小时前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
C雨后彩虹10 小时前
计算疫情扩散时间
java·数据结构·算法·华为·面试
2601_9498095910 小时前
flutter_for_openharmony家庭相册app实战+我的Tab实现
java·javascript·flutter