rpc通信的实现方式(以grpc为例)

2023-05-16

基础知识

RPC(Remote Procedure Call):远程过程调用。它是一种调用方式,可以像调用本地方法那样调用远端方法。
protobuf(Protocol Buffers):一种开源跨平台的序列化数据结构的协议,是一种体积小、传送快的数据格式。
IDL(Interface description language):接口描述语言。

RPC需要解决的三个问题(工作原理):
通信问题(网络传输协议)
序列化和反序列问题(编译)
call ID 映射问题(函数映射)

服务类型:传入一个/多个请求对象,返回一个/多个返回对象

服务端server:服务提供方,提供结构体(函数)方法和参数等。
客户端client:服务调用方,调用结构体(函数)方法和参数等。

GRPC使用protobuf数据格式承接数据,使用http2传输。
GRPC优点:传输效率高(TCP/HTTP2),性能消耗低(二进制传输),服务治理方便(自带)。
gRPC 应用的开发流程:安装 protobuf 编译器 protoc、protoc-Go 插件;编写.proto文件、生成.go文件;编写服务器端与客户端代码。

GRPC应用的开发流程

安装插件;编写.proto文件、生成.go文件;编写服务器端与客户端代码。

0、安装 protobuf 编译器 protoc、protoc-Go 插件,获取后缀为.proto的protobuf文件的使用例demo。
1、在.proto文件中定义自己的结构体和参数,结构体内不包含内容。
2、运行IDL生成命令生成后缀为.pb.go的文件,里面包含编码(序列化)的代码和结构体的代码。将该文件分发到服务端和客户端上。
(在新版grpc中,官方推荐将编码和结构体的代码分为两个文件,使用protoc-gen-go和protoc-gen-go-grpc插件,文件后缀为.pb.go和_grpc.pb.go,对应为包含用于 protobuf 消息的编码(序列化/反序列化)的代码,包含 gRPC 服务器和客户端的代码)
3、我们需要在服务端中构建main执行函数,实现.pb.go的文件中的结构体(即接口)并注册。

服务端main.go:监听tcp端口,创建grpc服务器,实现结构体内容,把结构体注册到服务器里,运行服务器。
客户端main.go:使用grpc自己的NewEchoClient方法,通过ip:port建立连接,运行.pb.go的文件中自定义的单例方法,获取自定义结构体实例,在实例中调用服务端的方法。

让gRPC服务支持HTTP 客户端

思路:
1、使用runtime.NewServeMux(),新建一个Mux结构体,类似于httpMux路由
2、把下游节点注册到路由里面
3、使用ListenAndServe方法监听运行

