SpringBoot整合gRPC - proto3 -- 简单明了

news2024/11/26 4:40:50
  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/760310.html

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

相关文章

基于flask框架的用户注册页面实例

文件框架 app.py文件 from flask import Flask, render_template, requestapp Flask(__name__)app.route(/) def index():return register()# 申请注册页面 app.route(/register, methods["GET"]) def register(): # put applications code herereturn render_tem…

element-plus源码学习后,我了解到多种多样的写法

文章封面来自于深圳湾桥&#xff0c;很漂亮&#xff01; 本文是阅读源码之后&#xff0c;学习到一些新写法&#xff0c;平常业务开发也可以用起来。在我看来&#xff0c;阅读源码&#xff0c;不但能知道该框架的底层原理&#xff0c;出现bug时&#xff0c;可以快速排查和修复&…

如何使用unittest批量管理Python接口自动化测试用例?

我们日常项目中的接口测试案例肯定不止一个&#xff0c;当案例越来越多时我们如何管理这些批量案例&#xff1f;如何保证案例不重复&#xff1f;如果案例非常多&#xff08;成百上千&#xff0c;甚至更多&#xff09;时如何保证案例执行的效率&#xff1f;如何做&#xff08;批…

如何记住表格列宽,供下次调用,来提升用户操作体验?

如何让系统记住用户每次拖动表格后的列宽&#xff0c;下次表格初始化就可以直接用该列宽&#xff0c;来显示表格的每一个列。每个用户的使用习惯不一样&#xff0c;和使用的功能不一样&#xff0c;即使是同一套系统&#xff0c;只要用户不同&#xff0c;就有可能需要不同的列宽…

【全局异常】返回值通过【枚举】的形式返回

&#x1f4da;目录 需求创建抽象类创建业务枚举使用枚举升级简单的方式实现:使用注解方式实现: 需求 后台程序发生异常&#xff0c;通过全局的异常类使用枚举的方式把错误信息返回给前端。 全局异常类处理方式&#xff1a; 改造前使用 改造后使用枚举传递&#xff1a; 创建抽象…

高楼电脑端+黑金手机端个人引导页HTML源码

https://wwwf.lanzout.com/ipAfg12n5y4f 二、黑金主题网址导航 https://wwwf.lanzout.com/ieSVB12n5y2d

C语言文件操作【超详解】

目录 1.为什么使用文件 2.什么是文件 2.1程序文件 2.2数据文件 2.3文件名 3.文件的打开和关闭 3.1文件指针 3.2文件的打开和关闭 3.2.1fopen函数 3.2.2fclose函数 4.文件的顺序读写 4.1顺序读写函数介绍 4.1.1 fputc、fgetc和fputs、fgets 4.1.2fprintf、fscanf&…

装饰(Decorator)模式

目录 动机使用场景参与者协作效果实现相关模式应用和思考类图 装饰模式是对象结构型模式&#xff0c;动态地给一个对象添加一些额外的职责。就增加的功能来说装饰器模式相比生成子类更为灵活。 动机 有时候需要给某个对象而不是整个类添加一些功能&#xff0c;使用继承也可以&…

【SDOF振荡器的非线性-非弹性多轴时间响应分析】用于SDOF振荡器非线性非弹性时程分析的鲁棒性分析研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

经典指针笔试题你会了嘛

作者简介&#xff1a;დ旧言~&#xff0c;目前大一&#xff0c;现在学习Java&#xff0c;c&#xff0c;Python等 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 望小伙伴们点赞&#x1f44d;收藏✨加关注哟&#x1f495;&#x1f495; 指针和数组笔试题 &…

【Linux】多线程 之 POSIX信号量

文章目录 1. 概念2. 信号量的工作机制3. 认识接口sem_init ——初始化信号量sem_destroy——销毁信号量sem_wait ——申请信号量sem_post ——释放信号量 4. 基于环形队列的生产消费模型原理解析代码代码解析ringqueue类构造析构push ——生产pop ——消费 代码实现Ringqueue.h…

精通Skia引擎,发挥应用程序中高性能图形的潜力

Skia是由Google开发的一个开源的2D图形库。它提供了丰富的图形绘制、图像处理和渲染功能&#xff0c;适用于多个平台&#xff0c;包括操作系统、浏览器和移动设备等。Skia主要用于处理2D图形的绘制、文字渲染、图像处理和用户界面的呈现。 特点和功能&#xff1a; 高性能&…

基于Javaweb实现ATM机系统开发实战(十一)存储交易记录

首先创建一个业务接口&#xff1a; package com.atm.service;import com.atm.pojo.RunMessage;//交易记录的业务接口 public interface RunMessageService{//添加交易记录public void addRunMessage(RunMessage runMessage) throws Exception ; }再完成业务接口的实现类&#…

iNav开源代码之FAILSAFE

iNav开源代码之FAILSAFE 1. 源由2. FAILSAFE类别3. FAILSAFE配置4. FAILSAFE阶段&状态机5. 参考资料 1. 源由 最近因为炸机&#xff0c;百思不得其解。 关于炸鸡的过程&#xff0c;就不再展开&#xff0c;都是“泪”啊&#xff01;想进一步了解的&#xff0c;请参阅前面的…

科普一下Elasticsearch中BM25算法的使用

首先还是先了解几个概念&#xff0c;Elasticsearch是一个开源的分布式搜索和分析引擎&#xff0c;它使用一系列算法来计算文档的相关性分数&#xff08;relevance score&#xff09;。这些算法用于确定查询与文档的匹配程度&#xff0c;以便按相关性对搜索结果进行排序。以下是…

【C++】多线程编程一(初识并发和多线程)

目录 一、并发和并行的概念 1.并发 2.并行 3.并发和并行的区别 二、并发的途径 多进程并发 多线程并发 三、C11相关多线程编程的头文件 一、并发和并行的概念 1.并发 并发&#xff1a;指同一时刻只能有一条指令执行&#xff0c;但是多个进程指令被快速地轮换执行&#…

C语言--文件操作

文章目录 前言文件文件名 文件的打开和关闭文件指针文件的打开和关闭 文件的顺序读写fgetc、fputcfgets、fputsfprintf、fsanffread、fwrite 文件的随机读写fseekftellrewind 文本文件和二进制文件文件读取结束的判定feof 文件缓冲区 前言 在我们写完一个程序之后&#xff0c;…

【数据结构】树二叉树的概念以及堆的详解

⭐️ 往期相关文章 ✨链接1&#xff1a;【数据结构】顺序表 ✨链接2&#xff1a;【数据结构】单链表 ✨链接3&#xff1a;【数据结构】双向带头循环链表 ✨链接4&#xff1a;【数据结构】栈和队列 ⭐️ 树的概念 百度百科的解释&#xff1a;树是一种非线性的数据结构&#xf…

Jmeter四种关联方法讲解

目录 方法一&#xff0c;从前一个请求中取&#xff0c;用正则表达式提取器。 二、json path extractor 三、json extractor 四、XPath Extractor 方法一&#xff0c;从前一个请求中取&#xff0c;用正则表达式提取器。 具体方法&#xff0c;在需要获得数据的请求上右击添加…

【09】STM32·HAL库-新建HAL库版本MDK工程 | 下载STM32固件库

目录 1&#xff0c;新建工程前的准备工作&#xff08;了解&#xff09;1.1下载相关STM32Cube 官方固件包&#xff08;F1/F4/F7/H7&#xff09; 2&#xff0c;新建HAL库版本MDK工程步骤&#xff08;熟悉&#xff09;2.1新建工程文件夹2.1.1Drivers文件夹2.1.2Middlewares文件夹2…