网站首页 > 技术文章 正文
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文件列表,默认如下:
<includes>
<include>**/*.proto</include>
</includes>
(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启动界面:
猜你喜欢
- 2025-01-09 精通Spring Boot 3 : 13. Spring Cloud 与 Spring Boot (4)
- 2025-01-09 Spring Boot集成Redis Search快速入门Demo
- 2025-01-09 Spring Boot 3.x嵌入MongoDB 进行测试
- 2025-01-09 java安全之fastjson链分析
- 2025-01-09 MyBatis初级实战之五:一对一关联查询
- 2025-01-09 精通Spring Boot 3 : 8. Spring Boot 测试 (2)
- 2025-01-09 DevSecOps 管道: 使用Jenkins实现安全的多语言应用程序
- 2025-01-09 Liquibase+Spring+Maven: 管理数据库轻松搞定
- 2025-01-09 比较一下JSON与XML两种数据格式?
- 2025-01-09 Java批量导入时,如何去除重复数据并返回结果?
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)