Idea+maven+spring-cloud项目搭建系列--12 整合grpc

news2025/2/22 13:25:48

前言: grpc 是geogle 开源的rpc 通信框架,通过定义proto生成通信存根,像本地调用服务一样,进行远程服务的调用;

1 消费端服务提供

1.1 引入grpc 和 protobuf

<!-- RPC -->
<!-- RPC 服务调用 -->
<dependency>
    <groupId>net.devh</groupId>
    <artifactId>grpc-spring-boot-starter</artifactId>
    <version>2.10.1.RELEASE</version>
</dependency>
<!-- protobuf 协议缓冲区-->
<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java-util</artifactId>
    <version>3.12.2</version>
</dependency>

1.2 要想根据proto文件生成服务的存根,这里引入对应的maven 插件:

<extensions>
	<!-- 确定当前的操作系统和体系结构 -->
    <extension>
        <groupId>kr.motd.maven</groupId>
        <artifactId>os-maven-plugin</artifactId>
        <version>1.6.2</version>
    </extension>
</extensions>
<plugin>
    <groupId>org.xolstice.maven.plugins</groupId>
    <artifactId>protobuf-maven-plugin</artifactId>
    <version>0.6.1</version>
    <configuration>
    	<!-- 消息体生成工具 -->
        <protocArtifact>com.google.protobuf:protoc:3.12.0:exe:${os.detected.classifier}</protocArtifact>
          <!-- java rpc 代码生成 -->
        <pluginId>grpc-java</pluginId>
        <!-- java rpc 代码生成功能 -->
        <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.32.1:exe:${os.detected.classifier}</pluginArtifact>
        <!-- proto 的文件源 -->
        <protoSourceRoot>src/main/proto</protoSourceRoot>
       <!-- <outputDirectory>src/main/java</outputDirectory>-->
       <!-- 消息体生成后不进行清除 -->
        <clearOutputDirectory>false</clearOutputDirectory>
    </configuration>
    <executions>
        <execution>
            <goals>
           		 <!-- 执行的任务 -->
                <goal>compile</goal>
                <goal>compile-custom</goal>
            </goals>
        </execution>
    </executions>
</plugin>

插件引入后如图所示:
在这里插入图片描述
插件安装完成会出现protobuf 插件:
在这里插入图片描述

1.3 定义proto 文件 hello.proto:

	// 语法使用proto3
    syntax = "proto3";


    //option java_multiple_files = false ;
    // java 生成的jar包类
    option java_package = "bl.grpc.es";
    // java 生成的消息类名称
    option java_outer_classname = "HelloWorldProto";

   // 该 proto 的包类名多个proto 文件package 不能相同
    package bl.es;
    // 请求参数
    message HelloRequest {
        string name = 1;
    }
    // 返回的结果
    message HelloResponse {
        string name = 1;
        string status = 2;
    }

    // rpc 服务
    service HelloService {
        // 定义hello 方法
        rpc hello(HelloRequest) returns(HelloResponse) {}
    }

通过maven ->compile 编译生成java 消息体及rpc 服务:
在这里插入图片描述
生成类所在路径为,改项目 target 目录下 \generated-sources\protobuf :
在这里插入图片描述
1.4 暴露要对外的接口 HelloServiceGrpcOne :

package org.lgx.bluegrass.bluegrasses.proto;

import bl.grpc.es.HelloServiceGrpc;
import bl.grpc.es.HelloWorldProto;
import io.grpc.stub.StreamObserver;
import net.devh.boot.grpc.server.service.GrpcService;

/**
 * @Description TODO
 * @Date 2023/2/28 11:21
 * @Author lgx
 * @Version 1.0
 */
// 服务端注解标识
@GrpcService
public class HelloServiceGrpcOne  extends  HelloServiceGrpc.HelloServiceImplBase{
    @Override
    public void hello(HelloWorldProto.HelloRequest request, StreamObserver<HelloWorldProto.HelloResponse> responseObserver) {
        // 数据处理并返回
        HelloWorldProto.HelloResponse reply = HelloWorldProto.HelloResponse.newBuilder()
                .setName("Hello ========== " + request.getName()).setStatus("200")
                .build();
        responseObserver.onNext(reply);
        responseObserver.onCompleted();
    }
}

bootstrap.yml 暴露grpc 服务端口:

grpc:
  server:
    port: 6000

至此服务端暴露完成;

2 消费端远程调用:

2.1 同服务端相同,也需要引入grpc 和 protobuf ;以及proto文件生成服务的存根,引入对应的maven 插件;
2.2 定义消费端:
1)HelloWorldClient :

package org.lgx.bluegrass.bluegrasscoree.proto;

import bl.grpc.es.HelloServiceGrpc;
import bl.grpc.es.HelloWorldProto;
import io.grpc.Channel;
import net.devh.boot.grpc.client.inject.GrpcClient;
import org.springframework.stereotype.Service;

