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.pswp.cn/diannao/13092.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13092.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13092.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【半夜學習MySQL】復合查詢(含多表查詢、自連接、單行/多行子查詢、多列子查詢、合并查詢等詳解)

🏠關于專欄:半夜學習MySQL專欄用于記錄MySQL數據相關內容。 🎯每天努力一點點,技術變化看得見 文章目錄 回顧基本查詢多表查詢自連接子查詢單行子查詢多行子查詢多列子查詢在from子句中使用子查詢合并查詢 回顧基本查詢 下面使用…

計算機網絡 -- 序列化與反序列化

一 協議的重要性 我們都知道,在進行網絡通信的過程中,通信的雙方可以是不同的設備,不同的平臺,不同的平臺,比如說,手機用戶和電腦用戶進行通信,ios系統和安卓系統進行通信。 自己的數據&#xf…

抖店商品詳情API接口(店鋪|標題|主圖|價格|SKU屬性等)

抖店商品詳情API接口(店鋪|標題|主圖|價格|SKU屬性等) 抖店商品詳情API接口是指通過調用抖音開放平臺提供的接口,獲取抖店上商品的詳細信息的方法。 抖店開放平臺提供了一系列的接口,可以用于獲取商品的基本信息、價格、庫存、銷量、評價等各種信息。以…

UIKit之圖片瀏覽器

功能需求 實現一個圖片瀏覽器,點擊左右按鈕可以切換背景圖,且更新背景圖對應的索引頁和圖片描述內容。 分析: 實現一個UIView的子類即可,該子類包含多個按鈕。 實現步驟: 使用OC語言,故創建cocoa Touch類…

數據庫的存儲過程、函數與觸發器

使用下面的場景來引入 1.創建表 CREATE DATABASE staff; USE staff; CREATE TABLE employee(id INT NOT NULL AUTO_INCREMENT,userName VARCHAR(255),birthDate DATE,idCard VARCHAR(255),loginName VARCHAR(255),PASSWORD VARCHAR(255),mobile VARCHAR(255),email VARCHAR(2…

開源連鎖收銀系統哪個好

針對開源連鎖收銀系統的選擇,商淘云是一個備受關注的候選。商淘云以其功能豐富、易于定制和穩定性等優勢,吸引了眾多企業和開發者的關注。下面將從四個方面探討商淘云開源連鎖收銀系統的優勢: 首先,商淘云提供了豐富的功能模塊。作…

如何查看SNMP設備的OID

什么是OID和MIB OID OID 代表對象標識符。 OID 唯一地標識 MIB 層次結構中的托管對象。 這可以被描述為一棵樹,其級別由不同的組織分配。MIB MIB(管理信息基)提供數字化OID到可讀文本的映射。 使用MIB Browser掃描OID 我的設備是一臺UPS SN…

【Uniapp小程序】onShareAppMessage異步處理請求完后再分享

分享按鈕 <button type"primary" open-type"share">保存并分享 </button>修改onShareAppMessage saveImage為promise方法 async onShareAppMessage() {const saveRes await saveImage();if (saveRes.code 200) {return {title: "tit…

每日兩題 / 236. 二叉樹的最近公共祖先 124. 二叉樹中的最大路徑和(LeetCode熱題100)

236. 二叉樹的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09; dfs統計根節點到p&#xff0c;q節點的路徑&#xff0c;兩條路徑中最后一個相同節點就是公共祖先 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* …

windows部署騰訊tmagic-editor02-Runtime

創建editor項目 將上一教程中的hello-world復制過來&#xff0c;改名hello-editor 創建runtime項目 和hello-editor同級 pnpm create vite刪除src/components/HelloWorld.vue 按鈕需要用的ts types依賴 pnpm add tmagic/schema tmagic/stage實現runtime 將hello-editor中…

【C語言】5.C語言函數(2)

文章目錄 7.嵌套調?和鏈式訪問7.1 嵌套調?7.2 鏈式訪問 8.函數的聲明和定義8.1 單個?件8.2 多個?件8.3 static 和 extern8.3.1 static 修飾局部變量8.3.2 static 修飾全局變量8.3.3 static 修飾函數 7.嵌套調?和鏈式訪問 7.1 嵌套調? 嵌套調用就是函數之間的互相調用。…

Docker安裝Mosquitto

在物聯網項目中&#xff0c;我們經常用到MQTT協議&#xff0c;用MQTT協議做交互就需要部署一個MQTT服務&#xff0c;而mosquitto是一個常用的MQTT應用服務&#xff0c; Mosquitto是一個實現了消息推送協議MQTT v3.1的開源消息代理軟件。MQTT&#xff08;Message Queuing Teleme…

python的幾個關于文本文件的demo腳本

部分來自WeTab AI PRO 1.在文末添加一行文字 def add_endline(filename, texts): # 文本末尾增加一行with open(filename, a) as file:file.write(f\n{texts})file.close() 當使用 open() 函數打開文件時&#xff0c;第二個參數指定了文件的打開模式。常見的文件打開模式包…

【LeetCode】每日一題 2024_5_14 完成所有任務需要的最少輪數(哈希)

文章目錄 LeetCode&#xff1f;啟動&#xff01;&#xff01;&#xff01;題目&#xff1a;完成所有任務需要的最少輪數題目描述代碼與解題思路 每天進步一點點 LeetCode&#xff1f;啟動&#xff01;&#xff01;&#xff01; 題目&#xff1a;完成所有任務需要的最少輪數 題…

拿到測試點如何跑

首先你要知道你測試點文件的位置,然后你要創建一個接收結果的文件,將你代碼中的std::cin替換成infile,std::cout替換成outfile即可 #include <fstream> int main() {// 打開輸入文件std::ifstream infile("C:\\Users\\Downloads\\P4779_1.in");// 打開輸出文件…

OpenCV 圖像退化與增強

退化 濾波 img_averagingcv2.blur(img2,(3,3)) #均值濾波 img_median cv2.medianBlur(img2,3) #中值濾波高斯模糊 result cv2.GaussianBlur(source, (11,11), 0)高斯噪聲 def add_noise_Guass(img, mean0, var0.01): # 添加高斯噪聲img np.array(img / 255, dtypefloat…

麒麟 V10 安裝docker2

1. 查看系統版本 2.安裝docker-ce 添加源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 安裝docker yum install docker-ce --allowerasing 重啟docker systemctl start docker 3.安裝nvidia-container-runtime 添…

el-tooltip 提示框樣式修改?

【element-plus el-tooltip官網地址&#xff1a; Tooltip 文字提示 | Element Plus】 <el-tooltippopper-class"Tooltip":content"content"placement"top"effect"light" ><span class"content">{{ content }}&l…

【TypeScript的JSX簡介以及使用方法】

TypeScript 是 JavaScript 的一個超集&#xff0c;它添加了靜態類型檢查和面向對象編程的特性。JSX 是一種 JavaScript 的語法擴展&#xff0c;主要用于 React 組件的聲明性渲染。TypeScript 完美地支持 JSX&#xff0c;并允許你為 React 組件和它們的 props 添加類型注解。 T…

C中Mysql的基本api接口

一、初始化參數返回值 二、鏈接服務器三、執行SQL語句注意事項 四、獲取結果集4.1mysql_affected_rows和mysql_num_rows4.2mysql_store_result與mysql_free_result注意事項注意事項整體的工作流程 4.3mysql_use_result&#xff08;&#xff09;4.4mysql_field_count&#xff08…