Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go 语言微服务框架 Kratos 操作 MySQL 和 Redis

Go 语言微服务框架 Kratos 操作 MySQL 和 Redis

作者头像
frank.
发布于 2024-12-30 05:17:33
发布于 2024-12-30 05:17:33
20700
代码可运行
举报
运行总次数:0
代码可运行

大家好,我是 frank。「Golang语言开发栈」公众号作者。

01 、介绍

Go 语言微服务框架 Kratos 不限制使用任何第三方库,我们可以根据个人喜好选择第三方库。

本文我们以 XORM 和 Go Redis 为例,介绍 Kratos 微服务框架怎么集成 XORM[1]Go Redis[2] 操作 MySQL 和 Redis。

02 、集成 XORM 和 Go Redis

创建项目

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kratos new blog

安装 MySQL 驱动

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go get -u github.com/go-sql-driver/mysql

安装 xorm

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go get xorm.io/xorm

安装 go redis

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go get github.com/redis/go-redis/v9

客户端

编写文件 blog/internal/data/data.go

导入第三方库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import (
 _ "github.com/go-sql-driver/mysql"
 "github.com/redis/go-redis/v9"
 "xorm.io/xorm"
)

添加 xorm 和 go redis 客户端

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Data .
type Data struct {
 // TODO wrapped database client
 dbEngine *xorm.Engine
 rdb      *redis.Client
}

// NewData .
func NewData(c *conf.Data, logger log.Logger, dbEngin *xorm.Engine, rdb *redis.Client) (*Data, func(), error) {
 cleanup := func() {
  log.NewHelper(logger).Info("closing the data resources")
 }
 return &Data{
  dbEngine: dbEngin,
  rdb:      rdb,
 }, cleanup, nil
}

创建函数 NewDbEngineNewRedisClient

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func NewDbEngine(c *conf.Data) (dbEngine *xorm.Engine, err error) {
 dbEngine, err = xorm.NewEngine(c.Database.Driver, c.Database.Source)
 return
}

func NewRedisClient(c *conf.Data) (rdb *redis.Client) {
 rdb = redis.NewClient(&redis.Options{
  Addr:     c.Redis.Addr,
  Password: c.Redis.Password,
  DB:       int(c.Redis.Db),
 })
 return
}

添加 Wire 提供者

编写 blog/internal/data/data.go 文件,添加 NewDbEngine, NewRedisClient

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// ProviderSet is data providers.
var ProviderSet = wire.NewSet(NewData, NewGreeterRepo, NewDbEngine, NewRedisClient)

03 、使用 XORM 和 Go Redis

我们以操作用户表 user 为例,介绍怎么使用 XORM 和 Go Redis。

数据库表 user 表结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE `user` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` varchar(30) NOT NULL DEFAULT '' COMMENT 'user name',
  `email` varchar(50) NOT NULL DEFAULT '' COMMENT 'user email',
  `password` varchar(30) NOT NULL DEFAULT '' COMMENT 'user password',
  `created` int(11) NOT NULL DEFAULT '0' COMMENT 'create time',
  `updated` int(11) NOT NULL DEFAULT '0' COMMENT 'updated time',
  PRIMARY KEY (`id`),
  KEY `idx_user` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='user'

Usecase 层

首先,我们需要在 blog/internal/biz 目录中,创建文件 user.go

user.go 文件中,我们定义 User 结构体,定义 UserRepository,定义 UserUsecase

定义 User 结构体

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type User struct {
 Id       int64 `xorm:"autoincr""`
 Name     string
 Email    string
 Password string
 Created  int64 `xorm:"created""`
 Updated  int64 `xorm:"updated""`
}

定义 UserRepository

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type UserRepository interface {
 Create(ctx context.Context, user *User) (int64, error)
 Get(ctx context.Context, user *User) (bool, error)

 RedisGetUser(ctx context.Context, id int64) (val string, err error)
 RedisSetUser(ctx context.Context, id int64, val interface{}, expiration time.Duration) (err error)
}

定义 UserUsecase

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type UserUsecase struct {
 userRepo UserRepository
}

func NewUserUsecase(userRepo UserRepository) *UserUsecase {
 return &UserUsecase{
  userRepo: userRepo,
 }
}

func (u *UserUsecase) CreateUser(ctx context.Context, user *User) (id int64, err error) {
 id, err = u.userRepo.Create(ctx, user)
 if err != nil {
  return
 }
 if id > 0 {
  var b []byte
  b, err = json.Marshal(user)
  if err != nil {
   return
  }
  err = u.userRepo.RedisSetUser(ctx, user.Id, string(b), time.Second*300)
  if err != nil {
   return
  }
 }
 return
}

添加 Wire 提供者

编写 blog/internal/biz/biz.go 文件,添加 NewUserUsecase

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// ProviderSet is biz providers.
var ProviderSet = wire.NewSet(NewGreeterUsecase, NewUserUsecase)

Repository 层

然后,我们需要在 blog/internal/data 目录中,创建 user.go 文件和 redis.go 文件。

user.go 文件和 redis.go 文件中,我们实现 UserRepository 接口中的方法。

MySQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type userRepository struct {
 data *Data
}

func NewUserRepository(data *Data) biz.UserRepository {
 return &userRepository{
  data: data,
 }
}

func (u *userRepository) Create(ctx context.Context, user *biz.User) (id int64, err error) {
 var affected int64
 affected, err = u.data.dbEngine.InsertOne(user)
 if err != nil {
  return
 }
 if affected > 0 {
  id = user.Id
 }
 return
}

Redis

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func (u *userRepository) RedisSetUser(ctx context.Context, id int64, val interface{}, expiration time.Duration) (err error) {
 key := fmt.Sprintf("user:%d", id)
 err = u.data.rdb.Set(ctx, key, val, expiration).Err()
 if errors.Is(err, redis.Nil) {
  err = nil
  return
 }
 return
}

添加 Wire 提供者

编写 blog/internal/data/data.go 文件,添加 NewUserRepository

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// ProviderSet is data providers.
var ProviderSet = wire.NewSet(NewData, NewGreeterRepo, NewDbEngine, NewUserRepository, NewRedisClient)

Delivery 层

再然后,我们编辑 blog/internal/service/user.go 文件,完善该文件中的方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type UserService struct {
 pb.UnimplementedUserServer
 userUcase *biz.UserUsecase
}

func NewUserService(userUcase *biz.UserUsecase) *UserService {
 return &UserService{
 userUcase: userUcase,
 }
}

func (s *UserService) CreateUser(ctx context.Context, req *pb.CreateUserRequest) (*pb.CreateUserReply, error) {
 user := &biz.User{
  Name:     req.Name,
  Email:    req.Email,
  Password: req.Password,
 }
 id, err := s.userUcase.CreateUser(ctx, user)
 if err != nil {
  return nil, err
 }
 name := fmt.Sprintf("user_%d", id)
 return &pb.CreateUserReply{
  Name: name,
 }, nil
}

添加 Wire 提供者

编写 blog/internal/service/service.go 文件,添加 NewUserService

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// ProviderSet is service providers.
var ProviderSet = wire.NewSet(NewGreeterService, NewUserService)

注册服务

最后,进入 blog/internal/server 目录,编写 http.gogrpc.go 文件,添加函数签名 user *service.UserService

并且,分别在函数体中注册服务。

示例代码:

HTTP

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
v1_user.RegisterUserHTTPServer(srv, user)

gRPC

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
v1_user.RegisterUserServer(srv, user)

Wire 生成代码

进入目录 blog/cmd/blog,执行 wire 命令。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd blog/cmd/blog
wire

项目运行和测试

Kratos 运行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kratos run

curl 请求示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -H "Content-Type: application/json" -X POST -d '{"name":"tony", "email":"tony@gmail.com", "password":"tony"}' http://192.168.110.209:8000/user/create

04 、总结

本文我们通过示例代码,介绍 Kratos 微服务框架怎么集成第三方库,操作 MySQL 和 Redis。

参考资料

[1]

XORM: https://xorm.io/

[2]

