7.1、简介
连接池很多同学都肯定接触过,也都使用过。连接池的主要作用就是连接复用,每次访问从池子里获取已经创建好的连接,这样可以减少创建,回收等一系列的操作所产生的的资源消耗,可以极大的提升服务的性能。我们通过分析go-mico的gRPC连接池的实现来总结连接池设计的方法论。
7.2、gRPC的传输基于什么协议?
gRPC是基于HTTP/2的,为什么是HTTP/2,大家可以直接Google,有很多博主的回答都很优秀。总结下来主要是:
- 连接非阻塞的,多路复用的。
- 头部压缩,基于二进制协议的传输协议。
- stream概念。
- 最重要的另一个原因就是,通用。移动终端设备也是最先使用HTTP/2。
7.3 、gRPC连接池的实现
连接池的实现,基本上都是这4个method
- getConn 获取连接
- release 释放连接
- removeConn 移除连接
- addConnAfter 添加连接
7.3.1 getConn 获取一条连接
1 | func (p *pool) getConn(addr string, opts ...grpc.DialOption) (*poolConn, error) { |
7.3.1 removeConn 移除连接
1 | // 重置pre连接 |
###7.3.2 addConnAfter 添加conn
1 | func addConnAfter(conn *poolConn, after *poolConn) { |