Springboot集成GRPC

Springboot集成GRPC

一、springboot版本

java 复制代码
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>

二、GRPC的pom依赖

2.1 服务端

xml 复制代码
        <grpc.version>1.51.0</grpc.version>

 <dependencies>
            <!-- gRPC 依赖 -->
            <dependency>
                <groupId>io.grpc</groupId>
                <artifactId>grpc-netty-shaded</artifactId>
                <version>${grpc.version}</version>
            </dependency>
            <dependency>
                <groupId>io.grpc</groupId>
                <artifactId>grpc-core</artifactId>
                <version>${grpc.version}</version>
            </dependency>
            <dependency>
                <groupId>io.grpc</groupId>
                <artifactId>grpc-api</artifactId>
                <version>${grpc.version}</version>
            </dependency>
            <dependency>
                <groupId>io.grpc</groupId>
                <artifactId>grpc-protobuf</artifactId>
                <version>${grpc.version}</version>
            </dependency>
            <dependency>
                <groupId>io.grpc</groupId>
                <artifactId>grpc-stub</artifactId>
                <version>${grpc.version}</version>
            </dependency>
            <dependency>
                <groupId>net.devh</groupId>
                <artifactId>grpc-server-spring-boot-starter</artifactId>
                <version>2.14.0.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>com.google.protobuf</groupId>
                <artifactId>protobuf-bom</artifactId>
                <version>3.21.9</version>
                <type>pom</type>
            </dependency>
            <dependency>
                <groupId>com.google.protobuf</groupId>
                <artifactId>protobuf-java</artifactId>
                <version>3.21.9</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/com.google.protobuf/protoc -->
            <dependency>
                <groupId>com.google.protobuf</groupId>
                <artifactId>protoc</artifactId>
                <version>3.21.9</version>
                <type>pom</type>
            </dependency>
   </dependencies>

2.2 客户端

xml 复制代码
        <grpc.version>1.51.0</grpc.version>

 <dependencies>
            <!-- gRPC 依赖 -->
            <dependency>
                <groupId>io.grpc</groupId>
                <artifactId>grpc-netty-shaded</artifactId>
                <version>${grpc.version}</version>
            </dependency>
            <dependency>
                <groupId>io.grpc</groupId>
                <artifactId>grpc-core</artifactId>
                <version>${grpc.version}</version>
            </dependency>
            <dependency>
                <groupId>io.grpc</groupId>
                <artifactId>grpc-api</artifactId>
                <version>${grpc.version}</version>
            </dependency>
            <dependency>
                <groupId>io.grpc</groupId>
                <artifactId>grpc-protobuf</artifactId>
                <version>${grpc.version}</version>
            </dependency>
            <dependency>
                <groupId>io.grpc</groupId>
                <artifactId>grpc-stub</artifactId>
                <version>${grpc.version}</version>
            </dependency>
            <!-- grpc 客户端 -->
            <dependency>
                <groupId>net.devh</groupId>
                <artifactId>grpc-client-spring-boot-starter</artifactId>
                <version>2.14.0.RELEASE</version>
            </dependency>

            <dependency>
                <groupId>com.google.protobuf</groupId>
                <artifactId>protobuf-bom</artifactId>
                <version>3.21.9</version>
                <type>pom</type>
            </dependency>
            <dependency>
                <groupId>com.google.protobuf</groupId>
                <artifactId>protobuf-java</artifactId>
                <version>3.21.9</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/com.google.protobuf/protoc -->
            <dependency>
                <groupId>com.google.protobuf</groupId>
                <artifactId>protoc</artifactId>
                <version>3.21.9</version>
                <type>pom</type>
            </dependency>
 </dependencies>

3.构建依赖

xml 复制代码
 <build>

        <!--grpc proto文件编译插件-->
        <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.6.2</version>
            </extension>
        </extensions>

        <plugins>

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

            <!--grpc proto文件编译插件-->
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>0.6.1</version>
                <configuration>
                    <!-- 设置 protoc 的版本 -->
                    <protocArtifact>com.google.protobuf:protoc:3.12.0:exe:${os.detected.classifier}</protocArtifact>

                    <!-- 设置插件的版本 -->
                    <pluginId>grpc-java</pluginId>
                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.34.1:exe:${os.detected.classifier}</pluginArtifact>

                    <!-- 设置输出目录 -->
                    <outputDirectory>${project.basedir}/src/main/java</outputDirectory>
                    <!-- 设置proto文件所在目录 -->
                    <protoSourceRoot>${project.basedir}/src/main/resources</protoSourceRoot>


                    <!-- 是否清除输出目录 -->
                    <clearOutputDirectory>false</clearOutputDirectory>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <!-- 执行 protobuf 编译和 gRPC 插件 -->
                            <goal>compile</goal>
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

