百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

把远程进程通讯grpc引入到Spring boot maven项目中

csdh11 2025-02-19 11:37 13 浏览

1、参考链接:

gRPC官网:https://grpc.io/

HTTP2:https://http2.github.io/

Protocol Buffers:https://protobuf.dev/

grpc中文文档:
http://doc.oschina.net/grpc

Java版文档:
https://grpc.io/docs/languages/java/quickstart/

Go版gRPC文档地址:
https://grpc.io/docs/languages/go/

2、简单介绍

gRPC 是一个高性能、开源、通用的RPC框架,由Google推出,基于HTTP2 协议标准设计开发,默认采用Protocol Buffers 数据序列化协议,支持多种开发语言。

推荐gRPC和istio配合使用,istio基于k8s提供服务治理等功能。

3、RPC通用流程和Grpc流程



4、grpc引入到spring boot项目的步骤

(1)编写ProtocolBuffers文件

ProtoBuf是gRPC默认支持的数据存储和通讯协议,或者称为数据序列化协议,和XML、JSON、HESSIAN类似。

实际上ProtoBuf文件也是服务定义文件(IDL),通常包含三个部分:

第一部分,协议版本、头部声明和选项

A、协议版本:

syntax = "proto3";

B、通用包名指定

package google.protobuf;

C、java包名指定

option java_package = "com.google.protobuf";

D、Java类名指定

option java_outer_classname = "DescriptorProtos";

E、优化

option optimize_for = SPEED;

option optimize_for = CODE_SIZE;

option optimize_for = LITE_RUNTIME;

F、编译产生的java文件是多个

option java_multiple_files = true;

第二部分,消息定义

其中,string和int32是字段类型,其他常用类型还有double、float、int64、bool、bytes,query和page_number是字段名称,1/2/3是字段标识,1~15的标识最快。Message是消息关键字,searchrequest是消息名称。

枚举型:

Map字段类型:

字段类型前面可以加optional和repeated关键词,optional表示可以设置也可以不设置,repeated表示可以重复若干次。

以上图5,map示例相当于:

第三部分,服务定义

其中,service是关键词,searchservice是服务名称,rpc是关键词,search是服务里面的方法名称,searchrequest是入参,searchresponse是出参。

(2)编译proto文件

编译方法有两种,一是下载编译工具,二是直接在maven项目中指定build工具包。

编译工具下载参见:

https://github.com/protocolbuffers/protobuf#protobuf-compiler-installation

安装方法参见其中的readme。

在maven项目中指定build工具包,如下图,在pom文件中加入build插件:

protobuf-maven-plugin的相关文档如下:

https://www.xolstice.org/protobuf-maven-plugin/compile-mojo.html

其中说明了如下主要参数:

- protocArtifact: protoc编译器工具的格式规范,
groupId:artifactId:version[:type[:classifier]]。如果指定了该参数,protoc将尝试按照指定的参数对文件proto文件进行编译。

- protocExecutable:配置protoc的编译执行程序的路径。

- protocPluginDirectory: protoc的执行文件目录。

- protoSourceRoot: 原始proto文件的路径,比如${project.basedir}/src/main/proto。

- outputDirectory: 编译后生成.java文件的路径,比如:${project.basedir}/src/main/java。

-
temporaryProtoFileDirectory: 临时使用目录。

- clearOutputDirectory: 设置是否在生成java文件之前清空outputDirectory的文件,默认值为true,设置为false时也会覆盖同名文件。

-
additionalProtoPathElement:附加的源proto文件定义路径,如果设备源路径没找到,会到该目录找。

- excludes:排除不需要编译的文件列表。

- includes:包含需要编译的proto文件列表,默认如下:

