【SpringBoot3】结合 gRpc 实现远程服务调用

一、gRPC概念介绍

gRPC(Google Remote Procedure Call,Google远程过程调用)是一个现代开源高性能远程过程调用(RPC)框架,可以在任何环境中运行。它由Google开发,旨在帮助开发人员更轻松地构建分布式应用,特别是当代码可能在不同地方运行的时候。

gRPC是一个高性能、开源和通用的RPC框架,它基于HTTP/2设计,并支持多种编程语言和平台。

随着其开源和广泛应用,gRPC已成为云原生计算基金会(CNCF)的一个孵化项目,被大量组织和企业采用。

核心特点

  1. 高性能:gRPC使用HTTP/2作为传输协议,支持二进制组帧、多路复用、双向全双工通信和流式处理等功能,从而显著提高性能。与JSON相比,gRPC的消息序列化速度更快,消息体积更小。
  2. 跨平台与跨语言:gRPC支持多种编程语言和平台,如C++、Java、Python、Go等,使得开发人员可以在不同的环境中使用统一的RPC框架。
  3. 灵活性与可扩展性:gRPC提供了丰富的功能,如负载平衡、跟踪、健康检查和身份验证等,这些功能都是可插拔的,可以根据需要进行配置和扩展。
  4. 安全性:gRPC支持TLS加密,确保数据在传输过程中的安全性。同时,它还支持多种认证机制,如JWT(JSON Web Tokens)等,以确保服务的访问安全。

工作原理

  • 服务定义:在gRPC中,服务通过.proto文件进行定义。这些文件包含了服务的接口描述、消息类型等信息。开发人员可以使用Protocol Buffers(简称Protobuf)来定义这些结构化的消息。
  • 代码生成:基于.proto文件,gRPC提供了protoc编译器来生成支持多种编程语言的客户端和服务端代码。这使得开发人员可以轻松地实现跨语言的RPC调用。
  • 通信过程:在客户端和服务端之间,gRPC通过HTTP/2协议进行通信。客户端发送请求到服务端,服务端处理请求并返回响应。整个通信过程都是基于二进制格式的,从而提高了性能和效率。

应用场景

  • 微服务架构:在微服务架构中,gRPC可以有效地连接多语言服务,实现服务间的快速通信。
  • 分布式计算:gRPC适用于分布式计算的最后一英里,将设备、移动应用程序和浏览器连接到后端服务。
  • API设计:与REST API相比,gRPC提供了一种更加高效和灵活的API设计风格,适用于需要高性能和低延迟的应用场景。

二、简单使用步骤

首先,你需要定义gRPC服务。这里我们使用一个简单的helloworld.proto文件。

1. helloworld.proto

syntax = "proto3";option java_multiple_files = true;
option java_package = "com.example.grpc";
option java_outer_classname = "HelloWorldProto";package helloworld;service HelloWorldService {rpc SayHello (HelloRequest) returns (HelloReply) {}
}message HelloRequest {string name = 1;
}message HelloReply {string message = 1;
}

2. 生成Java代码

使用protoc编译器和gRPC插件生成Java代码。

protoc --java_out=./src/main/java --grpc-java_out=./src/main/java --plugin=protoc-gen-grpc-java=/path/to/protoc-gen-grpc-java-1.x.x-linux-x86_64.exe helloworld.proto

确保将/path/to/protoc-gen-grpc-java-1.x.x-linux-x86_64.exe替换为你的protoc-gen-grpc-java插件的实际路径。

3. 服务端实现

在Spring Boot应用中,你可以创建一个组件来实现gRPC服务。

package com.example.grpc;import io.grpc.stub.StreamObserver;
import net.devh.boot.grpc.server.service.GrpcService;@GrpcService
public class HelloWorldServiceImpl extends HelloWorldServiceGrpc.HelloWorldServiceImplBase {@Overridepublic void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) {String message = "Hello, " + req.getName() + "!";HelloReply reply = HelloReply.newBuilder().setMessage(message).build();responseObserver.onNext(reply);responseObserver.onCompleted();}
}

4. 客户端调用

在Spring Boot应用中,你可以创建一个服务来调用gRPC服务。这里使用JUnit单元测试

