springboot 使用 GRPC

Posted 正怒月神

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot 使用 GRPC相关的知识,希望对你有一定的参考价值。

说明:

GRPC是什么?

首先我们知道 RPC是远程过程调用。

而GRPC是RPC的一种实现。

那么为什么要用GRPC呢?

因为它支持跨语言的开发,换句话说,大家都用过FeignRPC,尤其在spring cloud中。

然而它只支持java语言,而作为微服务,可能有很多其他的服务不是java开发的。因此需要满足这个需求,就需要一个跨语言的RPC,所以就会考虑使用GRPC

好了,下面进入正题

直接上代码。

我们做一个Service和一个Client 进行交互。

一,Service端

1,POM

注意:

grpc-spring-boot-starter

os-maven-plugin

protobuf-maven-plugin

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>test</artifactId>
    <version>1.0</version>
    <name>test</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>11</java.version>
        <spring-cloud.version>2021.0.0</spring-cloud.version>
        <grpc-spring-boot-starter.version>2.3.2</grpc-spring-boot-starter.version>
        <os-maven-plugin.version>1.6.0</os-maven-plugin.version>
        <protobuf-maven-plugin.version>0.5.1</protobuf-maven-plugin.version>
    </properties>
    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- grpc -->
        <dependency>
            <groupId>org.lognet</groupId>
            <artifactId>grpc-spring-boot-starter</artifactId>
            <version>$grpc-spring-boot-starter.version</version>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>$spring-cloud.version</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <extensions>
            <!-- os-maven-plugin -->
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>$os-maven-plugin.version</version>
            </extension>
        </extensions>
        <plugins>
            <!-- spring-boot-maven-plugin -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!-- protobuf-maven-plugin -->
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>$protobuf-maven-plugin.version</version>
                <configuration>
                    <protocArtifact>com.google.protobuf:protoc:3.5.1-1:exe:$os.detected.classifier</protocArtifact>
                    <pluginId>grpc-java</pluginId>
                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.11.0:exe:$os.detected.classifier</pluginArtifact>
                    <outputDirectory>$project.build.sourceDirectory</outputDirectory>
                    <clearOutputDirectory>false</clearOutputDirectory>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

2,创建Proto

PS:Proto文件夹,必须和JAVA同级!

 HelloWorld.protp

syntax = "proto3";

option java_multiple_files = true;
package com.example.test.helloworld;

//请求
message Request 
  double num1 = 1;
  double num2 = 2;
  OperateType opType = 3;


//操作类型
enum OperateType 
  Addition = 0;
  Division = 1;
  Multiplication = 2;
  Subtraction = 3;

message Response 
  double result = 1;


//定义服务
service Operate 
  rpc Calculate (Request) returns (Response);

3,执行命令,生成文件

mvn clean install

或者点击

 

可以看到生成了文件:

 

4,实现接口

为了简单演示,这里就直接设置Response.Result=2

OperateImpl

@GRpcService
public class OperateImpl extends OperateGrpc.OperateImplBase 
    @Override
    public void calculate(Request request,
                          StreamObserver<Response> responseObserver) 
        Response response=Response.newBuilder().setResult(2).build();
        System.out.println(response);
        responseObserver.onNext(response);
        responseObserver.onCompleted();
    

 

 二,Client端

 1,POM(同Service端)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>test1</artifactId>
    <version>1.0</version>
    <name>test1</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>11</java.version>
        <spring-cloud.version>2021.0.0</spring-cloud.version>
        <grpc-spring-boot-starter.version>2.3.2</grpc-spring-boot-starter.version>
        <os-maven-plugin.version>1.6.0</os-maven-plugin.version>
        <protobuf-maven-plugin.version>0.5.1</protobuf-maven-plugin.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- grpc -->
        <dependency>
            <groupId>org.lognet</groupId>
            <artifactId>grpc-spring-boot-starter</artifactId>
            <version>$grpc-spring-boot-starter.version</version>
        </dependency>
    </dependencies>

    <build>
        <extensions>
            <!-- os-maven-plugin -->
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>$os-maven-plugin.version</version>
            </extension>
        </extensions>
        <plugins>
            <!-- spring-boot-maven-plugin -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!-- protobuf-maven-plugin -->
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>$protobuf-maven-plugin.version</version>
                <configuration>
                    <protocArtifact>com.google.protobuf:protoc:3.5.1-1:exe:$os.detected.classifier</protocArtifact>
                    <pluginId>grpc-java</pluginId>
                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.11.0:exe:$os.detected.classifier</pluginArtifact>
                    <outputDirectory>$project.build.sourceDirectory</outputDirectory>
                    <clearOutputDirectory>false</clearOutputDirectory>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

2,拷贝Proto

和java同级目录

 

3,执行命令

mvn clean install

4,调用方法

CalculateService

其中 main方法,是测试方法。

GRPC启动的默认端口是6565,在main中设置了。

public class CalculateService 
    private final ManagedChannel channel;
    private final OperateGrpc.OperateBlockingStub blockingStub;

    private CalculateService(ManagedChannel channel) 
        this.channel = channel;
        blockingStub = OperateGrpc.newBlockingStub(channel);
    

    public CalculateService(String host, int port) 
        this(ManagedChannelBuilder.forAddress(host, port)
                .usePlaintext()
                .build());
    

    public void shutdown() throws InterruptedException 
        channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
    

    public float operate(float num1, float num2, OperateType operateType) 
        Request request = Request.newBuilder().setNum1(num1).setNum2(num2).setOpType(operateType).build();
        Response response = blockingStub.calculate(request);
        return (float) response.getResult();
    

    public static void main(String[] args) 
        try 
            CalculateService service = new CalculateService("localhost", 6565);
            System.out.println(service.operate(100, 0, OperateType.Division));
            service.shutdown();
         catch (Exception e) 
            System.out.println(e);
        
    

三,结果

 

以上是关于springboot 使用 GRPC的主要内容,如果未能解决你的问题,请参考以下文章

gRPC - 找不到方法

在使用 Springboot 运行集成测试时启动嵌入式 gRPC 服务器

SpringBoot集成gRPC微服务工程搭建实践

gRPCProtoBuf 语言快速学习指南

使用 Spring Boot 的 gRPC 和 REST 微服务

Spring Cloud集成grpc