var (
serverAddr=":8081"
grpcServerEndpoint = flag.String(  "grpc-server-endpoint",value: "localhost:50055", "gRPC server endpoint")
)
//可以理解为每个rs都需要持续跟下游建立连接
func run error{
ctx := context.Background( )
ctx, cancel := context.withCancel(ctx)
defer cancel( )
mux := runtime.NewServeMux( )
opts:=[]grpc.Dial0ption{grpc.withInsecure( )}
err := gw.RegisterEchoHandlerFromEndpoint(ctx,mux,*grpcServerEndpoint,opts)
if err != nil {
return err
}
return http.ListenAndServe(serverAddr, mux)

其他可实现功能

1、自定义codec 编码与解码规则CustomCodec
2、自定义未知方法回调UnknownServiceHandler
3、基于自定义回调可对请求服务做方法级管控

自定义编码器实现方法:构建支持原始字节、支持proto的解码器。如果拿到的是原始字节,则不需要解码,如果不是原始字节则需要通过proto转换一下。构建输出方法,设置到server参数中。
自定义回调实现方法:构建一个下游连接器。构建一个回调类。上游与下游相互拷贝数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

rpc通信的实现方式(以grpc为例) 的相关文章

  • GRPC服务发现

    给定一个地址GRPC http www grpc io 服务于 例如 ipv4 127 0 0 1 25000 是否有任何标准化查询或工具可以用来发现服务能够接收哪些 GRPC 请求 例如我正在寻找类似的东西 magic grpc serv
  • 如何在 onNext 调用中从上下文/范围中获取变量? (java/grpc)

    我正在与contexts https grpc io grpc java javadoc io grpc Contexts html within grpc java https github com grpc grpc java 我最终试
  • 张量流服务

    有谁知道如何创建用于张量流服务的 C 客户端 我的张量流服务安装 我使用张量流服务 dockerfile 安装了张量流服务 然后在容器内执行了以下操作 pip install tensorflow pip install tensorflo
  • proto 文件中定义的消息在最终的 dotnet 程序集中不可用

    我正在使用 dotnet standard 2 0 Visual Studio 2017 进行 gRPC 这就是我的整个项目的样子 消息 proto syntax proto3 package Messages message IdRequ
  • 为什么 ManagedChannelBuilder 没有用于与服务器建立 TLS 连接的 TLS 参数?

    在这个例子中https github com grpc grpc java blob master interop testing src test java io grpc testing integration TlsTest java
  • 在 Java 中伪造堆栈跟踪

    当您在 Java 中使用 RMI 时 异常的远程堆栈跟踪将在您收到异常时添加到前面 有点像这样 ERROR Client received error when doing stuff myapp FooBarException bla a
  • RPC 模型中的correlationId 和临时队列 - AMQP

    我正在读书RPC模型 http www rabbitmq com tutorials tutorial six java html在 AMQP 中使用 RabbitMQ 本教程创建了一个临时队列 并且还correlationId 临时队列是
  • grpc python 支持客户端和服务器上的多线程

    我想知道 grpc python 支持多线程吗 请分享一些参考 我已经在单线程中编写了代码 但不知道如何在多线程中编写 gRPC Python 在客户端和服务器上都支持多线程 至于服务器 您将创建带有线程池的服务器 因此默认是多线程的 对于
  • 如何从 gRPC 客户端获取状态代码 OK 响应

    当 python 响应成功时 我尝试从 gRPC 中的客户端获取状态代码 与 REST API 类似response status code 200 我需要断言这是一次成功的通话 我尝试通过这样做来解压响应 这是代码结构 不是实际的结构 r
  • 如何检查连接到 GRPC 服务器的客户端

    为了为我的 GRPC 服务器 客户端设置提供更好的调试信息 我正在尝试寻找一个 APIgrpc server这使我能够检查哪些客户端连接到服务器 我发现的最有希望的问题是问题 它给出了如何在 Java GRPC 中执行此操作的起点 http
  • NodeJs 错误 - 无法加载 gRPC 二进制模块,因为未为当前系统安装预期目录?

    我正在运行我的 NodeJs 应用程序 但收到错误 sudo usr local bin node app js Error Failed to load gRPC binary module because it was not inst
  • grpc go:如何在服务器端知道客户端何时关闭连接

    我正在使用 grpc go 我有一个 rpc 看起来大致像这样 196 service MyService 197 Operation 1 198 rpc Operation1 OperationRequest returns Operat
  • 后台线程c++中的grpc服务器

    我正在尝试在 MFC 应用程序的线程中运行 grpc 服务器 我有 直接来自 GRPC 示例的 grpc 部分 MyAppDlg h include
  • 在 Windows 上链接 gRPC for Visual C++

    我正在尝试在 Visual C 项目中使用 gRPC 到目前为止我有 1 构建gRPC with vcpkg vcpkg install grpc x64 windows2 综合vcpgk带有视觉工作室的库 vcpkg integrate
  • 如何在Python中使用gRPC处理自定义异常?

    我需要实现自定义异常来使用 Python 处理 gRPC 请求错误 对于 HTTP 请求 它很简单 当出现错误代码等时 请求库可以很好地捕获它 我正在寻找 gRPC 的类似方法来执行以下操作 try send gRPC request ex
  • 微服务之间的通信

    假设您有微服务 A B 和 C 它们当前都通过 HTTP 进行通信 假设服务 A 向服务 B 发送请求 服务 B 得到响应 然后 该响应中返回的数据必须发送到服务 C 进行一些处理 然后最终返回到服务 A 服务 A 现在可以在网页上显示结果
  • gwt hibernate 程序中的异常

    我正在尝试制作一个简单的 GWT RPC Hibernate 程序 将用户添加到 MySQL 数据库 我正在使用 Eclipse EE 该应用程序已成功将用户添加到数据库 但在编译时引发异常 这是我的应用程序的例外情况和来源 例外 Exce
  • gRPC(HTTP/2) 比使用 HTTP/2 的 REST 更快吗?

    目标是引入一种性能更好的传输和应用层协议latency and 网络吞吐量 目前 该应用程序使用REST with HTTP 1 1并且我们遇到了很高的延迟 我需要解决这个延迟问题并且我愿意使用gRPC HTTP 2 or 休息 HTTP2
  • gRPC + 图片上传

    我想创建一个简单的gRPC用户可以上传他 她的图片的端点 协议缓冲区声明如下 message UploadImageRequest AuthToken auth 1 An enum with either JPG or PNG FileTy
  • 我可以在谷歌云功能上托管nodejs GRPC服务器吗?

    我有一个在 AWS 实例上运行的 Nodejs GRPC 服务器 并且想迁移到谷歌云功能 这可能吗 我的无服务器选项有哪些 对的 这是可能的 to use 云功能 https cloud google com functions 为您gRP

随机推荐

  • 事件冒泡机制和事件委派 以及回调的匿名函数参数

    1 事件冒泡机制 xff1a 事件冒泡机制也就是当一个事件绑定到一个元素上时 xff0c 如果这个元素不存在或者回调函数返回ture 那么这个事件就会向上冒泡 xff0c 继续绑定这个元素的父级元素直至document xff08 如果事件
  • Linux 内核硬件抽象

    我们结束 PCI 的讨论 通过快速看一下系统如何处理在市场上的多种 PCI 控制器 这只 是一个信息性的小节 打算来展示给好奇的读者 内核的面向对象分布如何向下扩展到最 低层 用来实现硬件抽象的机制是通常的包含方法的结构 它是一个很强功能的
  • 客户端服务器信息交互,select实现客户端和服务器端的信息交互(TCP socket)

    实现功能 xff1a 客户端 xff1a lt 1 gt 从标准输入 键盘 读入信息 xff0c 然后通过socket发送到服务器端 lt 2 gt 接收来自服务器端的信息 xff0c 并显示到终端里 服务器端 xff1a lt 1 gt
  • 软件测试人员在工作中如何运用Linux

    从事过软件测试的小伙们就会明白会使用Linux是多么重要的一件事 xff0c 工作时需要用到 xff0c 面试时会被问到 xff0c 简历中需要写到 对于软件测试人员来说 xff0c 不需要你多么熟练使用Linux所有命令 xff0c 也不
  • Ubuntu虚拟机可以上网,可以ping网络,但是无法update和install,报连接不上服务器的错误解决方案:...

    http askubuntu com questions 711889 err apt get update on ubuntu 14 04 br br br 即使给Ubuntu配置了代理 xff0c terminal能ping通网络 xf
  • JT∕T 905 -2014 出租汽车服务管理信息系统的相关协议研究

    出租汽车服务管理信息系统 xff08 JT T 905 2014 xff09 国家的相关技术要求2014年7月正式出台 xff0c 总体有四部分 xff0c 第 1 部分 xff1a 总体技术要求 xff1b 第 2 部分 xff1a 运营
  • 常用的DC插头公头的尺寸

    2 0 0 6mm xff1a 这种应该是用在诺基亚黑白屏那种手机上的充电插头 2 5 0 7mm xff1a 这种不知用在哪里 3 5 1 35mm xff1a 应该是以前那种小型的磁带机放音机上用的 4 0 1 7mm xff1a 已知
  • 链式队列总结

    基本数据结构之 链式队列 链式队列就是一个操作受到限制的单链表 xff0c 学会了单链表再来写这个就是轻松加愉快 xff0c 但是貌似我去用了两个小时搞定 xff0c 主要是基础差 xff01 队列的基本操作就是入栈和出栈 xff0c 还可
  • float c语言存储格式,float a=1.0f 这里的1.0f中的“f”代表什么 ?float的储存格式?...

    float a 61 1 0f 这里的1 0f中的 f 代表什么 xff0c 有什么意思 xff0c 在C语言里面 xff0c 解答详细点啊 xff01 xff01 xff01 f 代表这个数据是float类型的常量 xff0c 如果你直接
  • 简单实现一个go协程池

    协程池简单来说就是一个管道进 xff0c 一个管道出 xff0c 多个协程工作 实现一 xff1a 无顺序协程工作 package main import 34 fmt 34 var workerNum 61 3 func worker i
  • package.xml

    package xml 也是一个 catkin 的 package 必备文件 xff0c 它是这个软件包的描述文件 xff0c 在较早的 ROS 版本 rosbuild 编译系统 中 xff0c 这个文件叫做 manifest xml xf
  • docker-更新镜像

    更新镜像 更新镜像之前 xff0c 我们需要使用镜像来创建一个容器 w3cschool 64 w3cschool docker run t i ubuntu 15 10 bin bash root 64 e218edb10161 在运行的容
  • 实时监控、直播流、流媒体、视频网站开发方案设计简要

    欢迎大家积极开心的加入讨论群 群号 371249677 xff08 点击这里进群 xff09 一 本地推送端 1 本地 xff1a 采用javaCV xff08 安卓和java平台推荐javaCV xff09 ffmpeg openCV或者
  • 学完嵌入式可以做什么呢?我们为什么要学习嵌入式?

    就目前中国市场行情来看 xff0c IT技术已经进入了高速发展的阶段 xff0c 互联网开始逐渐步入物联网的科技时代 xff0c 可以说嵌入式开发技术在物联网领域应用最为广泛 xff0c 正是嵌入式开发行业十分火热 xff0c 很多大学毕业
  • 微软服务器软件维护,软件更新维护 - Configuration Manager | Microsoft Docs

    软件更新维护 04 27 2021 本文内容 适用范围 xff1a Configuration Manager Current Branch 可从 Configuration Manager 控制台和软件更新点组件属性中计划和运行 WSUS
  • 用C#来开发CAD插件,含源代码

    CAD插件看起来很神秘 xff0c 其实一个合格码农经过几天就能快速掌握 没什么秘密 xff0c 开发CAD插件和winform一样简单学几个类库用法就是 xff08 只是太多人不喜欢知识分享 xff09 xff0c 在CAD里展现界面和w
  • linux C/C++服务器后台开发面试题总结

    一 编程语言 1 根据熟悉的语言 xff0c 谈谈两种语言的区别 xff1f 主要浅谈下C C 43 43 和PHP语言的区别 1 PHP弱类型语言 xff0c 一种脚本语言 xff0c 对数据的类型不要求过多 xff0c 较多的应用于We
  • 如何设置树莓派 -Zero 自启动连接WIFI

    1 首先我们需要一台可以读取树莓派跟文件系统的Linux虚拟机 比如Ubuntu 将树莓派SD卡系统插入电脑 xff0c 识别并打开rootfs文件夹 xff0c 切换到 96 rootfs etc wpa supplicant 96 目录
  • Linux Shell 小数比较

    bin bash expr 方法是错误的 xff0c 在比较相同位数时可以 xff0c 当位数不同就会出错 xff0c 如100 00 gt 70 00就会得出错误的结果 a 61 123 b 61 123 c 61 99 99 rat 6
  • rpc通信的实现方式(以grpc为例)

    基础知识 RPC xff08 Remote Procedure Call xff09 xff1a 远程过程调用 它是一种调用方式 xff0c 可以像调用本地方法那样调用远端方法 protobuf Protocol Buffers 一种开源跨