grpc是用go语言写的 go grpc源码( 四 )


有了 gRPC,我们可以一次性的在一个 .proto 文件中定义服务并使用任何支持它的语言去实现客户端和服务器,反过来,它们可以在各种环境中,从Google的服务器到你自己的平板电脑—— gRPC 帮你解决了不同语言及环境间通信的复杂性.使用 protocol buffers 还能获得其他好处,包括高效的序列号,简单的 IDL 以及容易进行接口更新 。
现在让我们来仔细了解一下当 gRPC 客户端调用 gRPC 服务端的方法时到底发生了什么 。我们不究其实现细节,关于实现细节的部分,你可以在我们的特定语言页面里找到更为详尽的内容 。
首先我们来了解一下最简单的 RPC 形式:客户端发出单个请求 , 获得单个响应 。
服务端流式 RPC 除了在得到客户端请求信息后发送回一个应答流之外,与我们的简单例子一样 。在发送完所有应答后,服务端的状态详情(状态码和可选的状态信息)和可选的跟踪元数据被发送回客户端,以此来完成服务端的工作 。客户端在接收到所有服务端的应答后也完成了工作 。
客户端流式 RPC 也基本与我们的简单例子一样,区别在于客户端通过发送一个请求流给服务端,取代了原先发送的单个请求 。服务端通常(但并不必须)会在接收到客户端所有的请求后发送回一个应答,其中附带有它的状态详情和可选的跟踪数据 。
双向流式 RPC  , 调用由客户端调用方法来初始化 , 而服务端则接收到客户端的元数据,方法名和截止时间 。服务端可以选择发送回它的初始元数据或等待客户端发送请求 。下一步怎样发展取决于应用 , 因为客户端和服务端能在任意顺序上读写 - 这些流的操作是完全独立的 。例如服务端可以一直等直到它接收到所有客户端的消息才写应答,或者服务端和客户端可以像"乒乓球"一样:服务端后得到一个请求就回送一个应答,接着客户端根据应答来发送另一个请求,以此类推 。
通过运行下面的命令克隆并安装grpc-go代码库:
下载protobuf源码包
安装golang-protobuf
第一步使用 protocol buffers去定义 gRPC service 和方法 request 以及 response 的类型 。
要定义一个服务 , 必须在.proto 文件中指定 service:
然后在服务中定义 rpc 方法 , 指定请求的和响应类型,gRPC 允许定义4种类型的 service 方法 。
服务.proto文件如下所示:
Golang gRPC实现内网穿透内网穿透即是使用公网服务器作为代理grpc是用go语言写的,转发内网(如办公室、家里)的网络请求使其能够在外网中被访问到 。
server端监听两个端口grpc是用go语言写的,一个用来和接收用户的http请求grpc是用go语言写的,一个监听gRPC客户端,和内网服务器进行通信;
client启动时连接server端;
当User请求server http端口时,将http进行阻塞,并将User请求内容通过gRPC发给client;
client将从server收到的请求发往本地的http服务;
client将从本地程序收到的http response通过gRPC发送给server;
server结束http阻塞,将从client收到的http response发给User 。
github地址:
grpc-源码-网络模型golang 的grpc库是
grpc server端和服务端网络协议是在tcp基础上的 http2协议grpc是用go语言写的 , http2协议负责grpc基础的数据传输、连接管理、流控等grpc是用go语言写的,具体的业务层service 定义是基于 protobuf的
整个的网络过程和关键点如下图
说明:
TCP KeepAlive则是为grpc是用go语言写的了探测/保鲜(心跳检测grpc是用go语言写的,连接错误检测):用于探测对端的状态及网络情况(有可能客户端崩溃、强制关闭了应用、主机不可达等等),也有保鲜功能 。比如如防止nat超时 。TCP keepalive则是通过发送发送侦测包实现 。在Linux中通过net.ipv4.tcp_keepalive_intvl,net.ipv4.tcp_keepalive_probes,net.ipv4.tcp_keepalive_time配置 。比如gnet 网络框架中的实现

推荐阅读