SpringBoot整合gRPC -- 简单明了

news2024/11/27 1:40:40
  1. 项目结构
    在这里插入图片描述

  2. pom引入(parent中引入即可)

    <properties>
        <net-devh-grpc.version>2.14.0.RELEASE</net-devh-grpc.version>
        <os-maven-plugin.version>1.6.0</os-maven-plugin.version>
        <protobuf-maven-plugin.version>0.5.1</protobuf-maven-plugin.version>
    </properties>
    
    <dependency>
        <groupId>net.devh</groupId>
        <artifactId>grpc-spring-boot-starter</artifactId>
        <version>2.14.0.RELEASE</version>
    </dependency>
    
  3. 创建lib、service、client服务
    a. lib中, 创建proto文件
    在这里插入图片描述

    syntax = "proto3";
    option java_package = "com.mose.proto.msg";
    
    // 定义service -- 即 class
    service MsgService {
      // 定义 方法名   入参对象     返回      回参对象
      rpc SendMsg (MsgRequest) returns (MsgResponse);
    }
    
    // 定义 入参对象
    // 其中的 1、2、3 只是为了排序
    message MsgRequest {
      int32 a = 1;
      int32 b = 2;
      Type type = 3;
    }
    
    // 定义 回参对象
    message MsgResponse {
      int32 c = 1;
    }
    
    // 定义 入参/回参 枚举类型
    // 默认值为第一个,即 = 0 的为默认值
    enum Type {
      add = 0;
      cut = 1;
    }
    

b. pom中增加build信息

 <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>
         <plugin>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-maven-plugin</artifactId>
             <executions>
                 <execution>
                     <goals>
                         <goal>repackage</goal>
                     </goals>
                 </execution>
             </executions>
         </plugin>
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-surefire-plugin</artifactId>
             <configuration>
                 <skip>true</skip>
             </configuration>
         </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>

c. 在lib中执行 mvn clean install , 即可生成proto文件对应的java文件,如下图
在这里插入图片描述

  1. service 实现接口

    server:
      port: 8081
    spring:
      application:
        name: grpc-service
    grpc:
      server:
        port: 9091
    
    import com.mose.proto.msg.Msg;
    import com.mose.proto.msg.MsgServiceGrpc;
    import io.grpc.stub.StreamObserver;
    import net.devh.boot.grpc.server.service.GrpcService;
    
    @GrpcService
    public class MsgService extends MsgServiceGrpc.MsgServiceImplBase {
        @Override
        public void sendMsg(Msg.MsgRequest request, StreamObserver<Msg.MsgResponse> responseObserver) {
            // 获取参数
            int a = request.getA();
            int b = request.getB();
            Msg.Type type = request.getType();
    
            // 处理逻辑
            int c = 0;
    
            switch (type) {
                case add:
                    c = a + b;
                    break;
                case cut:
                    c = a - b;
                    break;
            }
    
            // 构造回参
            Msg.MsgResponse response = Msg.MsgResponse.newBuilder().setC(c).build();
    
            // 返回
            responseObserver.onNext(response);
    
            // 处理完成
            responseObserver.onCompleted();
        }
    }
    
  2. client 调用接口

    server:
      port: 8082
    spring:
      application:
        name: grpc-client
    grpc:
      server:
        port: 9092
      client:
        grpc-service:
          address: localhost:9091
          negotiation-type: plaintext
    
    import com.mose.proto.msg.Msg;
    import com.mose.proto.msg.MsgServiceGrpc;
    import net.devh.boot.grpc.client.inject.GrpcClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class MsgController {
    
        /**
         * 获取调用存根
         */
        @GrpcClient("grpc-service")
        private MsgServiceGrpc.MsgServiceBlockingStub stub;
    
        @GetMapping("msg")
        public int sendMsg(int a, int b) {
            return stub.sendMsg(
                            // 构造入参
                            Msg.MsgRequest.newBuilder().setA(a).setB(b).setType(Msg.Type.cut).build()
                    )
                    // 获取回参
                    .getC();
        }
    }
    
    
  3. 调用 以及结果
    在这里插入图片描述

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

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

相关文章

Python绘制一个圆

代码 import matplotlib.pyplot as plt import numpy as npradius 10 # 半径的长度 center np.array([0,0]) # 圆心的坐标 t np.linspace(0, 2 * np.pi, 100) x center[0] radius * np.cos(t) y center[1] radius * np.sin(t)plt.figure(figsize(5,5)) plt.plot(x,y) p…

C# Modbus通信从入门到精通(5)——Modbus RTU(0x03功能码)

1、03(0x03)读保持寄存器 使用该功能码能从远程地址中读取1到125个保持寄存器的值,每个保持寄存器都占两个字节,读取的保持寄存器数量由主站读取时指定。 2、发送报文格式 更详细的格式如下: 从站地址+功能码+起始地址高位+起始地址低位+寄存器数量高位+寄存器数量低位+…

Redis进阶源码 - 主流程源码

redis底层是C语言编写的一个可执行程序&#xff0c;主方法为server.c 中main方法 主要包括&#xff1a;从初始化 到 EventLoop整个流程源码内容介绍 画的分析图太大了&#xff0c;需要的直接下载看吧.....想提醒大家的是&#xff0c;看源码时一定要带着目标去看&#xff0c;比…

《微服务架构设计模式》第十一章 开发面向生产环境的微服务应用

内容总结自《微服务架构设计模式》 开发面向生产环境的微服务应用 一、开发安全的服务1、安全性概述2、单体应用安全性3、微服务应用安全性 二、如何使用外部化配置模式三、如何使用可观测性模式四、使用微服务基底模式开发服务1、使用微服务基地2、从微服务到服务网格 五、总结…

