教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Golang基础第五篇——golang的gRPC

Golang基础第五篇——golang的gRPC

发布时间:2022-01-26   编辑:jiaochengji.com
教程集为您提供Golang基础第五篇——golang的gRPC等资源,欢迎您收藏本站,我们将为您提供最新的Golang基础第五篇——golang的gRPC资源

此篇的组织架构,第一节简述golang的rpc,第二节讲主体golang/grpc,第三节简述grpc应用的结构和特性。本身grpc是个上限很高的框架,这里的博文只科普,尽量简单地告诉你它做了什么,有什么用;关于使用,部署,以及更深层的原理还要自己发掘。

目录

一,RPC编程

二,gRPC

三,grpc结构与特性


<h2 id="一,RPC编程">一,RPC编程</h2>

RPC是什么?

 RPC(Remote Procedure Call) 远程过程调用,是一种通过网络从远程计算机程序上请求服务,而你自己不需要了解底层网络细节的应用程序通信协议,与之对应的是本地过程调用,即自己调用自己计算机上的服务。RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个通过发送请求-接受回应进行信息交互的系统,通常构建于TCP,UDP或者HTTP之上,使用时开发者无需为这个调用过程额外编写网络通信相关代码,RPC框架已经为你封装好了。

golang的RPC

go语言原生对RPC的支持和处理实现在net/rpc包,服务端通常通过TCP或HTTP在某个网络地址上创建服务并监听RPC客户端传入的参数,客户端通过rpc.Dial()和rpc.DialHTTP()方法来和制定的服务端创建连接,接受到处理结果之后通过Call()同步处理信息,go()异步处理信息。而且,golang还提供了序列化数据结构和编码解码的工具Gob,在内置的encoding/gob中,可以让其他语言实现的客户端都可以和go语言编写的服务端通信。

关于RPC要解决的几个常见问题就是分布式以及大数据需要面对的基本问题:数据序列化,负载均衡,服务注册,缓存更新,异步调用等,其中现在普遍更受欢迎的是gRPC。入手之后觉得grpc本身框架是优质的,不像某乎第一看待grpc的答案,剪裁的东西本身就是应该剪裁并自己造轮子的,grpc内部维护很不错了,本意是希望你能自定义其他部分为自己所用,其他开销只能说每个厂情况不同,使用框架见仁见智。

<h2 id="二,gRPC">二,gRPC</h2>

gRPC全称是google Remote Procedure Call,不过golang也是google发明的,gRPC由golang编写,所以这篇blog讲的grpc指的都是grpc go。然而gRPC和传统的RPC有什么不同?

gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特性。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。

具体grpc作用的结构如下图,数据从我们的操作系统发出到protobuf解编码,grpc设计远程调用后用http/2做应用信息包装,转至tls加密传输层tcp发出。

                           fig.1 grpc protocol stack

gPRC和上层Protobuf
 服务接口和传递的消息均以protobuf的IDL语言统一描述:分别以service和message对象表示。protoc支持插件,grpc就是通过grpc插件来实现用protoc生成client和server的代码。client的代码被称为stub。server端的主要代码实际上是一个接口。用户需要自己提供一个类,实现该接口,启动server时把这个类注册成这个服务的实现类。即protobuf负责数据的定义,编译生成grpc可识别的IDL。

                            fig.2  grpc and protobuf

gRPC与下层Http2
gRPC是基于Http2协议的。gRPC继承了大量Http2协议的概念和特性。
Http2中grpc客户端和grpc服务器端一般只建立一个连接,在一个连接中可以并行地发起很多个http请求,每个请求使用一个stream来收发数据。服务器端可以主动创建stream向客户端推送数据。
Http2的请求/响应数据均以二进制方法传输,且数据被组织为frame(类似于tcp中的packet)。这样可以允许多个请求并行地进行收发数据。gRPC中的一个channel可对应于Http2中的一个连接,而一个RPC调用对应Http2中的一个Stream。
同时Http2可以支持传输层加密和认证(TLS)。显然,gRPC的加密和认证机制也可以直接利用之。

                                                    fig.3 Http/2 connection in grpc

