群里老有同窗问,go-zero
的 数据库
和 redis
库是否有链接池支持。先说结论:有的,能够放心大胆用!git
从框架设计来讲,对于数据库链接这种资源固然是尽量减小频繁操做:github
因此无论是 sqlx
,redis
,以及 mongo
,等之后可能要支持的数据源类型,底层的池化处理都是通用的;因此当开发者须要一个池化处理组件时,go-zero
也是提供的。redis
池化技术支持的库就位于:core/resourcemanager.go
。下面来看看这个库的使用~~sql
使用的话,咱们直接来看 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 系列文章见『微服务实践』公众号