手把手教你 SpringBoot 如何集成 gRPC 实现服务间通讯 ~

什么是 GRPC

gRPC 是一种高性能、开源的远程过程调用(RPC)框架,由 Google 开发并公开发布。它基于 Protocol Buffers(Protobuf)作为默认的序列化和接口定义语言,并使用 HTTP/2 协议进行通信。

RPC 是一种用于不同进程或计算机之间进行通信的机制,它允许应用程序之间像调用本地函数一样进行远程调用。gRPC 提供了一种简单的方法来定义服务接口和消息格式,使开发人员能够方便地定义和使用跨语言的远程调用。

在 gRPC 中,服务接口和消息格式使用 Protobuf 进行定义。Protobuf 是一种轻量级、语言无关且可扩展的数据序列化格式,它能够将结构化数据进行编码,并通过网络在不同应用程序之间进行传输。通过使用 Protobuf,gRPC 可以自动生成与之对应的客户端和服务器端代码,简化了开发过程。

gRPC 使用 HTTP/2 作为底层的通信协议。相较于传统的 HTTP/1.1 协议,HTTP/2 提供了更低的延迟和更高的吞吐量,支持双向流通信和流控制。这使得 gRPC 能够高效地传输数据,并支持实时性要求高的应用场景。

gRPC 提供了多种语言的支持,包括 Java、C++、Python、Go、C# 等。这使开发人员可以在不同的编程语言中使用相同的定义文件和通信接口,实现跨语言的远程调用。

总之,gRPC 是一个功能强大、高性能的远程过程调用框架,通过使用 Protobuf 和 HTTP/2,它提供了简单、可靠、高效的跨语言通信机制。

SpringBoot 集成 GRPC

集成gRPC也是心血来潮,知道gRPC性能比较高,但是一直也没用过,借用这次也顺便熟悉熟悉gRPC的集成和实现。

首先明确一个概念:客户端 和 服务端

  • 客户端:被调用方
  • 服务端:调用方

客户端

1、Maven配置

<!-- grpc 自身服务-->
<dependency>
    <groupId>net.devh</groupId>
    <artifactId>grpc-server-spring-boot-starter</artifactId>
</dependency>

<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>

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

    </plugins>
</build>

2、application.yml配置

grpc:
  server:
    port: 8090

3、proto 文件

创建一个 mess.proto 文件放在 src/main/proto 目录下

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

// 生成的 Java 代码将被拆分为多个文件
option java_multiple_files = true;

// 指定生成的 Java 代码所在的包
option java_package = "com.yanxi.yxregiserve.web.grpc.messService";

// 定义一个 gRPC 服务,名为 MessService
service MessService {
    // 定义一个 gRPC 方法,名为 getHello
    // 接收一个 MessRequest 参数,并返回一个 MessResponse
    rpc getHello(MessRequest) returns (MessResponse) {}
}

// 定义一个接受消息类型,名为 MessRequest
message MessRequest{

    string str = 1;
}

// 定义一个返回消息类型,名为 MessResponse
message MessResponse {

    // 状态
    int32 status = 1;

    // 消息
    string msg = 2;

    // 数据
    string data = 3;
}

4、编译

mvn compile

或者

image.png

因为子啊proto文件中配置了,所以

编译完成就会在你的 src\main\java\com\yanxi\yxregiserve\web\grpc\messService目录中出现:

image.png

这就是反编译的java代码。

5、重载

我自己的习惯,在这个位置创建一个impl文件

image.png

继承 MessServiceGrpc.MessServiceImplBase

package com.yanxi.yxregiserve.web.grpc.impl;

import com.yanxi.yxregiserve.web.grpc.messService.MessRequest;
import com.yanxi.yxregiserve.web.grpc.messService.MessResponse;
import com.yanxi.yxregiserve.web.grpc.messService.MessServiceGrpc;
import net.devh.boot.grpc.server.service.GrpcService;

@GrpcService
public class MessServiceImpl extends MessServiceGrpc.MessServiceImplBase {

    @Override
    public void getHello(MessRequest request, io.grpc.stub.StreamObserver<MessResponse> responseStreamObserver) {

        System.out.println(request.getStr());

        responseStreamObserver.onNext(MessResponse.newBuilder()
                .setData("返回的数据")
                .setStatus(200)
                .setMsg("操作成功")
                .build());
        responseStreamObserver.onCompleted();
    }

}

