成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 語言微服務框架 Kratos 操作 MySQL 和 Redis

開發 前端
本文我們以 XORM 和 Go Redis 為例,介紹 Kratos 微服務框架怎么集成 XORM[1] 和 Go Redis[2] 操作 MySQL 和 Redis。

1.介紹

Go 語言微服務框架 Kratos 不限制使用任何第三方庫,我們可以根據個人喜好選擇第三方庫。

本文我們以 XORM 和 Go Redis 為例,介紹 Kratos 微服務框架怎么集成 XORM[1] 和 Go Redis[2] 操作 MySQL 和 Redis。

2.集成 XORM 和 Go Redis

創建項目

kratos new blog

安裝 MySQL 驅動

示例代碼:

go get -u github.com/go-sql-driver/mysql

安裝 xorm

示例代碼:

go get xorm.io/xorm

安裝 go redis

示例代碼:

go get github.com/redis/go-redis/v9

客戶端

編寫文件 blog/internal/data/data.go。

導入第三方庫

import (
 _ "github.com/go-sql-driver/mysql"
 "github.com/redis/go-redis/v9"
 "xorm.io/xorm"
)

添加 xorm 和 go redis 客戶端

// 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
}

創建函數 NewDbEngine 和 NewRedisClient

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。

// ProviderSet is data providers.
var ProviderSet = wire.NewSet(NewData, NewGreeterRepo, NewDbEngine, NewRedisClient)

3.使用 XORM 和 Go Redis

我們以操作用戶表 user 為例,介紹怎么使用 XORM 和 Go Redis。

數據庫表 user 表結構

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 結構體

type User struct {
 Id       int64 `xorm:"autoincr""`
 Name     string
 Email    string
 Password string
 Created  int64 `xorm:"created""`
 Updated  int64 `xorm:"updated""`
}

定義 UserRepository

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

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。

// ProviderSet is biz providers.
var ProviderSet = wire.NewSet(NewGreeterUsecase, NewUserUsecase)

Repository 層

然后,我們需要在 blog/internal/data 目錄中,創建 user.go 文件和 redis.go 文件。

在 user.go 文件和 redis.go 文件中,我們實現 UserRepository 接口中的方法。

MySQL

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

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。

// ProviderSet is data providers.
var ProviderSet = wire.NewSet(NewData, NewGreeterRepo, NewDbEngine, NewUserRepository, NewRedisClient)

Delivery 層

再然后,我們編輯 blog/internal/service/user.go 文件,完善該文件中的方法。

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。

// ProviderSet is service providers.
var ProviderSet = wire.NewSet(NewGreeterService, NewUserService)

注冊服務

最后,進入 blog/internal/server 目錄,編寫 http.go 和 grpc.go 文件,添加函數簽名 user *service.UserService。

并且,分別在函數體中注冊服務。

示例代碼:

HTTP

v1_user.RegisterUserHTTPServer(srv, user)

gRPC

v1_user.RegisterUserServer(srv, user)

Wire 生成代碼

進入目錄 blog/cmd/blog,執行 wire 命令。

cd blog/cmd/blog
wire

項目運行和測試

Kratos 運行

kratos run

curl 請求示例

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

4.總結

本文我們通過示例代碼,介紹 Kratos 微服務框架怎么集成第三方庫,操作 MySQL 和 Redis。

責任編輯:武曉燕 來源: Golang語言開發棧
相關推薦

2025-01-13 00:00:07

Go語言微服務

2024-12-23 00:22:55

2025-01-20 00:10:00

Go語言Kratos

2025-01-06 00:00:01

KratosGo微服務

2020-07-02 16:20:36

MySQLCURD數據庫

2021-01-23 12:47:19

MySQL數據庫Go語言

2021-07-26 11:19:43

微服務開發技術

2024-01-07 19:54:51

2023-12-13 07:19:01

微服務架構Golang

2021-09-06 11:34:47

架構微服務Hystrix

2021-03-05 11:09:46

Go框架微服務

2018-01-22 11:50:30

華為云

2021-01-27 10:01:46

MySQL數據庫SQLX

2023-07-03 00:44:26

Go語言MySQL

2021-01-14 09:55:21

Java微服務Go

2018-12-13 09:00:23

GoogleGo微服務

2024-04-28 14:46:55

gozero微服務技巧

2020-11-12 08:30:38

Java微服務Go

2025-02-04 13:53:18

NixGogRPC

2020-11-03 09:00:00

API微服務JavaScript框
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天堂一区二区三区 | 免费不卡av | 国产在线a| 99免费在线视频 | 国产美女在线观看 | 日本免费在线 | 亚洲视频一区在线观看 | 久久婷婷麻豆国产91天堂 | 中文字幕在线观看视频一区 | 一级黄片一级毛片 | 日韩精品一区二区三区免费观看 | 国产精品精品3d动漫 | 国产在线www| 日韩av一区二区在线 | 成人在线小视频 | 欧美激情一区二区三区 | 亚洲欧美在线视频 | 99精品久久久久久久 | 色约约视频 | 日韩激情在线 | 日韩av成人| 91亚洲精选| 欧美一区二区在线播放 | 国产视频久久 | 日韩精品免费一区 | 91av在线免费播放 | 国产一区视频在线 | 日本人和亚洲人zjzjhd | 日本国产高清 | 国产不卡视频 | 最新国产在线 | 国产精品伦一区二区三级视频 | 人妖一区| 国产激情第一页 | 在线观看一区 | 日韩免费| 91香蕉视频在线观看 | 在线播放中文 | 色视频网站在线观看 | 91久久久久久 | 一区二区三区四区国产 |