文章目录

  • 简介
    • 诞生
    • 主要用途
  • 基础
    • 数据结构
    • gRPC如何调用
  • gRPC与微服务
    • 与SpringCloud整合
      • 预配置
      • 编码
      • 实现&&配置
      • 调用RPC,执行客户端代码,即可调用
      • 新增字段
      • 资源消耗
    • 报错
      • 服务提供者不在线
文件名称 版本号 作者 qq 版本
问道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相关推荐

  1. 问道图语言_GraphQL_v1.0.0

    版本号 作者 qq 版本号 v1.0.0 若布与宫合 8416837 graphql-java 14.0 文章目录 介绍 用途 概念 实操 Demo 依赖 Java 进阶 例子 准备 启动项目 执行 ...

  2. 问道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 网关 文 ...

  3. 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 ...

  4. 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 ...

  5. Can't connect to MySQL server on '127.0.0.1' (10061) (code 2003)解决方法

    先验证一下MySQL的服务是否开启,到计算机->管理->服务和应用程序->服务 如果服务已开启,就检查一下C:\WINDOWS\system32\drivers\etc目录下的hos ...

  6. 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 ...

  7. mysql h 127.0.0.1_MySQL 连接时尽量使用 127.0.0.1 而不是 localhost

    原因 Whenever you specify "localhost" or "localhost:port" as server, the MySQL cli ...

  8. 【记录】我在团队合作中遇到过的胎神(扑街仔)级别前端小伙伴 之 莫名其妙配置0.0.0.0这种IP访问

    废话不说上代码 K同学和Z同学,你们知道吗?你这样加0.0.0.0 host带来的结果就是npm run dev项目的时候莫名其妙会在浏览器里面弹出一个0.0.0.0的访问 K同学和Z同学,你们脑子进 ...

  9. 在Win 8.1上安装配置FlashDevelop5.0.0

    FlashDevelop是基于.NET框架的开源软件,只能在Windows环境下面运行,相较于Flash CS和FlexBuilder, 它非常轻量级.FlashDevelop只是一个代码编辑器,而不 ...

最新文章

  1. 被称为“第五代 AI”的神经形态计算进展到哪一步了?
  2. Shell中要如何调用别的shell脚本
  3. XShell+Xmanager实现在XShell中显示远程服务器的图形界面
  4. 深度学习时代的数据科学和自然语言处理
  5. Java黑皮书课后题第10章:**10.23(实现String类)在Java库中提供了String类,给出你自己对下面方法的实现(将新类命名为MyString2)
  6. BZOJ 1396:识别子串 SA+树状数组+单调队列
  7. [设计模式]开闭原则
  8. (转载)分享常用的GoLang包工具
  9. 【Python】字符串(String)
  10. 深圳 | 腾讯 Robotics X 招聘语义视觉方向实习生和正式员工
  11. Js获取下拉框当前选择项的文本和值
  12. 通配符星号(*)和问号(?)的区别
  13. ANTLR编辑器,语言转换。
  14. matlab中figure的基本用法
  15. NeoKylin(中标麒麟)6.5 更新yum源
  16. dnf单机版 不显示服务器,dnf单机云服务器
  17. Linux-常用快捷键
  18. 基于屏幕空间渲染的液体模拟
  19. 【POJ3349】snowflakes
  20. 京东JOS API 接入使用笔记

热门文章

  1. 迈克尔逊干涉仪仿真程序_如何使用迈克尔逊编程语言在Tezos上编写智能合约
  2. 前端的全屏与退出全屏
  3. 基于test log的自动结果分析
  4. python读取cad_python3读取autocad图形文件.py实例
  5. 《鬼吹灯》作者申请“鬼吹灯”商标,为什么还会被驳回?
  6. “C不再是一种编程语言”
  7. PostgreSQL修炼之道:从小工到专家. 导读
  8. 上海航芯 |带CAN的128k Flash通用MCU ACM32F0优势
  9. Error:(24, 0) Could not find method implementation() for arguments [directory 'libs'] on object of t
  10. error execution phase preflight: couldn‘t validate the identity of the API Server: abort connecting