import com.example.grpc.HelloReply;
import com.example.grpc.HelloRequest;
import com.example.grpc.HelloWorldServiceGrpc;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import org.junit.jupiter.api.Test;public class HelloWorldClientServiceTest {@Testpublic void sayHello() {ManagedChannel channel = ManagedChannelBuilder.forTarget("localhost:9091").usePlaintext().build();HelloWorldServiceGrpc.HelloWorldServiceBlockingStub stub = HelloWorldServiceGrpc.newBlockingStub(channel);HelloReply response = stub.sayHello(HelloRequest.newBuilder().setName("Lisa").build());System.out.println("response = " + response);channel.shutdown();}
}

5. 构建和运行

确保你的pom.xml中包含了必要的gRPC和Spring Boot依赖。

然后执行maven compile 指令生成java代码

mvn compile 

启动SpringBoot服务端,然后运行测试用例,得到如下结果:

response = message: "Hello, Lisa!"

三、添加gRPC相关依赖包

参考 grpc-spring

在Spring Boot项目中使用gRPC,你需要在项目的pom.xml 中添加相关的gRPC依赖。

以下是在Maven项目中添加gRPC依赖的示例。

<dependencies><dependency><groupId>com.salesforce.servicelibs</groupId><artifactId>jprotoc</artifactId><version>1.2.2</version></dependency><dependency><groupId>net.devh</groupId><artifactId>grpc-spring-boot-starter</artifactId><version>${grpc-spring-boot-starter.version}</version></dependency>
</dependencies><properties><protobuf-maven-plugin.version>0.6.1</protobuf-maven-plugin.version><protoc.version>3.25.1</protoc.version><grpc-java.version>1.64.0</grpc-java.version><os-maven-plugin.version>1.7.1</os-maven-plugin.version>
</properties>

请注意,你需要将${grpc-java.version}${grpc-spring-boot-starter.version}替换为你想要使用的具体版本号。

这些依赖项包括了gRPC的基础库、与Protobuf的集成、以及Spring Boot对gRPC的支持。确保你使用的版本是兼容的,并根据你的项目需求进行调整。如果你还需要使用到其他的gRPC功能(如安全认证、健康检查等),你可能需要添加更多的依赖项。

四、使用Maven插件自动生成proto对应代码

参考 os-maven-plugin 和 protobuf-maven-plugin

如果你希望通过maven编译时自动生成proto对应的java代码,则需要添加Maven插件和相关依赖

<properties><protobuf-maven-plugin.version>0.6.1</protobuf-maven-plugin.version><protoc.version>3.25.1</protoc.version><grpc-java.version>1.64.0</grpc-java.version><os-maven-plugin.version>1.7.1</os-maven-plugin.version><grpc-spring-boot-starter.version>3.1.0.RELEASE</grpc-spring-boot-starter.version>
</properties>
//...//
<dependencies><dependency><groupId>com.salesforce.servicelibs</groupId><artifactId>jprotoc</artifactId><version>1.2.2</version></dependency><!-- gRPC Server + Client --><dependency><groupId>net.devh</groupId><artifactId>grpc-spring-boot-starter</artifactId><version>${grpc-spring-boot-starter.version}</version></dependency>
</dependencies>
// ... //<build><extensions><extension><groupId>kr.motd.maven</groupId><artifactId>os-maven-plugin</artifactId><version>${os-maven-plugin.version}</version></extension></extensions><pluginManagement><plugins><!-- protobuf-maven-plugin --><plugin><groupId>org.xolstice.maven.plugins</groupId><artifactId>protobuf-maven-plugin</artifactId><version>${protobuf-maven-plugin.version}</version><extensions>true</extensions><executions><execution><id>protoc-compile</id><phase>generate-sources</phase><goals><goal>compile</goal><goal>compile-custom</goal></goals></execution><execution><id>protoc-test-compile</id><phase>generate-test-sources</phase><goals><goal>test-compile</goal><goal>test-compile-custom</goal></goals></execution></executions><configuration><protocArtifact>com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}</protocArtifact><attachProtoSources>true</attachProtoSources><useArgumentFile>true</useArgumentFile><writeDescriptorSet>false</writeDescriptorSet><attachDescriptorSet>false</attachDescriptorSet><includeDependenciesInDescriptorSet>false</includeDependenciesInDescriptorSet><checkStaleness>true</checkStaleness><pluginId>grpc-java</pluginId><pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact><protocPlugins></protocPlugins></configuration></plugin></plugins></pluginManagement><plugins><plugin><groupId>org.xolstice.maven.plugins</groupId><artifactId>protobuf-maven-plugin</artifactId></plugin></plugins>
</build>

