问道gRPC_v1.0.0
文章目录
- 简介
- 诞生
- 主要用途
- 基础
- 数据结构
- gRPC如何调用
- gRPC与微服务
- 与SpringCloud整合
- 预配置
- 编码
- 实现&&配置
- 调用RPC,执行客户端代码,即可调用
- 新增字段
- 资源消耗
- 报错
- 服务提供者不在线
文件名称 | 版本号 | 作者 | 版本 | |
---|---|---|---|---|
问道gRPC | v1.0.0 | 学生宫布 | 8416837 |
net-devh-grpc.version 2.7.0.RELEASE grpc.version 1.29.0 protobuf.version 3.4.0 |
简介
诞生
Google的孩子
主要用途
进程通信
基础
- 检测是否安装protobuf
go version
protoc --version
- 下载 protoc-3.10.1-win64.zip
- 将安装目录/bin配置到Win环境变量
数据结构
数据格式Protobuf
查看我写的protobuf教程
一个简单的proto文件
syntax = 'proto3';package proto;message Human {int32 age = 1;string name = 2;int32 sex = 3;
}
安装编译插件
go get -u github.com/golang/protobuf/protoc-gen-go
进入该文件目录使用gitbash编译该文件
protoc --go_out=. --python_out=. fruit.proto
编译完毕,说明插件安装成功:
gRPC如何调用
grpc提供的原生接口服务无法被http模式访问
- 在golang代码里调用 查看教程
- 查看GitHub代码
gRPC与微服务
- 服务消费模式,与FeignClient、Dubbo RPC模式接近
- 路由表 来自注册中心
- 负载均衡 软负载 根据路由表轮询、一致性hash、活跃度等
与SpringCloud整合
- 基础→ Protocol Buffers教程
- 进入安装Nacos教程,gRPC服务注册到Nacos
预配置
- pom.xml 核心配置节选
<plugin><groupId>org.xolstice.maven.plugins</groupId><artifactId>protobuf-maven-plugin</artifactId><version>0.5.0</version><configuration><protocArtifact>com.google.protobuf:protoc:3.1.0:exe:${os.detected.classifier}</protocArtifact><pluginId>grpc-java</pluginId>
<!-- gRPC等相关 - start--><pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact><!--默认值--><protoSourceRoot>${project.basedir}/src/main/proto</protoSourceRoot><!--默认值--><!--<outputDirectory>${project.build.directory}/generated-sources/protobuf/java</outputDirectory>--><outputDirectory>${project.basedir}/src/main/java</outputDirectory><!--设置是否在生成java文件之前清空outputDirectory的文件,默认值为true,设置为false时也会覆盖同名文件--><clearOutputDirectory>false</clearOutputDirectory>
<!-- gRPC等相关 - end--></configuration><executions><execution><goals><goal>compile</goal><goal>compile-custom</goal></goals></execution></executions></plugin>
- 引入插件,可能报红↓
引入变量就不会报红了↓
<properties><grpc.version>1.29.0</grpc.version><os.detected.classifier>windows-x86_64</os.detected.classifier><net-devh-grpc.version>2.7.0.RELEASE</net-devh-grpc.version></properties>
编码
新建目录
src\main\proto
编辑Human.proto文件
syntax = "proto3"; // 版本号。与proto2差别不大
option java_package = "test.pro.domain";
option java_outer_classname = "HumanDomain";// 简单定义一个rpc服务和一个接口 定义了接口的输入输出 而输入输出都在下述结构体
service TheFirstRpc {rpc SayHello ( HelloParams) returns ( Human ) {}
}message HelloParams { // 类结构体string name = 1;
}
message Human { // 类结构体int32 id = 1; // 结构体属性int32 sex = 2; // 数字作为key,省空间。不一定要连续string age = 3;
}
实现&&配置
- 引入protobuf依赖↓
父项目
<properties><protobuf.version>3.4.0</protobuf.version>
... ...
<dependencyManagement><dependencies><dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java</artifactId><version>${protobuf.version}</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-all</artifactId><version>${grpc.version}</version></dependency>
子项目
<dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java</artifactId></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-all</artifactId></dependency>
- 编译 找到Maven插件
执行插件compile && compile-custom命令,或自己打命令(不推荐)
若报错:
说明缺少依赖
编译成功
这样proto就变成了Java类,以备后续使用
- 服务端实现RPC
服务提供者配置
grpc:server:port: 9080 # 不配置默认9090
服务端引入依赖包
<net-devh-grpc.version>2.7.0.RELEASE</net-devh-grpc.version><dependency><groupId>net.devh</groupId><artifactId>grpc-client-spring-boot-starter</artifactId><version>${net-devh-grpc.version}</version></dependency><dependency><groupId>net.devh</groupId><artifactId>grpc-server-spring-boot-starter</artifactId><version>${net-devh-grpc.version}</version></dependency>
前提是服务端和客户端都引入RPC相关Java类
上一步只是编译了RPC结构,并未实现它。因此,可以在服务端(提供者)编写实现代码,以备客户端(消费者)调用。
注意:有些类的名字改成你自己的。这些类主要与proto关联。
package test.rpc;/*** 功能:rpc实现** @author: cc* @qq: 8416837* @date: 2020/5/17 15:48*/import io.grpc.stub.StreamObserver;
import lombok.extern.slf4j.Slf4j;
import net.devh.boot.grpc.server.service.GrpcService;
import test.pro.domain.HumanDomain;
import test.pro.domain.TheFirstRpcGrpc;@Slf4j
@GrpcService
public class HelloService extends TheFirstRpcGrpc.TheFirstRpcImplBase {@Overridepublic void sayHello(HumanDomain.HelloParams request, StreamObserver<HumanDomain.Human> responseObserver) {String name = request.getName();log.debug("{} === {}", "[请求参数]", request);final HumanDomain.Human.Builder replyBuilder = HumanDomain.Human.newBuilder().setSex(1).setAge(18).setName(name);responseObserver.onNext(replyBuilder.build());responseObserver.onCompleted();}
}
- 客户端配置文件
# grpc
grpc:client:TheFirstRpc: # 服务名称address: static://localhost:9080negotiationType: plaintext# 服务# GLOBAL:# address: static://localhost:9080 // 服务端的端口号# negotiation-type: plaintext
- 客户端代码,节选,注意区分:
@GrpcClient("TheFirstRpc")private TheFirstRpcGrpc.TheFirstRpcBlockingStub theFirstRpcBlockingStub;@GetMapping("/grpc/{name}")public Object sayHello(@PathVariable("name") String name) throws InterruptedException {// 服务端默认ip是微服务ip,端口是9090HumanDomain.Human response = theFirstRpcBlockingStub.sayHello(HumanDomain.HelloParams.newBuilder().setName(name).build());String resStr = response.toString();return resStr;}
调用RPC,执行客户端代码,即可调用
使用REST API触发客户端调用服务端RPC,即可完成调用,原理见上述代码
把RPC调用结果toString后再返回,避免REST Json返回响应时报错。按上述代码,实操调用成功。
- 调用成功
新增字段
在proto新增字段之后,执行命令↓
资源消耗
- 开启grpc Nacos通讯后,Nacos消耗运存情况:
运存占用不多,持续增长中,但是吃cpu,nacos 是1.2.1, 可能是bug, 多方运行核实一下,例如普通的不带grpc的微服务会不会出现这种大量吃cpu的情况
报错
服务提供者不在线
报错:
io.grpc.StatusRuntimeException: UNAVAILABLE: io exceptionat io.grpc.stub.ClientCalls.toStatusRuntimeException(ClientCalls.java:244) ~[grpc-stub-1.29.0.jar:1.29.0]Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Error has been observed at the following site(s):|_ checkpoint ⇢ org.springframework.security.web.server.authorization.AuthorizationWebFilter [DefaultWebFilterChain]
解决办法:开启服务
问道gRPC_v1.0.0相关推荐
- 问道图语言_GraphQL_v1.0.0
版本号 作者 qq 版本号 v1.0.0 若布与宫合 8416837 graphql-java 14.0 文章目录 介绍 用途 概念 实操 Demo 依赖 Java 进阶 例子 准备 启动项目 执行 ...
- 问道openresty及其扩展产品Apache apisix等_v1.0.0
版本号 作者 qq 版本号 备注 v1.0.0 飞豺 8416837 openresty 1.15.8.2; apisix 0.8; etcd bitnami/etcd:3.3.13-r80 网关 文 ...
- ERROR: Failed to resolve: com.android.support:appcompat-v7:29.0.0
错误内容如下 ERROR: Failed to resolve: com.android.support:appcompat-v7:29.0.0 Show in Project Structure d ...
- No cached version of com.android.tools.build:gradle:2.0.0 available for offline mode.
异常场景 从AS2.0升级到2.1,重新编译工程后,抛出了如下异常 Error:A problem occurred configuring root project 'AndroidStudioPr ...
- Can't connect to MySQL server on '127.0.0.1' (10061) (code 2003)解决方法
先验证一下MySQL的服务是否开启,到计算机->管理->服务和应用程序->服务 如果服务已开启,就检查一下C:\WINDOWS\system32\drivers\etc目录下的hos ...
- pycharm中报错:Error: failed to send plot to http://127.0.0.1:63342
pycharm中报错:Error: failed to send plot to http://127.0.0.1:63342 import matplotlib.pyplot as plt impo ...
- mysql h 127.0.0.1_MySQL 连接时尽量使用 127.0.0.1 而不是 localhost
原因 Whenever you specify "localhost" or "localhost:port" as server, the MySQL cli ...
- 【记录】我在团队合作中遇到过的胎神(扑街仔)级别前端小伙伴 之 莫名其妙配置0.0.0.0这种IP访问
废话不说上代码 K同学和Z同学,你们知道吗?你这样加0.0.0.0 host带来的结果就是npm run dev项目的时候莫名其妙会在浏览器里面弹出一个0.0.0.0的访问 K同学和Z同学,你们脑子进 ...
- 在Win 8.1上安装配置FlashDevelop5.0.0
FlashDevelop是基于.NET框架的开源软件,只能在Windows环境下面运行,相较于Flash CS和FlexBuilder, 它非常轻量级.FlashDevelop只是一个代码编辑器,而不 ...
最新文章
- 被称为“第五代 AI”的神经形态计算进展到哪一步了?
- Shell中要如何调用别的shell脚本
- XShell+Xmanager实现在XShell中显示远程服务器的图形界面
- 深度学习时代的数据科学和自然语言处理
- Java黑皮书课后题第10章:**10.23(实现String类)在Java库中提供了String类,给出你自己对下面方法的实现(将新类命名为MyString2)
- BZOJ 1396:识别子串 SA+树状数组+单调队列
- [设计模式]开闭原则
- (转载)分享常用的GoLang包工具
- 【Python】字符串(String)
- 深圳 | 腾讯 Robotics X 招聘语义视觉方向实习生和正式员工
- Js获取下拉框当前选择项的文本和值
- 通配符星号(*)和问号(?)的区别
- ANTLR编辑器,语言转换。
- matlab中figure的基本用法
- NeoKylin(中标麒麟)6.5 更新yum源
- dnf单机版 不显示服务器,dnf单机云服务器
- Linux-常用快捷键
- 基于屏幕空间渲染的液体模拟
- 【POJ3349】snowflakes
- 京东JOS API 接入使用笔记
热门文章
- 迈克尔逊干涉仪仿真程序_如何使用迈克尔逊编程语言在Tezos上编写智能合约
- 前端的全屏与退出全屏
- 基于test log的自动结果分析
- python读取cad_python3读取autocad图形文件.py实例
- 《鬼吹灯》作者申请“鬼吹灯”商标,为什么还会被驳回?
- “C不再是一种编程语言”
- PostgreSQL修炼之道:从小工到专家. 导读
- 上海航芯 |带CAN的128k Flash通用MCU ACM32F0优势
- Error:(24, 0) Could not find method implementation() for arguments [directory 'libs'] on object of t
- error execution phase preflight: couldn‘t validate the identity of the API Server: abort connecting