乐趣区

关于golang:golang-GRPC连接池的设计与实现

在分布式高并发服务器中,client 到 server 以及 server 中的多个节点之间的连贯往往应用连接池来治理。简略来说就是将提前创立好的连贯保留在池中,当有申请到来时,间接应用连接池中的连贯对 server 端拜访,省去了创立连贯和销毁连贯的开销 (TCP 建设连贯时的三次握手和开释连贯时的四次挥手),从而进步了性能。

GRPC 的两个个性:多路复用、超时重连。

多路复用 GRPC 应用 HTTP/ 2 作为应用层的传输协定,HTTP/ 2 会复用底层的 TCP 连贯。每一次 RPC 调用会产生一个新的 Stream,每个 Stream 蕴含多个 Frame,Frame 是 HTTP/ 2 外面最小的数据传输单位。同时每个 Stream 有惟一的 ID 标识,如果是客户端创立的则 ID 是奇数,服务端创立的 ID 则是偶数。如果一条连贯上的 ID 应用完了,Client 会新建一条连贯,Server 也会给 Client 发送一个 GOAWAY Frame 强制让 Client 新建一条连贯。一条 GRPC 连贯容许并发的发送和接管多个 Stream,而管制的参数便是 MaxConcurrentStreams,Golang 的服务端默认是 100。

超时重连咱们在通过调用 Dial 或者 DialContext 函数创立连贯时,默认只是返回 ClientConn 构造体指针,同时会启动一个 Goroutine 异步的去建设连贯。如果想要等连贯建设完再返回,能够指定 grpc.WithBlock() 传入 Options 来实现。超时机制很简略,在调用的时候传入一个 timeout 的 context 就能够了。重连机制通过启动一个 Goroutine 异步的去建设连贯实现的,能够防止服务器因为连贯闲暇工夫过长敞开连贯、服务器重启等造成的客户端连贯生效问题。也就是说通过 GRPC 的重连机制能够完满的解决连接池设计准则中的闲暇连贯的超时与保活问题。

举荐开源我的项目: https://github.com/grpc-ecosy…
gRPC-Gateway 是 protoc 的插件. 它读取 gRPC 服务定义并生成反向代理服务器, 将 RESTful JSON API 转换为 gRPC. 此服务器是依据你的 gRPC 定义中的自定义选项生成的.
gRPC-Gateway 可帮忙你同时提供 gRPC 和 RESTful 格调的 API.

退出移动版