前言
群里老有同学问,go-zero
的 数据库
和 redis
库是否有连接池反对。先说论断: 有的,能够放心大胆用!
从框架设计来说,对于数据库连贯这种资源当然是尽可能减少频繁操作:
- 为业务减负
- 晋升框架本身的性能
- 池化技术是一个通用化技术,自身就应该作为一个通用库撑持框架的下层业务
所以不论是 sqlx
,redis
,以及 mongo
,等当前可能要反对的数据源类型,底层的池化解决都是通用的;所以当开发者须要一个池化解决组件时,go-zero
也是提供的。
池化技术支持的库就位于:core/resourcemanager.go
。上面来看看这个库的应用~~
应用
应用的话,咱们间接来看 sqlx
,它是怎么用的:
// 1. 初始化
var connManager = syncx.NewResourceManager()
func getCachedSqlConn(driverName, server string) (*db, error) {val, err := connManager.GetResource(server, func() (io.Closer, error) {
// 2. 此处才是真正创立连贯的中央
conn, err := newDBConnection(driverName, server)
...
// 3. 将连贯返回给连接池【外部也必定是存起来】return &db{DB: conn,}, nil
})
...
return val.(*db), nil
}
说说其中的要点:
NewResourceManager
:创立一个池子GetResource(key, createFunc)
:key 是用来避免并发获取资源时反复申请,createFunc
才是正在用来创立资源的函数【此函数须要有开发者本人编写合乎业务需要资源】
总结一下资源池的模型:
// 1. new
var manager = NewResourceManager()
// 2. 业务资源获取函数
func getResource(key string) (*resource, error) {return manager.GetResource(key, createFunc);
}
// 3. 业务资源创立函数【由开发者本人编写,此处只是一个样例】func createFunc() (io.Closer, error) {
// 关上一个资源
conn, err := openResource();
// 设置一下资源配置
conn.setConfig()
return conn, err;
}
整体剖析
其实流程上很简略,其中还有咱们陈词滥调的 sharedCalls
:
-
GetResource
,携带特定的key
,到资源池中的map
中查找:- 查到了,间接返回
- 没有查到,调用传入的
create()
;此处才真正创立一个实在的资源连贯,并放入map
- 其中对
map
的查问和写入,都得加锁。 - 其中在对资源池进行操作时,附加上
sharedCalls
:避免并发申请时有效流量申请以及共享申请后果。
对于
SharedCalls
,还不分明的同学,能够到go-zero
官网文档中认真查看。
总结
本篇文章对 go-zero
的资源池库从应用到构造进行了剖析。大家也能够在业务中常产生资源申请的逻辑处,加上 resourcemanager
,实质上也是给资源加上一个缓存,节俭重复创立。
对于 go-zero
更多的设计和实现文章,能够关注『微服务实际』公众号。
我的项目地址
https://github.com/tal-tech/go-zero
欢送应用 go-zero 并 star 反对咱们!
微信交换群
关注『微服务实际 』公众号并点击 交换群 获取社区群二维码。
go-zero 系列文章见『微服务实际』公众号