/**
 * @Description TODO
 * @Date 2023/2/28 13:47
 * @Author lgx
 * @Version 1.0
 */
@Service
public class HelloWorldClient {

    @GrpcClient("cloud-grpc-server")
    private Channel serverChannel;

    public String hello(String name) {
        HelloServiceGrpc.HelloServiceBlockingStub stub = HelloServiceGrpc.newBlockingStub(serverChannel);
        HelloWorldProto.HelloRequest.Builder builder = HelloWorldProto.HelloRequest.newBuilder().
                setName(name);
        HelloWorldProto.HelloResponse response = stub.hello(builder.build());
        return "{'responseStatus':'" + response.getStatus() + "','result':[]}"+response.getName();

    }
}

2)GrpcTestController :

package org.lgx.bluegrass.bluegrasscoree.controller.protogrpc;

import lombok.extern.slf4j.Slf4j;
import org.lgx.bluegrass.bluegrasscoree.proto.HelloWorldClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Description TODO
 * @Date 2023/2/28 13:55
 * @Author lgx
 * @Version 1.0
 */
@Slf4j
@RestController
public class GrpcTestController {
    @Autowired
    private HelloWorldClient service;

    @GetMapping(value = "/hello")
    public String test(String name) {
        String result = "";
        try {
            result = service.hello(name);
            log.info("respString : {}", result);
            return result;
        } catch (Throwable e) {
            log.error("hello error", e);
        }
        return result;
    }
}

1.3 消费端bootstrap.yml定义要连接的服务端:

grpc:
  client:
  	# 服务名称
    cloud-grpc-server:
    	# 服务地址
      address: static://localhost:6000  #指定grpc服务端地址
      # 保持长连接
      enableKeepAlive: true
      keepAliveWithoutCalls: true
      negotiationType: plaintext

1.4 测试:
http://localhost:9082/hello?name=%E5%BC%A0%E4%B8%8912344
在这里插入图片描述

总结:
1 ) 需要引入proto ,java生成插件生成消息体和rpc 的服务调用代码;
2 ) 服务端通过继承rpc 类实现具体业务的实现;
3 ) 消费端通过注入rpc 的bean 完成远程方法的调用;
4)grpc 使用协议存根来替代dubbo 中定义的要外发布的接口,更加的灵活;

参考:
1 grpc 介绍;
2 grpc 协议缓冲区;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/401878.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最大子矩阵(蓝桥杯)暴搜 JAVA

题目描述&#xff1a; 小明有一个大小为NM的矩阵&#xff0c;可以理解为一个N行M列的二维数组。 我们定义一个矩阵m 的稳定度f(m) 为f(m)max(m)-min(m)。 其中max(m)表示矩阵m中的最大值&#xff0c;min(m) 表示矩阵m 中的最小值。 现在小明想要从这个矩阵中找到一个稳定度不大…

2023-03-09干活小计

强化学习&#xff1a; 强化学习用智能体&#xff08;agent&#xff09;这个概念来表示做决策的机器。 感知、决策和奖励 感知。智能体在…

【ECCV 2022】76小时动捕,最大规模数字人多模态数据集开源

随着元宇宙的火爆以及数字人建模技术的商业化&#xff0c;AI 数字人驱动算法&#xff0c;作为数字人动画技术链的下一关键环节&#xff0c;获得了学界和工业界越来越广泛的兴趣和关注。其中谈话动作生成 &#xff08;由声音等控制信号生成肢体和手部动作&#xff09;由于可以降…

ChatGPT正当时,让我们一起深耕智能内容生成和智能内容增强领域

ChatGPT以其强大的信息整合和对话能力惊艳了全球&#xff0c;在自然语言处理上面表现出了惊人的能力。很多人都预测 2023 年将是 AI 生成之年&#xff0c;也许我们将迎来继农业革命、工业革命以来的第三种通用技术的普及。 信必优长期专注于人工智能领域&#xff0c;拥有产品研…

力扣-求关注者的数量

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;1729. 求关注者的数量二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.正确…

Linux下创建ln链接文件

1.linux重定向命令 >ls > a.txt将ls显示的结果 输出到文件中1.echo "hello world"2.往终端上输出 字符串"hello world"echo "hello " >c.txt 将"hello "字符串 输出到文件中&#xff08;覆盖&#xff09;echo "world&qu…

MFC 简单使用事件

功能三个按钮,一个静态框,默认值是0,增加减少按钮和退出按钮.增加减少按钮显示在静态框中.退出按钮退出软件.实验事件思路新建三个事件,add事件sub事件quit事件,一个按钮触发一个事件,静态框新建一个线程接受事件做出对应的改变.UI添加的代码就不具体说,具体说下事件的代码,这才…

SpringBoot项目使用Schedule注释创建定时任务