通过上面配置后,你就可以在项目中通过指令mvn compile生成proto对应的java代码,不需要通过外包指令了。

参考

  • https://protobuf.com.cn/overview/
  • https://protobuf.dev/getting-started/javatutorial/
  • https://protobuf.dev/reference/java/java-generated/
  • https://protobuf.dev/programming-guides/proto3/
  • https://github.com/grpc-ecosystem/grpc-spring
  • https://www.xolstice.org/protobuf-maven-plugin/
  • https://github.com/trustin/os-maven-plugin/

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

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

相关文章

昇思学习打卡-8-FCN图像语义分割

目录 FCN介绍FCN所用的技术训练数据的可视化模型训练模型推理FCN的优点和不足优点不足 FCN介绍 FCN主要用于图像分割领域&#xff0c;是一种端到端的分割方法&#xff0c;是深度学习应用在图像语义分割的开山之作。通过进行像素级的预测直接得出与原图大小相等的label map。因…

clean code-代码整洁之道 阅读笔记(第十六章)

第十六章 重构SerialDate 16.1 首先&#xff0c;让它能工作 利用SerialDateTests来完整的理解和重构SerialDate用Clover来检查单元测试覆盖了哪些代码&#xff0c;效果不行重新编写自己的单元测试经过简单的修改&#xff0c;让测试能够通过 16.2 让它做对 全过程&#xff1…

若依微服务初始化搭建教程

文章目录 &#x1f95d;从Gitee拉取代码&#x1f344;初始化项目配置配置项目maven配置项目JDKmaven - clean - install &#x1f352;数据源配置创建config / seata数据库创建ry-cloud数据源导入ry-cloud数据 &#x1f370;启动Nacos下载Nacos修改Nacos配置双击startup.cmd启动…

梧桐数据库:查询优化器是提升数据库性能的关键技术

查询优化器是数据库管理系统中的核心组件之一&#xff0c;它的主要作用是在执行查询语句之前&#xff0c;选择最优的执行计划&#xff0c;以提高查询性能。 查询优化器的基本原理 查询优化器的主要目标是找到一个执行代价最小的查询执行计划。它通过对查询语句进行语法分析、…

GraphRAG:AI的全局文本理解革新

前言 在人工智能领域&#xff0c;处理和理解大量文本数据始终是一个挑战。随着大型语言模型&#xff08;LLMs&#xff09;的出现&#xff0c;自动化地进行复杂的语义理解和文本摘要变得可能。检索增强生成&#xff08;RAG&#xff09;方法因其能有效结合检索与生成技术&#x…

C++基础语法之重载引用和命名空间等

1.C关键字 c的关键字比我们的c语言的关键字多&#xff0c;c包容C语言并对C语言进行了补充&#xff0c;但是我们对关键字的学习是在我们后面逐渐学习的。这里我们的只是提供一个表格对齐了解一下。 2.命名空间 我们c出现了命名空间的概念&#xff0c;用关键字namespace来定义。…

LeetCode 二分查找

1.题目要求: 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。示例 1:输入: nums [-1,0,3,5,9,12], target 9 输出: 4 解…

论文阅读 - Intriguing properties of neural networks

Intriguing properties of neural networks 经典论文、对抗样本领域的开山之作 发布时间&#xff1a;2014 论文链接: https://arxiv.org/pdf/1312.6199.pdf 作者&#xff1a;Christian Szegedy, Wojciech Zaremba, Ilya Sutskever, Joan Bruna, Dumitru Erhan, Ian Goodfellow,…

信息技术课堂上如何有效防止学生玩游戏?

防止学生在信息技术课堂上玩游戏需要综合运用教育策略和技术手段。以下是一些有效的措施&#xff0c;可以用来阻止或减少学生在课堂上玩游戏的行为&#xff1a; 1. 明确课堂规则 在课程开始之初&#xff0c;向学生清楚地说明课堂纪律&#xff0c;强调不得在上课时间玩游戏。 制…

电阻负载柜的工作原理是什么?

