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
}
相关文章:

Go微服务开源框架kratos的依赖注入关系总结
该文章为学习开源微服务框架kratos的学习笔记!官方文档见:简介 | Kratos Kratos 一套轻量级 Go 微服务框架,包含大量微服务相关框架及工具。 一、Kratos 项目结构简介 通过 Kratos 工具生成的 Go工程化项目模板如下: applicati…...
Linux 第三十二章
🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要等到什么都没有了…...
手机号码的正则表达式
手机号码的正则表达式会根据不同的国家/地区有所不同,因为每个国家/地区都有自己特定的手机号码格式。但是,我可以为你提供一个通用的正则表达式模板,并给出一些具体国家/地区的例子。 通用模板 一个基本的手机号码正则表达式模板可能如下所…...

机器学习入门介绍
各位大佬好 ,这里是阿川的博客 , 祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 目录 三大方向机器学习产生的原因机器如何学习…...

一文说通用户故事点数是什么?
一文说通用户故事点数是什么? 第26期:一文说通用户故事点数是什么? 用户故事点数是一种采用相对估算法进行估算的一种工具,一般采用斐波那契数列表征用户故事里说的大小,采用0 1 2 3 5 8 13这样的一些数字来表征用户…...

GAME101-Lecture07学习
前言 今天主要讲shading(着色)。在讲着色前,要先讲图形中三角形出现遮挡问题的方法(深度缓存或缓冲)。 先采样再模糊错误:对信号的频谱进行翻译(在这期间会有频谱的混叠)ÿ…...

【一步一步了解Java系列】:了解Java与C语言的运算符的“大同小异”
看到这句话的时候证明:此刻你我都在努力~ 加油陌生人~ 个人主页: Gu Gu Study 专栏:一步一步了解Java 喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努…...
ICSE docker related research
ICSE 2024 Empirical Study of the Docker Smells Impact on the Image Size Docker 气味对镜像大小影响的实证研究 Docker 是一种广泛采用的打包和部署应用程序的工具,它利用 Dockerfile 来构建镜像。然而,创建最佳的 Dockerfile 可能具有挑战性&…...

【C++】学习笔记——多态_1
文章目录 十二、继承8. 继承和组合 十三、多态1. 多态的概念2. 多态的定义和实现虚函数重写的两个特殊情况override 和 final 3. 多态的原理1. 虚函数表 未完待续 十二、继承 8. 继承和组合 我们已经知道了什么是继承,那组合又是什么?下面这种情况就是…...

C++map容器关联式容器
Cmap 1. 关联式容器 vector、list、deque、forward_list(C11)等STL容器,其底层为线性序列的数据结构,里面存储的是元素本身,这样的容器被统称为序列式容器。而map、set是一种关联式容器,关联式容器也是用来存储数据的࿰…...
TS-抽象类和静态成员
目录 1,抽象类1,为什么需要抽象类2,抽象成员3,设计模式-模板模式 2,静态成员1,什么是静态成员2,设计模式-单例模式 1,抽象类 1,为什么需要抽象类 有时,某个…...

SharePoint 使用renderListDataAsStream方法查询list超过5000时的数据
问题: 当SharePoint List里的数据超过5000时,如果使用常用的rest api去获取数据,例如 await this.sp.web.lists.getByTitle(Document Library).rootFolder.files.select(*, listItemAllFields).expand(listItemAllFields).filter(listItemA…...

2024042001-计算机网络 - 物理层
计算机网络 - 物理层 计算机网络 - 物理层 通信方式带通调制 通信方式 根据信息在传输线上的传送方向,分为以下三种通信方式: 单工通信:单向传输半双工通信:双向交替传输全双工通信:双向同时传输 带通调制 模拟信号…...

通过java将数据导出为PDF,包扣合并单元格操作
最近项目中需要将查询出来的表格数据以PDF形式导出,并且表格的形式包含横向行与纵向列的单元格合并操作,导出的最终效果如图所示: 首先引入操作依赖 <!--导出pdf所需包--><dependency><groupId>com.itextpdf</groupId&…...
Java内存模式以及volatile关键字的使用
1.Java内存模型 (1)Java 内存模型(Java Memory Model,简称 JMM),它是一个抽象的概念,JMM是和多线程相关的,它是一组规范,描述了一组规则,定义了多线程对共享…...

每日5题Day3 - LeetCode 11 - 15
每一步向前都是向自己的梦想更近一步,坚持不懈,勇往直前! 第一题:11. 盛最多水的容器 - 力扣(LeetCode) class Solution {public int maxArea(int[] height) {//这道题比较特殊,因为两边是任意…...

路由器、交换机和网卡
大家使用VMware安装镜像之后,是不是都会考虑虚拟机的镜像系统怎么连上网的,它的连接方式是什么,它ip是什么? 路由器、交换机和网卡 1.路由器 一般有几个功能,第一个是网关、第二个是扩展有线网络端口、第三个是WiFi功…...

腾讯开源混元DiT文生图模型,消费级单卡可推理
节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接…...
shell脚本基础(if/else结构)
命令是双向选择语句,当用户执行脚本时如果不满足if后的表达式也会执行else后的命令,所以有很好的交互性。其结构为: if expression1 then command … command else command … command fi vim ifelse_exam.sh #ifelse_exam.sh #!/bin/bashec…...

万字长文破解 AI 图片生成算法-Stable diffusion (第一篇)
想象一下:你闭上眼睛,脑海中构思一个场景,用简短的语言描述出来,然后“啪”的一声,一张栩栩如生的图片就出现在你眼前。这不再是科幻小说里才有的情节,而是Stable Diffusion——一种前沿的AI图片生成算法—…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...

基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...