前言

群里老有同学问,go-zero数据库redis 库是否有连接池反对。先说论断:有的,能够放心大胆用!

从框架设计来说,对于数据库连贯这种资源当然是尽可能减少频繁操作:

  1. 为业务减负
  2. 晋升框架本身的性能
  3. 池化技术是一个通用化技术,自身就应该作为一个通用库撑持框架的下层业务

所以不论是 sqlxredis,以及 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}

说说其中的要点:

  1. NewResourceManager:创立一个池子
  2. GetResource(key, createFunc):key是用来避免并发获取资源时反复申请,createFunc 才是正在用来创立资源的函数【此函数须要有开发者本人编写合乎业务需要资源】

总结一下资源池的模型:

// 1. newvar 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

  1. GetResource,携带特定的 key,到资源池中的 map 中查找:

    • 查到了,间接返回
    • 没有查到,调用传入的 create() ;此处才真正创立一个实在的资源连贯,并放入 map
  2. 其中对 map 的查问和写入,都得加锁。
  3. 其中在对资源池进行操作时,附加上 sharedCalls :避免并发申请时有效流量申请以及共享申请后果。
对于 SharedCalls,还不分明的同学,能够到 go-zero 官网文档中认真查看。

总结

本篇文章对 go-zero 的资源池库从应用到构造进行了剖析。大家也能够在业务中常产生资源申请的逻辑处,加上 resourcemanager,实质上也是给资源加上一个缓存,节俭重复创立。

对于 go-zero 更多的设计和实现文章,能够关注『微服务实际』公众号。

我的项目地址

https://github.com/tal-tech/go-zero

欢送应用 go-zero 并 star 反对咱们!

微信交换群

关注『微服务实际』公众号并点击 交换群 获取社区群二维码。

go-zero 系列文章见『微服务实际』公众号