文章目录知识讲解相关注释&#xff08;主要两个,EnableScheduling和Scheduled&#xff09;scheduled的cron语法代码项目目录结构启动类&#xff08;Application&#xff09;定时任务类(Task)配置类&#xff08;application.properties&#xff09;pom依赖展望&#xff08;Quart…

环形链表相关的练习

目录 一、相交链表 二、环形链表 三、环形链表 || 一、相交链表 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据…

基于Three.js和MindAR实现的网页端WebAR人脸识别追踪功能的京剧换脸Demo(含源码)

前言 近段时间一直在玩MindAR的功能&#xff0c;之前一直在弄图片识别追踪的功能&#xff0c;发现其强大的功能还有脸部识别和追踪的功能&#xff0c;就基于其面部网格的例子修改了一个国粹京剧的换脸程序。如果你不了解MindAR的环境配置可以先参考这篇文章&#xff1a;基于Mi…

本地存储localStorage、sessionStorage

目录 一、localStorage 二、sessionStorage 三、本地存储处理复杂数据 一、localStorage 介绍 &#xff08;1&#xff09;数据存储在用户浏览器中 &#xff08;2&#xff09;设置、读取方便、甚至页面刷新不会丢失数据 &#xff08;3&#xff09;容量较大&#xff0c;se…

408考研计算机之计算机组成与设计——知识点及其做题经验篇目3:指令的寻址方式

上篇文章我们讲到&#xff0c;指令的基本格式&#xff0c;一条指令通常包括操作码字段和地址码字段两部分&#xff1a; 操作码字段地址码字段并且我们还讲到根据操作数地址码的数目不同&#xff0c;可将指令分为零一二三四地址指令。感兴趣的小伙伴们可以看看小编的上一篇文章…

贝塞尔曲线介绍及其应用

贝塞尔样条是一个允许用户控制节点处斜率的样条&#xff0c;是一种特殊的三次样条。   皮埃尔贝塞尔在其为雷诺&#xff08;Renault&#xff09;汽车公司工作时有了这个创意。Paul de Casteljau在与雷诺竞争关系的汽车公司雪铁龙Citroen公司工作时也独立有了这个想法。这在两…

联合解决方案 | 亚信科技AntDB数据库携手浪潮K1 Power赋能关键行业数字化转型,助力新基建

自2022年印发《“十四五”数字经济发展规划》以来&#xff0c;我国数字化发展进入快车道。数据库作为数据存储与计算的基础软件&#xff0c;对筑牢数字经济底座至关重要。服务器是承载数据的重要载体&#xff0c;在数据库性能可以通过扩容而无上限提升的情况下&#xff0c;数据…

老爸:“你做的什么游戏测试简直是不务正业!”——我上去就是一顿猛如虎的解释。

经常有人问我&#xff1a;游戏测试到底是干什么呢&#xff1f;是游戏代练&#xff1f;每天玩游戏&#xff1f;装备随便造&#xff0c;怪物随便秒&#xff0c;线上GM指令随便用&#xff1f;可以每天玩玩游戏&#xff0c;不用忙工作&#xff0c;太爽了&#xff1f;有时朋友不理解…

1638_chdir函数的功能

全部学习汇总&#xff1a;GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 今天看一个半生不熟的小函数&#xff0c;chdir。说半生不熟&#xff0c;是因为这个接口一看就知道是什么功能。然而&#xff0c;这个接口如何用可真就没啥想法了。 …

【微信小程序】-- 自定义组件 -- 数据、方法和属性(三十三)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

设计模式之门面模式(外观模式)

目录 1.模式定义 2.应用场景 2.1 电源总开关例子 2.2 股民炒股场景 ​编辑 3. 实例如下 4. 门面模式的优缺点 传送门&#xff1a; 项目中用到的责任链模式 给对象讲工厂模式&#xff0c;必须易懂易会 策略模式&#xff0c;工作中你用上了吗&#xff1f; 1.模式定…

Linux order(文件、磁盘、网络、系统管理、备份压缩)

1. Linux 文件命令 -rwxrwxrwx chmod&#xff1a;change mode&#xff0c;用于&#xff08;文件所有者或 root &#xff09;变更用户(u:owner g:group o:other a:all)的权限 chmod [OPTION]… MODE[,MODE]… FILE… OPTION -R&#xff1a;递归修改more option&#xff1a;chmod…

【WPS文字-Word】WPS文字设置段落居中对齐后公式左边右边的文字仍然无法跟公式对齐,公式和文字对不齐

一、问题背景 原来的公式左边文字是底端&#xff0c;右边文字是居中&#xff0c;我想着让左右文字全跟公式居中对齐&#xff0c;就全部设置了段落居中对齐。 结果发现&#xff0c;公式左右边的文字依然无法居中对齐。左边的文字是居中&#xff0c;但是右边的文字变成了顶端对…