gRPC内置的认证和加密机制
gRPC支持Transport Credential和PerRPC credential。前者顾名思义,是用于“传输层”的,即建立channel的时候所使用的credential,目前支持的都是TLS这种类型的机制。而后者则一般是指token这种类型的信息,每次RPC调用时都会发送,用于在服务器端认证调用者的身份并进行细粒度的权限控制。
后者一般使用interceptor进行处理,在server启动时注册一个interceptor。每次rpc调用时,在interceptor从客户端发送的metadata中读取token信息进行认证。
注意,grpc调用是否已经结束的结论是客户端和服务器端各自独立做出的。

 

<h2 id="三,grpc结构与特性">三,grpc结构与特性</h2>

由于grpc很好的解决了rpc中的常见问题,所以被广泛使用,这里挑选其中的两个特性做简单说明。

负载均衡
gRPC有 关于命名解析grpc/naming和负载均衡grpc/balancer的包。 首先gRPC客户端会发出服务注册和域名管理请求,dnsresolver包装连接对象注册,并通过wrapper和client端回调更新。client端再调用balancer部分接口实现对连接的管理 负载均衡,用于管理连接状态和生命周期。并侦听每一个subconn的状态变化进行策略反馈,负责发起连接的创建和移除。负载均衡策略支持外部扩展以避免更改gRPC内部的东西,其中gRPCLB就是loadbalancer,用于包含外部的实现,内置的grpc/balancer/roundrobin应该是一个简单的可供扩展的循环平衡机制,总之为balancer管理状态而服务。这样通过对连接的管理优化client端和server之间的gRPC。

下图是grpc的一个总体架构,可以有一个简单认识。

                                                  fig.5 gRPC structure

超时保活

RPC连接时channel作为数据的载体,共分为5种状态:Idle,Connecting,Ready,TransientFailure,Shutdown,可见grpc/connectivity.go。重连机制通过启动一个Goroutine异步的去建立连接实现的,可以避免服务器因为连接空闲时间过长关闭连接、服务器重启等造成的客户端连接失效问题。也就是说通过gRPC的重连机制可以完美的解决连接池设计原则中的空闲连接的超时与保活问题。

                                                fig.6 grpc/conectivity

grpc/keepalive
这个包分别为client和server定义了测试传输路径是否work的参数来协调池中的连接数
client端:
当一段时间客户端没有请求发送,客户端就会向server发送ping消息,等待一段时间看传输是否受损,来检测server的状态
server端:维护最大空闲连接时间,最大空闲连接数等,最大空闲连接时间默认值最大,我们可以调用这个来完成对用户连接的空闲时间管理

                                             fig.7  grpc/keepalive

gRPC使用HTTP/2作为应用层的传输协议,很多机制与http/2相关,比如利用流的多路复用等。当由于缺少新的或待处理的RPC,channel没有尝试创建连接就会变成idle状态,或者当没有新的或挂起的(活动的)RPC,则READY或CONNECTING的channel也会切换到IDLE。此时,server 端会给client 端发送一个http GOAWAY 的包,client 收到这个包之后就会主动关闭连接。下次需要发包的时候,就会重新建立连接,以避免试图断开连接的服务器上的连接过载。

 

参考:

1. nokia and grpc: https://infocenter.nokia.com/public/7750SR160R4A/index.jsp?topic=/com.sr.system.mgmt/html/telemetry-intro.html

2. 知乎grpc源码笔记:https://zhuanlan.zhihu.com/p/104060740

3. grpc官方文档:https://grpc.io

4. grpc go github:https://github.com/grpc/grpc-go

到此这篇关于“Golang基础第五篇——golang的gRPC”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
Golang基础第五篇——golang的gRPC
golang基础教程
js时间函数综合例子(日期计算、字符串转日期等)
Windows10 golang gRPC环境搭建
网页标题随机显示名言js代码
分享:mysql存储过程的基本函数
有关 mysql count(*) 与 count(col) 查询效率的比较分析
更改MySQL数据库名实例代码
golang微服务框架对比_Golang 中的微服务 - 第一部分
探索Golang协程实现——从v1.0开始

[关闭]
~ ~