当前位置: 首页 > news >正文

RPC与gRPC

RPC

RPC(Remote Procedure Call,远程过程调用)是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络细节的应用程序通信协议。RPC协议构建于TCP或UDP,或者是HTTP上。允许开发者直接调用另一台服务器上的程序,而开发者无需另外的为这个调用过程编写网络通信相关代码,使得开发网络分布式程序在内的应用程序更加容易
RPC采用客户端-服务器端的工作模式,请求程序就是一个客户端,而服务提供程序就是一个服务器端。当执行一个远程过程调用时,客户端程序首先先发送一个带有参数的调用信息到服务端,然后等待服务端响应。在服务端,服务进程保持睡眠状态直到客户端的调用信息到达。当一个调用信息到达时,服务端获得进程参数,计算出结果,并向客户端发送应答信息。然后等待下一个调用。

RPC优势
1,是查找的精确性,快速性,短路径,和确定性,因为属于内网查询,独立的注册中心,所以查找的速度更快。
2,而且由于做了精简和优化,删去了RESTful方式里面很多多余的信息,比如Header,而且做了压缩和序列化,通过二进制方式传输,传输的内容更少,传输的速度也更快。
3,环节和流程更少,因为RESTful需要经过路由,负载均衡,网关,防火墙和一系列的身份识别和校验,就像大楼内来了个不认识的人,楼管大叔肯定要查你的身份证等等信息核实你的信息。 而且RPC就省去了这些环节,就像你天天出来进去,楼管大妈早就对你很熟了,不需要每次核实你的信息,RPC省去了很多环节。

Go语言中的RPC支持与处理
在Go中,标准库提供的net/rpc包实现了RPC协议需要的相关细节,开发者可以很方便的使用该包编写RPC的服务端和客户端程序。这使得用Go语言开发的多个进程之间的通信变得非常简单
net/rpc包允许PRC客户端程序通过网络或者其他IO连接调用一个远程对象的公开方法(该方法必须是外部可访问即首字母大写)。在PRC服务端,可将一个对象注册为可访问的服务,之后该对象的公开方法就能够以远程的方式提供访问。

gRPC

gRPC是谷歌开源的一个高性能、开源、通用的RPC框架。基于HTTP/2协议标准设计开发,默认采用Protocol Buffers数据序列化协议Protocol Buffers基本语法,支持多种开发语言。gRPC提供了一种简单的方法来精确的定义服务,并且为客户端和服务端自动生成可靠的功能库,面向移动和 HTTP/2 设计。

内容交换格式采用ProtoBuf(Google Protocol Buffers),开源已久,提供了一种灵活、高效、自动序列化结构数据的机制,作用与XML,Json类似,但使用二进制,(反)序列化速度快,压缩效率高。
传输协议 采用http2,性能比http1.1好了很多
和很多RPC系统一样,服务端负责实现定义好的接口并处理客户端的请求,客户端根据接口描述直接调用需要的服务。客户端和服务端可以分别使用gPRC支持的不同语言实现。

ProtoBuf 具有强大的IDL(interface description language,接口描述语言)和相关工具集(主要是protoc)。用户写好.proto描述文件后,protoc可以将其编译成众多语言的接口代码。

消息结构
用于请求和响应。源文件中包含消息传递的请求和响应结构。服务端注册对象的方法 创建客户端 以及调用服务端方法

gRPC有一个标准的健康检测协议,在gRPC的所有语言视线中基本都提供了生成代码和用于设置运行状态的功能。

主动健康检查health check,可以在服务提供者服务不稳定时,被消费者所感知,临时从负载均衡中摘除,减少错误请求。当服务提供者重新稳定后,health check成功,重新加入到消费者的负载均衡中,恢复请求。health check同样被用于外挂方式的容器健康检测,或者流量检测(k8s liveness & readiness)。

服务发现
服务发现 - 客户端发现
让服务提供者和服务消费者直连。

一个服务实例被启动时,它的网络地址会被写到注册表上;当服务实例终止时,再从注册表删除;这个服务实例的注册表通过心跳机制动态刷新;客户端使用一个负载均衡算法去选择一个可用的服务实例,来响应这个请求。

其比服务端发现少一次网络跳转,consumer需要内置特定的服务发现客户端和发现逻辑。

服务发现 - 服务端发现
consumer经过一个集中式的负载均衡。consumer无需关心服务发现具体细节,只需知道服务的DNS即可,支持异构语言开发,需要基础设施支撑,多了一次网络跳转,可能会有一些性能上的损失。

客户端通过一个负载均衡器向一个服务端发送请求,这个负载均衡器会查询服务注册表,并将请求路由到可用的服务实例上。服务实例在服务注册表上被注册和注销。

相关文章:

  • golang设置header与ajax交互
  • groupcache
  • rm -rf *命令解决
  • 时间片轮转调度算法
  • 分布式的实时消息平台NSQ
  • 两个结构体变量的相互赋值
  • varint变长编码
  • sync.map线程安全map
  • 软件更新
  • 实时通信IM
  • SnowFlake算法
  • etcd的应用场景
  • 开源聊天服务器
  • 百万级消息服务MQTT
  • go语言调用C代码