Go Redis: https://redis.uptrace.dev/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-12-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言开发栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go 语言微服务框架 Kratos 开发 HTTP API
本文我们分为开发环境,创建项目,代码目录,HTTP API,四个部分介绍 Kratos 微服务框架。
frank.
2024/12/23
4640
Go 语言微服务框架 Kratos 开发 HTTP API
Go 语言微服务框架 Kratos 集成第三方库 kafka-go 操作消息队列 Kafka
Go 语言微服务框架 Kratos 不限制使用任何第三方库,Go 语言操作消息队列 Kafka 有很多优秀的第三方库,比如 sarama 和 kafka-go,我们在之前的文章中介绍过 Go 语言怎么使用 sarama 操作消息队列 Kafka。
frank.
2025/01/06
1600
Go 语言微服务框架 Kratos 集成第三方库 kafka-go 操作消息队列 Kafka
Go 语言微服务框架 Kratos 服务注册与发现
Go 语言微服务框架 Kratos 服务注册与发现,支持多种注册中心,本文我们以 Consul 为例,介绍 Kratos 项目怎么实现服务注册与发现。
frank.
2025/01/20
2230
Go 语言微服务框架 Kratos 服务注册与发现
Go:微服务架构下的单元测试(基于 Ginkgo、gomock 、Gomega)
本文主要使用 Ginkgo[2] 、gomock[3] 、Gomega[4] 工具来实现单元测试,之前不了解的同学,可以先熟悉一下相关文档。
Freedom123
2024/03/29
6430
Go:微服务架构下的单元测试(基于 Ginkgo、gomock 、Gomega)
Golang 单元测试 - 数据层
数据层,就是我们常常说的 repo/dao,其功能就是和数据库、缓存或者其他数据源打交道。它需要从数据源中获取数据,并返回给上一层。在这一层通常没有复杂业务的逻辑,所以最重要的就是测试各个数据字段的编写是否正确,以及 SQL 等查询条件是否正常能被筛选。
LinkinStar
2023/02/22
1.1K0
Go 应用程序设计标准
众所周知 Go 语言官方成员 Russ Cox 曾向 Go 社区回应并没有 Go 应用程序设计标准。但是,为什么本文还要使用这个标题呢?
frank.
2022/05/17
2450
Fabric区块链浏览器(3)
在上一篇文章[2]中给浏览器增加了简单的用户认证,至此浏览器的基本功能就已经大致完成了。
孟斯特
2023/10/19
3520
Fabric区块链浏览器(3)
Go 项目依赖注入wire工具最佳实践介绍与使用
在Go语言的项目开发中,为了提高代码的可测试性和可维护性,我们通常会采用依赖注入(Dependency Injection,简称DI)的设计模式。依赖注入可以让高层模块不依赖底层模块的具体实现,而是通过抽象来互相依赖,从而使得模块之间的耦合度降低,系统的灵活性和可扩展性增强。
贾维斯Echo
2024/04/08
4590
Go 项目依赖注入wire工具最佳实践介绍与使用
kratos源码分析系列(1)
https://github.com/go-kratos/kratos是b站开源的一个微服务框架,整体来看它结合grpc生态中的grpc-gateway,以及wire依赖注入和众多常用的trace,matrix,log等中间件提供了一套微服务框架。我先尝试一下使用。
golangLeetcode
2022/12/17
3540
Go 项目必备:深入浅出 Wire 依赖注入工具
在日常项目开发中,我们经常会使用到依赖注入的设计模式,目的是为了降低代码组件之间的耦合度,提高代码的可维护性、可扩展性和可测试性。
陈明勇
2023/09/21
1.8K0
Go 项目必备:深入浅出 Wire 依赖注入工具
Kratos技术系列|从Kratos设计看Go微服务工程实践
导读 github.com/go-kratos/kratos(以下简称Kratos)是一套轻量级 Go 微服务框架,致力于提供完整的微服务研发体验,整合相关框架及周边工具后,微服务治理相关部分可对整体业务开发周期无感,从而更加聚焦于业务交付。Kratos在设计之初就考虑到了高可扩展性,组件化,工程化,规范化等。对每位开发者而言,整套 Kratos 框架也是不错的学习仓库,可以了解和参考微服务的技术积累和经验。 接下来我们从Protobuf、开放性、规范、依赖注入这4个点了解一下Kratos 在Go
腾讯云中间件团队
2021/07/14
2.8K0
砥砺前行 | Kratos 框架 v2 版本架构演进之路
Kratos 是一套轻量级 Go 微服务框架,包含大量微服务相关功能及工具。名字来源于游戏《战神》,该游戏以希腊神话为背景,讲述了奎托斯(Kratos)由凡人成为战神并展开弑神屠杀的冒险历程。
从大数据到人工智能
2022/06/15
1.7K0
砥砺前行 | Kratos 框架 v2 版本架构演进之路
我是如何组织 Go 代码的(目录结构 依赖注入 wire)
对于大多数 Gopher 来说,编写 Go 程序会直接在目录建立 main.go,xxx.go,yyy.go……
仁扬
2023/07/18
6600
Go 语言错误处理为什么更推荐使用 pkg/errors 三方库?
Go 语言项目开发中,我们通常需要在代码逻辑中进行错误处理,Go 官方标准库 errors 为我们提供了一些方法,比如 New,Unwarp,Is 和 As。
frank.
2022/07/01
8990
Google的 DI 框架 Wire
以下内容来自 Wire 官方文档,花了一天把英文的 readme 啃了遍,发现存在几个问题:
Yuyy
2022/09/21
7300
Gin 框架之Cookie与Session
早期(十几年前)的网页是静态的, 数据都是写死的, 人们访问网页只是用来查看新闻的, 没有保存用户状态的需求。
贾维斯Echo
2024/01/19
3790
Gin 框架之Cookie与Session
使用go-zero微服务框架实现云监控后台(一.后台微服务搭建)
接上一篇文章,按照”终端出厂实现自动化运维方案",https://blog.csdn.net/yyz_1987/article/details/118358038
杨永贞
2022/01/07
1.2K0
使用go-zero微服务框架实现云监控后台(一.后台微服务搭建)
Kratos实现go文件上传
一般的项目都需要文件上传,但是Kratos的官方文档并没有写明如何实现,最近项目需要我就试着自己写了一下。
衝鋒壹号
2023/11/18
1.5K0
Kratos实现go文件上传
Golang 单元测试 - 逻辑层
前面我们完成了最麻烦的数据层的单元测试,今天我们来看看单元测试中最容易做的一层,数据逻辑层,也就是我们通常说的 service 或者 biz 等,是描述具体业务逻辑的地方,这一层包含我们业务最重要的逻辑。
LinkinStar
2023/02/22
5450
Go语言技巧 - 9.【浅析微服务框架】Kratos概览
截止到本文发布时,Kratos在github上的star数达到了15.9k。其中,在2021年7月,也正式推出了v2这个大版本。
junedayday
2022/01/04
2.3K0
Go语言技巧 - 9.【浅析微服务框架】Kratos概览
推荐阅读
相关推荐
Go 语言微服务框架 Kratos 开发 HTTP API
更多 >
LV.0
奇虎360服务端资深工程师
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验