**/*.proto

(3)创建使用grpc的springboot项目步骤

使用Spring Starter Project或者Import Spring Getting Started Content创建三个项目:

Grpc-lib-test:提供proto文件,并由此自动生成服务类和消息类

Grpc-server-test:提供grpc服务器端

Grpc-client-test:提供grpc客户端

第一个项目:Grpc-lib-test

POM文件如下:

然后,编写一个示例proto文件放到src/main/proto目录下:

最后,使用如下指令来自动产生源代码:

这个指令就是mvn generate-sources,由于相当于执行mvn compile 和 mvn compile-custom。

在IDE中使用install构建安装(或者执行mvn clean install -D maven.test.skip=true),等待另外两个模块调用。

第二个项目:grpc-server-test

POM文件如下:

新增日志拦截器:

新增日志拦截器的配置类

新增服务类:

在IDE中使用install构建安装(或者执行mvn clean install -D maven.test.skip=true)。

使用java -jar
target/grpc-server-test-0.0.1-SNAPSHOT.jar运行,如下图。注意java版本是17(“无效的标记: --release”这个错误的解决办法是从jdk1.8改为17)。

第三个项目:grpc-client-test

POM文件:

新增日志拦截器:

新增日志拦截器的配置类:

新增grpc客户端服务类:

新增控制器类:

在IDE中使用install构建安装(或者执行mvn clean install -D maven.test.skip=true)。

使用java -jar
target/grpc-client-test-0.0.1-SNAPSHOT.jar运行。

最后,看看效果。我们使用浏览器来测试。在浏览器中输入地址localhost:8088后:

切换到gRPC客户端grpc-client-test启动界面:

切换到gRPC服务器端grpc-server-test启动界面:

相关推荐

探索Java项目中日志系统最佳实践:从入门到精通

探索Java项目中日志系统最佳实践:从入门到精通在现代软件开发中,日志系统如同一位默默无闻却至关重要的管家,它记录了程序运行中的各种事件,为我们排查问题、监控性能和优化系统提供了宝贵的依据。在Java...

用了这么多年的java日志框架,你真的弄懂了吗?

在项目开发过程中,有一个必不可少的环节就是记录日志,相信只要是个程序员都用过,可是咱们自问下,用了这么多年的日志框架,你确定自己真弄懂了日志框架的来龙去脉嘛?下面笔者就详细聊聊java中常用日志框架的...

物理老师教你学Java语言(中篇)(物理专业学编程)

第四章物质的基本结构——类与对象...

一文搞定!Spring Boot3 定时任务操作全攻略

各位互联网大厂的后端开发小伙伴们,在使用SpringBoot3开发项目时,你是否遇到过定时任务实现的难题呢?比如任务调度时间不准确,代码报错却找不到方向,是不是特别头疼?如今,随着互联网业务规模...

你还不懂java的日志系统吗 ?(java的日志类)

一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...

谈谈枚举的新用法--java(java枚举的作用与好处)

问题的由来前段时间改游戏buff功能,干了一件愚蠢的事情,那就是把枚举和运算集合在一起,然后运行一段时间后buff就出现各种问题,我当时懵逼了!事情是这样的,做过游戏的都知道,buff,需要分类型,且...

你还不懂java的日志系统吗(javaw 日志)

一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...

Java 8之后的那些新特性(三):Java System Logger

去年12月份log4j日志框架的一个漏洞,给Java整个行业造成了非常大的影响。这个事情也顺带把log4j这个日志框架推到了争议的最前线。在Java领域,log4j可能相对比较流行。而在log4j之外...

Java开发中的日志管理:让程序“开口说话”

Java开发中的日志管理:让程序“开口说话”日志是程序员的朋友,也是程序的“嘴巴”。它能让程序在运行过程中“开口说话”,告诉我们它的状态、行为以及遇到的问题。在Java开发中,良好的日志管理不仅能帮助...

吊打面试官(十二)--Java语言中ArrayList类一文全掌握

导读...

OS X 效率启动器 Alfred 详解与使用技巧

问:为什么要在Mac上使用效率启动器类应用?答:在非特殊专业用户的环境下,(每天)用户一般可以在系统中进行上百次操作,可以是点击,也可以是拖拽,但这些只是过程,而我们的真正目的是想获得结果,也就是...

Java中 高级的异常处理(java中异常处理的两种方式)

介绍异常处理是软件开发的一个关键方面,尤其是在Java中,这种语言以其稳健性和平台独立性而闻名。正确的异常处理不仅可以防止应用程序崩溃,还有助于调试并向用户提供有意义的反馈。...

【性能调优】全方位教你定位慢SQL,方法介绍下!

1.使用数据库自带工具...

全面了解mysql锁机制(InnoDB)与问题排查

MySQL/InnoDB的加锁,一直是一个常见的话题。例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?下面是不同锁等级的区别表级锁:开销小,加锁快;不会出现死锁;锁定粒度...

看懂这篇文章,你就懂了数据库死锁产生的场景和解决方法

一、什么是死锁加锁(Locking)是数据库在并发访问时保证数据一致性和完整性的主要机制。任何事务都需要获得相应对象上的锁才能访问数据,读取数据的事务通常只需要获得读锁(共享锁),修改数据的事务需要获...