电阻负载柜是用于模拟电网中各种负载特性的设备&#xff0c;广泛应用于电力系统、新能源发电、电动汽车充电站等领域。其工作原理主要包括以下几个方面&#xff1a; 1. 结构组成&#xff1a;电阻负载柜主要由变压器、调压器、电阻器、控制器、保护装置等部分组成。其中&#xf…

理解神经网络的通道数

理解神经网络的通道数 1. 神经网络的通道数2. 输出的宽度和长度3. 理解神经网络的通道数3.1 都是错误的图片惹的祸3.1.1 没错但是看不懂的图3.1.2 开玩笑的错图3.1.3 给人误解的图 3.2 我或许理解对的通道数3.2.1 动图演示 1. 神经网络的通道数 半路出嫁到算法岗&#xff0c;额…

数据防泄密软件精选|6款好用的数据防泄漏软件强推

某科技公司会议室&#xff0c;CEO张总、CIO李总、信息安全主管王经理正围绕最近发生的一起数据泄露事件展开讨论。 张总&#xff08;忧虑&#xff09;: 大家&#xff0c;这次的数据泄露事件对我们来说是个沉重的打击。客户信息的外泄不仅损害了我们的信誉&#xff0c;还可能面…

DAY2:插件学习

文章目录 插件学习ClangGoogle TestCMakeDoxygen 收获 插件学习 Clang 是什么&#xff1a;Clang 是指 LLVM 项目的编译器的前端部分&#xff0c;支持对 C 家族语言(C、C、Objective-C)的编译。Clang 的功能包括&#xff1a;词法分析、语法分析、语义分析、生成中间中间代码 L…

【源码+文档+调试讲解】智能仓储系统 JSP

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;智能仓储系统当然也不能排除在外。智能仓储系统是以实际运用为开发背景&#xff0c;运用软件工程开发方法&#xff0c;采…

Dubbo源码解析-过滤器Filter

上篇我们介绍了消费端负载均衡的原理 Dubbo源码解析-负载均衡-CSDN博客 因为篇幅问题&#xff0c;本文主单独Dubbo消费端负载均原理&#xff0c;从dubbo源码角度进行解析。 大家可以好好仔细读一下本文。有疑问欢迎留言。 接着说明&#xff0c;读Dubbo源码最好是先对Spring源码…

小车解决连接 Wi-Fi 后还不能上网问题

小车解决连接 Wi-Fi 后还不能上网问题 跟大家讲讲&#xff1a;为什么小车连接我们自己的热点以后还是不能联网呢&#xff1f; 小车连接我们的热点以后需要访问外面的网络&#xff0c;我们访问网络使用域名来进行的&#xff0c;所以要对域名进行解析&#xff0c;但是小车原来的域…

【HarmonyOS NEXT】鸿蒙线程安全容器集collections.Map

collections.Map 一种非线性数据结构。 文档中存在泛型的使用&#xff0c;涉及以下泛型标记符&#xff1a; K&#xff1a;Key&#xff0c;键V&#xff1a;Value&#xff0c;值 K和V类型都需为Sendable类型。 属性 元服务API&#xff1a;从API version 12 开始&#xff0c…

Android 系统网络、时间服务器配置修改

1.修改wifi 是否可用的检测地址&#xff1a; 由于编译的源码用的是谷歌的检测url,国内访问不了&#xff0c;系统会认为wifi网络受限&#xff0c;所以改成国内的地址 adb shell settings delete global captive_portal_https_urladb shell settings delete global captive_por…

猫咪浮毛太多怎么处理?6年铲屎官最值得买的猫毛空气净化器分享

作为一位拥有6年铲屎经验的铲屎官&#xff0c;家中既有宝宝又有毛孩子的铲屎官家庭来说&#xff0c;空气中的宠物异味和猫毛不仅影响生活质量&#xff0c;更关乎家人的健康。普通空气净化器虽然能够提供基本的空气净化&#xff0c;但对于养猫家庭的特定需求&#xff0c;如去除宠…

捕获 IPython 的输出:深入探索 %%capture 命令的妙用

捕获 IPython 的输出&#xff1a;深入探索 %%capture 命令的妙用 在 IPython 的强大功能中&#xff0c;%%capture 魔术命令是一颗隐藏的宝石&#xff0c;它允许用户捕获执行单元格的输出&#xff0c;无论是打印的文本、错误信息还是生成的图像。这对于创建干净的报告、自动化文…