用 Kratos 框架做 Go 语言的微服务开发,常常涉及与数据库的交互,MySQL 和 Redis 算是最常见的两个存储系统。今天就从操作这两个存储系统入手,讲讲实际项目中怎么把它们跑起来。
一、连接 MySQL
MySQL 肯定是绕不开的。假设你已经有了数据库和相关表,接下来要做的是怎么把这个数据库接到 Kratos 微服务里。首先需要配置好数据库的基本信息——IP 地址、端口号、用户名、密码等等。这一步通常我们放在配置文件config.yaml
里,看起来大概是这样:
yaml
database:
mysql:
addr: "127.0.0.1:3306"
username: "user"
password: "pass"
dbname: "testdb"
配置清晰了,之后的任务是把这些东西搬到代码里使用。在 Kratos 中使用gorm
作为 ORM 是个常见的做法,能让我们省不少事。让我们建一个Database
的结构体来存这些配置,这点和平时写 Go 代码没太大区别:
go
type Database struct {
Addr string
Username string
Password string
DbName string
}
拿到配置以后,下一步就是要写数据库连接的具体代码了。还是在 main 函数里,依据刚刚拿到的配置构建 DSN,也就是数据源名。DSN 像是数据库的「门牌号」,获取*gorm.DB
对象的关键就在这里:
go
func NewDatabase(c *conf.Data) *Database {
return &Database{
Addr: c.Database.Mysql.Addr,
Username: c.Database.Mysql.Username,
Password: c.Database.Mysql.Password,
DbName: c.Database.Mysql.Dbname,
}
}
在这之后通过gorm.Open
函数接上数据库,简单一招就完成了。写好这段代码以后,数据库操作就引入成功了,是不是感觉有点头绪了?
但这不够。我们要再进一步,做个 DAO 层。这种做法让我们不必每次调用数据库时都手写 SQL。给业务层提供相应的 CRUD 接口,调用数据库更加自如。往后需要换数据库?也只需要在底层调整代码,无需惊动上层的业务逻辑。这样整体的结构很干净。
二、使用 Redis
再聊聊 Redis。它可是提高性能的好手,快、轻、支持丰富数据结构,是做缓存的首选。照例还是在配置文件里先把 Redis 信息写好,端口、密码之类的都预先设定:
yaml
redis:
addr: "127.0.0.1:6379"
password: ""
db: 0
接下来是最基础的连接操作。对 Redis 来说,一般项目中大家爱用go-redis/redis/v8
库,结合 Kratos 的配置使用非常便捷。这里我们也这样处理:
go
func NewRedis(c *conf.Data) *redis.Client {
rdb := redis.NewClient(&redis.Options{
Addr: c.Redis.Addr,
Password: c.Redis.Password,
DB: c.Redis.Db,
})
return rdb
}
照这样,rdb
就是跟 Redis 进行通信的核心。有了它以后,设缓存,查数据,都在手指间跑起来了。一些操作频繁的数据,例如用户 Session 或热帖子内容,扔到 Redis 里缓存最好不过。你在代码里头rdb.Set()
、rdb.Get()
也就没什么障碍了。
可能你在用 Redis 时还要加上些过期时间控制,这事也是一两句代码搞定,想设多久的过期时间都行。包括你想清除某些数据,都能用这个客户端做得明明白白。
整体来讲,整个流程毫无弯路,流畅又容易维护。