前端开发面试题及答案整理(合集)

前端开发面试题及答案 1、对Web标准以及W3C的理解与认识? 答&#xff1a;标签闭合、标签小写、不乱嵌套、提高搜索机器人搜索几率、使用外链CSS和JS脚本、结构行为表现的分离、文件下载与页面速度更快、内容能被更多的用户所访问、内容能被更广泛的设备所访问、更少的代码和组…

2023年NOC决赛-加码未来编程赛项决赛模拟题-Python模拟题--卷1

第一题: 小码君在和朋友们玩密室逃脱。他们被困在一个封闭的房间中,只有破解密码,才能逃出密室。密码提示如下:“将 1 到 100 以内,能被 7 整除的数的个数以及这些数累加起来的和拼在一起即是打开房门的密码” 。请帮小码君算出密码。(注:只需显示表示结果的纯数字,不…

动手学深度学习——softmax回归的从零开始(代码详解)

目录 1. softmax回归的从零开始实现1.1 初始化模型参数1.2 定义softmax操作1.3 定义模型1.4 定义损失函数1.5 分类精度1.6 训练1.7 预测1.8 小结 1. softmax回归的从零开始实现 引入Fashion-MNIST数据集&#xff0c; 并设置数据迭代器的批量大小为256。 import torch from IP…

快速实现单数据表编辑

目录 1 简介 2 准备电子表格 3 初始化 4 根据电子表格生成数据库表并导入数据 5 使刚创建的表显示在待编辑列表中 6 开始编辑单表 7 一段代码用于实现中文字段名、调整列宽、只读字段、隐藏字段 1 简介 单数据表是最容易实现的表。由于不需要从零开始一个一个地增加字段…

pwm呼吸灯

文章目录 一、呼吸灯二、代码实现三、引脚分配 一、呼吸灯 呼吸灯是指灯光在微电脑的控制之下完成由亮到暗的逐渐变化&#xff0c;使用开发板上的四个led灯实现1s间隔的呼吸灯。 二、代码实现 c module pwm_led( input clk ,input rst_n ,output reg [3:0] led ); …

当你输入URL并按下回车后,发生了什么?

大概发生了八步的事情&#xff1a; URL解析->DNS解析->服务器建立连接->发送HTTP请求->服务器处理请求->服务器响应->接收和渲染页面->关闭连接 URL解析 URL&#xff0c;统一资源定位符&#xff0c;是用来表示从互联网上得到的资源位置和访问这些资源的…

ARM DynamIQ简介

DynamIQ是ARM一个新的底层solution&#xff0c;用于连接在一个芯片上的不同core&#xff0c;将多个core连接起来。 有了DynamIQ&#xff0c;我们可以将不同类型的core放到一个cluster中。比如&#xff0c;将性能高的core&#xff0c;和功耗低的core放进一个cluster&#xff0c;…

【uni-app】常用图标、头像汇总

在做小程序的时候&#xff0c;有时候需要各种图标和头像素材&#xff0c;而百度一堆基本都是收费的。所以&#xff0c;整理一些免费好用的图标&#xff0c;头像库&#xff1a; 1、iconfont-阿里巴巴矢量图标库 基本上常用的矢量图标&#xff0c;在这儿都有&#xff0c;而且可…

基于SSM框架的汽车在线销售系统设计与实现

博主介绍&#xff1a;专注于Java技术领域和毕业项目实战。专注于计算机毕设开发、定制、文档编写指导等&#xff0c;对软件开发具有浓厚的兴趣&#xff0c;工作之余喜欢钻研技术&#xff0c;关注IT技术的发展趋势&#xff0c;感谢大家的关注与支持。 技术交流和部署相关看文章…

Eureka的使用手册

一、导入依赖&#xff08;服务端和客户端导入的依赖不一样&#xff09; 服务端&#xff1a; <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependenc…

『数据增强』yolov5 数据增强 与 红外数据增强

目录 yolov5 数据增强 Mosaic Copy paste Random affine MixUp Albumentations Augment HSV(Hue, Saturation,Value) Random horizontal flip 红外数据增强 红外图像的缺点 红外成像技术的特点 红外图像增强经…

常用电子元器件检测方法与经验

电子元器件检测是电子工程师和技术人员工作中不可或缺的一部分。在电子元器件制造和使用过程中&#xff0c;需要对元器件进行检测&#xff0c;以确保其质量和性能符合要求。在本文中&#xff0c;我们将介绍常用的电子元器件检测方法和经验&#xff0c;以帮助读者更好地了解和掌…

redux之reducer 为什么必须是纯函数?

在一个应用中&#xff0c;所有的 state 都是以一个对象树的形式存在一个单一的 store 中&#xff0c;唯一改变 state 的办法就是触发 action&#xff0c;而 reducer 就是用来编写专门的函数决定每个 action 如何改变应用的 state 。 在 Redux store 中保存了 reducer 返回的 这…

make/makefile的使用

make/makefile 文章目录 make/makefile初步认识makefile的工作流程依赖关系和依赖方法make的使用 总结 make是一个命令&#xff0c;是一个解释makefile中指令的命令工具&#xff0c;makefile是一个文件&#xff0c;当前目录下的文件&#xff0c;两者搭配使用&#xff0c;完成项…

RabbitMQ ---- 延迟队列

RabbitMQ ---- 延迟队列 1. 延迟队列的概念2. 延时队列使用场景3. RabbitMQ 中的 TTL3.1 消息设置 TTL3.2 队列设置 TTL3.3 两者的区别 4. 整合 springboot4.1 创建项目4.2 添加依赖4.3 修改配置文件4.4 添加 Swagger 配置类 5. 队列 TTL5.1 代码架构图5.2 配置文件类代码5.3 消…