当前位置: 首页 > news >正文

Go微服务开源框架kratos的依赖注入关系总结

该文章为学习开源微服务框架kratos的学习笔记!官方文档见:简介 | Kratos

Kratos 一套轻量级 Go 微服务框架,包含大量微服务相关框架及工具。

一、Kratos 项目结构简介

通过 Kratos 工具生成的 Go工程化项目模板如下:

application
|____api
| |____helloworld
| | |____v1
| | |____errors
|____cmd
| |____helloworld
|____configs
|____internal
| |____conf
| |____data
| |____biz
| |____service
| |____server
|____test
|____pkg
|____go.mod
|____go.sum
|____LICENSE
|____README.md

二、kratos 依赖注入关系图

 其中有关依赖注入的详细文档见:Go工程化 - 依赖注入 | Kratos

以下是我自己总结的kratos依赖注入关系图:

特别注意:data层的 NewXxxRepo 返回的是 biz 层定义的实体数仓的接口类型!!!

这样做的目的:正常情况是 data 层定义好数据操作函数后被 biz 层调用,但这里是 biz 层定义好操作数据层的接口,然后让 data 层去实现,从而实现 data 层对 biz 层的反向依赖。这样做的好处是方便 data 层重构(比如数据存储由 mysql 改为 sqlServer 等),而不需要修改任何 biz 层的代码。

//下面代码位于 data/article.go
// 注意返回参数为 biz 层的接口,ArticleRepo 需要实现 biz.ArticleRepo 接口
func NewArticleRepo(data *Data, logger log.Logger) biz.ArticleRepo {return &articleRepo{data: data,log:  log.NewHelper(logger),}
}// 下面代码位于 biz/article.go
// 在 biz 层定义好数据操作层(data层)的接口,以便让 data 层实现,不管 data 层今后如何实现或重构,都不影响 biz 层的业务代码
type ArticleRepo interface {// dbListArticle(ctx context.Context) ([]*Article, error)GetArticle(ctx context.Context, id int64) (*Article, error)CreateArticle(ctx context.Context, article *Article) errorUpdateArticle(ctx context.Context, id int64, article *Article) errorDeleteArticle(ctx context.Context, id int64) error
}

三、依赖注入生成的代码实例

运用 google/wire 工具将上述依赖注入生成具体的kratos项目代码示例:

原始 wire.go 代码:

// initApp init kratos application.
func initApp(*conf.Server, *conf.Data, *conf.Auth, log.Logger) (*kratos.App, func(), error) {panic(wire.Build(server.ProviderSet, data.ProviderSet, biz.ProviderSet, service.ProviderSet, newApp))
}

 工具生成的代码wire_gen.go:

// initApp init kratos application.
func initApp(confServer *conf.Server, confData *conf.Data, auth *conf.Auth, logger log.Logger) (*kratos.App, func(), error) {dataData, cleanup, err := data.NewData(confData, logger)if err != nil {return nil, nil, err}articleRepo := data.NewArticleRepo(dataData, logger)articleUsecase := biz.NewArticleUsecase(articleRepo, logger)blogService := service.NewBlogService(articleUsecase, logger)userRepo := data.NewUserRepo(dataData, logger)encryptService := biz.NewEncryptService(auth)accountUseCase := biz.NewAccountUseCase(logger, auth, userRepo, encryptService)accountService := service.NewAccountService(logger, accountUseCase)httpServer := server.NewHTTPServer(confServer, logger, blogService, accountService)grpcServer := server.NewGRPCServer(confServer, logger, blogService, accountService)app := newApp(logger, httpServer, grpcServer)return app, func() {cleanup()}, nil
}

http://www.lryc.cn/news/350097.html

相关文章:

  • Linux 第三十二章
  • 手机号码的正则表达式
  • 机器学习入门介绍
  • 一文说通用户故事点数是什么?
  • GAME101-Lecture07学习
  • 【一步一步了解Java系列】:了解Java与C语言的运算符的“大同小异”
  • ICSE docker related research
  • 【C++】学习笔记——多态_1
  • C++map容器关联式容器
  • TS-抽象类和静态成员
  • SharePoint 使用renderListDataAsStream方法查询list超过5000时的数据
  • 2024042001-计算机网络 - 物理层
  • 通过java将数据导出为PDF,包扣合并单元格操作
  • Java内存模式以及volatile关键字的使用
  • 每日5题Day3 - LeetCode 11 - 15
  • 路由器、交换机和网卡
  • 腾讯开源混元DiT文生图模型,消费级单卡可推理
  • shell脚本基础(if/else结构)
  • 万字长文破解 AI 图片生成算法-Stable diffusion (第一篇)
  • Linux---编辑器vim的认识与简单配置
  • lucene中Collector类、CollectorManager类区分和用法
  • Android之给Button上添加按压效果
  • python EEL + vue3.js 项目中如何把组件中的函数提升为全局函数
  • sqli-labs靶场第十四关
  • 【C语言】6.C语言VS实用调试技巧(1)
  • AIGC行业现在适合进入吗
  • ubuntu CUDA 驱动更新,版本更新,多CUDA版本管理
  • effective python学习笔记_类与接口
  • 如何去除字符串两侧的空白字符?
  • Flutter 中的 PageStorage 小部件:全面指南