三、配置文件

服务端

  1. 配置grpc的端口号即可,不配默认端口号是9090.

客户端

yaml配置:

yaml 复制代码
# grpc配置
grpc:
  # grpc clienT相关配置
  client:
    # 服务名(不同服务名可对应不同配置)
    # ms-zeu是服务端配置的名字,GrpcClient注解会用到
    ms-zeus:
      #       gRPC服务端地址
      #      address: 'dns://127.0.0.1:19898'
      address: 'static://127.0.0.1:19090'
      # 是否开启保持连接(长连接)
      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

如下图所示:

四、 demo

4.1 编写proto文件

eg:

xml 复制代码
// proto 文件放在 src/main/proto 目录下
// 指定使用 proto3 语法
syntax = "proto3";

option java_generic_services = true;
// 生成的 Java 代码将被拆分为多个文件
option java_multiple_files = true;
// 指定生成的 Java 代码所在的包
option java_package = "cn.zqm.api";

// 定义接口
service Greeter {
  // 定义方法
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// 定义入参格式
message HelloRequest {
  string name = 1;
}

// 定义出参格式
message HelloReply {
  string data;
  string message = 1;
  int32 code; 
}

proto3语法详情见:

4.2 生成文件

点击api中的compile,自动生成右侧的jar包。
客户端和服务端同时生成。

4.3 服务端重写方法

java 复制代码
@Service
public class HelloService {

    //和本项目中配置文件名一致即可
    @GrpcClient("ms-zeus")
    private GreeterGrpc.GreeterBlockingStub simpleStub;

    public void testHello(){
        HelloRequest helloRequest = HelloRequest.newBuilder().setName("1").build();
        HelloReply helloReply = simpleStub.sayHello(helloRequest);
        System.out.println();
    }
}

4.4 客户端调用该方法

java 复制代码
@Service
public class HelloService {

    //和本项目中配置文件名一致即可
    @GrpcClient("ms-zeus")
    private GreeterGrpc.GreeterBlockingStub simpleStub;

    public void testHello(){
        HelloRequest helloRequest = HelloRequest.newBuilder().setName("1").build();
        HelloReply helloReply = simpleStub.sayHello(helloRequest);
        System.out.println();
    }
}

五、测试

编写http接口进行测试:

结果应该是我们自定义生成的hello。

验证成功!!!!

相关推荐
天天进步201514 分钟前
Vue+Springboot用Websocket实现协同编辑
vue.js·spring boot·websocket
草莓base25 分钟前
【手写一个spring】spring源码的简单实现--bean对象的创建
java·spring·rpc
乌啼霜满天2491 小时前
Spring 与 Spring MVC 与 Spring Boot三者之间的区别与联系
java·spring boot·spring·mvc
tangliang_cn1 小时前
java入门 自定义springboot starter
java·开发语言·spring boot
Grey_fantasy1 小时前
高级编程之结构化代码
java·spring boot·spring cloud
苹果酱05672 小时前
前端面试vue篇:Vue2 和 Vue3 在设计和性能上有显著区别
java·spring boot·毕业设计·layui·课程设计
刘大浪3 小时前
后端数据增删改查基于Springboot+mybatis mysql 时间根据当时时间自动填充,数据库连接查询不一致,mysql数据库连接不好用
数据库·spring boot·mybatis
一只爱撸猫的程序猿3 小时前
简单实现一个系统升级过程中的数据平滑迁移的场景实例
数据库·spring boot·程序员
攻心的子乐3 小时前
shell脚本启动springboot项目
spring boot
程序媛-徐师姐3 小时前
Java 基于SpringBoot+vue框架的老年医疗保健网站
java·vue.js·spring boot·老年医疗保健·老年 医疗保健