OK 客户端就配置完毕了!

服务端

1、Maven配置

<!-- grpc 连接客户端-->
<dependency>
    <groupId>net.devh</groupId>
    <artifactId>grpc-client-spring-boot-starter</artifactId>
</dependency>

<!-- grpc 自身服务-->
<dependency>
    <groupId>net.devh</groupId>
    <artifactId>grpc-server-spring-boot-starter</artifactId>
</dependency>

2、application.yml配置

grpc:
  server:
    port: 8091
  client:
    yx-regiserve:
      address: static://localhost:8090
      enableKeepAlive: true
      keepAliveWithoutCalls: true
      negotiationType: plaintext

3、proto 文件

创建一个 mess.proto 文件放在 src/main/proto 目录下

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

// 生成的 Java 代码将被拆分为多个文件
option java_multiple_files = true;

// 指定生成的 Java 代码所在的包
option java_package = "com.yanxi.yxregiserve.web.grpc.messService";

// 定义一个 gRPC 服务,名为 MessService
service MessService {
    // 定义一个 gRPC 方法,名为 getHello
    // 接收一个 MessRequest 参数,并返回一个 MessResponse
    rpc getHello(MessRequest) returns (MessResponse) {}
}

// 定义一个接受消息类型,名为 MessRequest
message MessRequest{

    string str = 1;
}

// 定义一个返回消息类型,名为 MessResponse
message MessResponse {

    // 状态
    int32 status = 1;

    // 消息
    string msg = 2;

    // 数据
    string data = 3;
}

4、编译

mvn compile

或者

image.png

因为子啊proto文件中配置了,所以

编译完成就会在你的 src\main\java\com\yanxi\yxregiserve\web\grpc\messService目录中出现:

image.png

这就是反编译的java代码。

3、4步骤 这么写有感觉一点冗余,但是目前我是这么实现的,让我以后琢磨琢磨怎么用更好的方法实现,以后更新。

5、调用客户端

@SpringBootTest
class YxModel1ApplicationTests {

    @GrpcClient("yx-regiserve")
    private MessServiceGrpc.MessServiceBlockingStub messServiceBlockingStub;

    @Test
    void contextLoads() {
        MessResponse response = messServiceBlockingStub.getHello(MessRequest.newBuilder()
                .setStr("你好呀")
                .build());

        // 处理返回结果
        System.out.println(response.getData());
        System.out.println(response.getStatus());
        System.out.println(response.getMsg());
    }

}

调试结果

1、启动客户端

image.png

2、启动服务端 测试类

image.png

服务端发送的请求值

image.png

完活

YanXi 项目

不妨大胆一点 自己做一个Nacos(用JAVA实现 )

是我在写了这篇博客之后,决定要手把手的把这玩意实现~

然后便有了这个开源项目 ,小菜鸡一个,各位大佬轻点…我感觉还是要勇于尝试,勇于试错,虽然不难,但是也是我的一个小小的心血吧~

YanXi 开源项目地址:

YanXi 开源项目 自己做一个Nacos(用JAVA实现 )

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SpringBoot集成gRPC是一种常见的微服务架构方式。在集成gRPC之前,你需要进行一些准备工作,包括创建Java Maven工程、准备server端和client端的代码、编写proto文件以及配置相应的pom文件。 在集成gRPC时,你可以按照以下步骤进行操作: 1. 创建一个Java Maven工程,这将作为你的项目基础。 2. 在工程中引入所需的依赖,包括gRPCSpringBoot相关的依赖。 3. 编写server端的代码,包括启动类和相应的Controller。 4. 配置server端的相关信息,例如指定gRPC服务器的地址和端口等。 5. 编写client端的代码,包括启动类和相应的Controller。 6. 在client端配置所需的server信息。 7. 运行你的项目,检查是否成功集成gRPC。 通过以上步骤,你可以成功地将gRPC集成SpringBoot项目中,实现服务架构。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [springboot 集成GRPC](https://blog.csdn.net/sunrj_niu/article/details/127402842)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [SpringBoot集成gRPC服务工程搭建实践的方法](https://download.csdn.net/download/weixin_38545243/12751706)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值