[Go 微服務] Kratos 使用的簡單總結

文章目錄

      • 1.Kratos 簡介
      • 2.傳輸協議
      • 3.日志
      • 4.錯誤處理
      • 5.配置管理
      • 6.wire

1.Kratos 簡介

Kratos并不綁定于特定的基礎設施,不限定于某種注冊中心,或數據庫ORM等,所以您可以十分輕松地將任意庫集成進項目里,與Kratos共同運作。

在這里插入圖片描述
API -> Service(wire) -> DB

  1. 可以看到kratos將整個服務大體分為了3層,API / Service / DB。
  2. 左側標注了在 Service和DB層,使用依賴注入(DI)進行實現,工具名稱為Wire。
  3. 可以看到Wire這個工具幾乎貫穿Kratos架構始終,是一個大角色。

2.傳輸協議

支持http + grpc兩種調用方式,通過編寫proto文件來實現。

一般,http開放給外部調用,可以使用restful風格定義。grpc面向內部微服務之間進行調用。

在這里插入圖片描述

? 在項目中,會以這樣的結構出現,并且可以對不同協議進來的請求進行處理,添加處理的中間件,如權限校驗、熔斷限流等等。

3.日志

在kratos中,可以自定義日志框架選型,設置日志格式和輸出內容,然后將logger對象以依賴注入的方式,分配給server中的grpc server和http server,這樣就可以實現每次收到請求后的日志打印。

將logger對象以依賴注入的方式,注入到業務層,就可以在業務層中統一使用logger進行輸出。

4.錯誤處理

在grpc中,比較通用的一種錯誤處理方式就是直接通過 proto 預定義定義錯誤碼,然后通過 proto-gen-go 生成幫助代碼,直接返回 error。

{// 錯誤碼,跟 http-status 一致,并且在 grpc 中可以轉換成 grpc-status"code": 500,// 錯誤原因,定義為業務判定錯誤碼"reason": "USER_NOT_FOUND",// 錯誤信息,為用戶可讀的信息,可作為用戶提示內容"message": "invalid argument error",// 錯誤元信息,為錯誤添加附加可擴展信息"metadata": {"foo": "bar"}
}

這里可以發現,為了兼容grpc,在http的返回結果中,code也無法自定義,只能跟隨httpcode。所以這里客戶端或者第三方去處理錯誤時,需要判斷reason字段。

5.配置管理

使用proto文件定義配置和生成struct,然后將yaml中的內容讀取到對應struct 字段中進行使用。

在這里我們可以注意到,在kratos中,除了傳輸格式使用了proto進行定義之外,錯誤處理和配置管理,也使用了proto來進行。可以說,一切皆proto。

6.wire

Wire 是一個靈活的依賴注入工具(需要安裝),通過自動生成代碼的方式在編譯期完成依賴注入。通過 Wire 進行初始化代碼,可以很好地解決組件之間的耦合,以及提高代碼維護性。

打開Kratos的示例項目,從main入口看,有一處調用了wireApp方法,這里就是一切的源頭(萬惡之源)。

這個方法調用的是main同目錄的wire文件中的wireApp方法,同目錄的wire_gen.go實現了此方法。

wire_gen中去實例化不同service和組建的對象,用于調用。關系圖如下:

在這里插入圖片描述

在這里插入圖片描述

server -> service -> biz -> data

main.go -> wire.go(wire_gen.go)

在這里插入圖片描述

wire.go 中有用到ProviderSet

package mainimport ("kratos-demo03/internal/biz""kratos-demo03/internal/conf""kratos-demo03/internal/data""kratos-demo03/internal/server""kratos-demo03/internal/service""github.com/go-kratos/kratos/v2""github.com/go-kratos/kratos/v2/log""github.com/google/wire"
)// wireApp init kratos application.
func wireApp(*conf.Server, *conf.Data, log.Logger) (*kratos.App, func(), error) {panic(wire.Build(server.ProviderSet, data.ProviderSet, biz.ProviderSet, service.ProviderSet, newApp))
}

main.go 有用到App和Config

package mainimport ("flag""os""kratos-demo03/internal/conf""github.com/go-kratos/kratos/v2""github.com/go-kratos/kratos/v2/config""github.com/go-kratos/kratos/v2/config/file""github.com/go-kratos/kratos/v2/log""github.com/go-kratos/kratos/v2/middleware/tracing""github.com/go-kratos/kratos/v2/transport/grpc""github.com/go-kratos/kratos/v2/transport/http"_ "go.uber.org/automaxprocs"
)// go build -ldflags "-X main.Version=x.y.z"
var (// Name is the name of the compiled software.Name string// Version is the version of the compiled software.Version string// flagconf is the config flag.flagconf stringid, _ = os.Hostname()
)func init() {flag.StringVar(&flagconf, "conf", "../../configs", "config path, eg: -conf config.yaml")
}func newApp(logger log.Logger, gs *grpc.Server, hs *http.Server) *kratos.App {return kratos.New(kratos.ID(id),kratos.Name(Name),kratos.Version(Version),kratos.Metadata(map[string]string{}),kratos.Logger(logger),kratos.Server(gs,hs,),)
}func main() {flag.Parse()logger := log.With(log.NewStdLogger(os.Stdout),"ts", log.DefaultTimestamp,"caller", log.DefaultCaller,"service.id", id,"service.name", Name,"service.version", Version,"trace.id", tracing.TraceID(),"span.id", tracing.SpanID(),)c := config.New(config.WithSource(file.NewSource(flagconf),),)defer c.Close()if err := c.Load(); err != nil {panic(err)}var bc conf.Bootstrapif err := c.Scan(&bc); err != nil {panic(err)}app, cleanup, err := wireApp(bc.Server, bc.Data, logger)if err != nil {panic(err)}defer cleanup()// start and wait for stop signalif err := app.Run(); err != nil {panic(err)}
}

在每個模塊中,只需要一個 ProviderSet 提供者集合,就可以在 wire 中進行依賴注入。

有一個數據庫連接對象,service需要操作數據庫,依賴數據庫連接對象。這時候我們可以聲明數據庫連接對象在ProviderSet集合,然后在service對象處聲明,我需要一個數據庫連接對象。 然后我們使用wire工具,就可以自動幫我們生成依賴注入的代碼。

這里的依賴注入讓代碼間的依賴關系一目了然。只需要查看wire_gen.go代碼就可以了解依賴關系。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/39843.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39843.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/39843.shtml

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

相關文章

Linux內網端口轉公網端口映射

由于服務商做安全演練,把原先服務器內網的端口映射到外網端口全都關閉了,每次維護服務器特別麻煩,像數據庫查詢如果用原生的mysql 去連接,查詢返回的結果亂了,非常不方便。 查了服務還是可以正常訪問部分外網的&#x…

知識圖譜查詢語言的表示

文章目錄 SPARQL知識圖譜查詢基本構成常見的SPARQL查詢算子語義Markup表示語言SPARQL知識圖譜查詢基本構成 RDF 支持類似數據庫的查詢語言,叫作SPARQL,它提供了查詢RDF 數據的標準語法、處理SPARQL查詢的規則以及結果返回形式。 變量,RDF中的資源,以“?”或者“$”指示;…

【chatgpt】pytorch的全連接層FC

文章目錄 創建全連接層全連接層(線性層)使用 PyTorch 定義全連接層1. 定義一個全連接層2. 查看層的參數3. 使用全連接層 示例:構建一個簡單的神經網絡總結 打印FC參數輸出解釋完整代碼示例示例輸出總結 線性層的參數和屬性線性層的參數和屬性…

抖音外賣服務商入駐流程及費用分別是什么?入駐官方平臺的難度大嗎?

隨著抖音關于新增《【到家外賣】內容服務商開放準入公告》的意見征集通知(以下簡稱“通知”)的發布,抖音外賣服務商入駐流程及費用逐漸成為眾多創業者所關注和熱議的話題。不過,就當前的討論情況來看,這個話題似乎沒有…

軟件測試中安全測試包含內容及安全測試怎么測

一、軟件測試安全測試包含哪些 1. 漏洞掃描 漏洞掃描是軟件測試安全測試的基礎,它用于檢測應用程序和系統中存在的已知漏洞。安全測試工具如AppScan、OWASP ZAP和Nessus等可以對應用程序進行自動化掃描,發現可能存在的漏洞,如跨站點腳本&am…

7.2、指針變量的定義和使用

代碼 #include <iostream> using namespace std; #include <string>int main() {//定義指針int a 10;//指針定義語法&#xff1a;數據類型 * 指針變量名int * p;//讓指針記錄變量a的地址p &a;cout << "a的地址為&#xff1a;" << &am…

MySQL之應用層優化(二)

應用層優化 Web服務器問題 尋找最優并發度 每個Web服務器都有一個最佳并發度——就是說&#xff0c;讓進程處理請求盡可能快&#xff0c;并且不超過系統負載的最優的并發連接數。這就是前面說的最大系統容量。進行一個簡單的測量和建模&#xff0c;或者只是反復試驗&#xf…

2024年湖南省各市科小申報時間(科技型中小企業申報流程、條件、好處)新政

湖南省各市科小申報時間流程 一、評價管理 省科技廳牽頭負責科技型中小企業評價工作的組織和監督、實地核查、公示公告、入庫登記及編號撤銷和集中抽查工作&#xff0c;及時處理相關異議、投訴和舉報信息。 各市州科技局負責科技型中小企業評價工作的具體實施&#xff0c;組…

nginx SSI(Server Side Include)服務端包含 合并拼裝靜態內容

一、什么是SSI 在被傳送給瀏覽器之前&#xff0c;服務器會對 HTML 文檔進行完全地讀取、分析以及修改&#xff0c;使用SSI指令將文本、圖片或代碼信息包含到網頁中。對于整個頁面可以拆分成多個模塊&#xff0c;通過SSI指令將幾個模塊拼接成一個完整的頁面&#xff0c;當有內容…

【數據庫原理】課程筆記

數據庫原理 一、數據庫系統基礎 數據模型的類型 概念數據模型&#xff1a; 概念數據模型也稱概念模型或信息模型,是對現實世界中問題域內事務(特性)的描述,是以用戶觀點實現世界的模型(圖形表示)。主要用于描述事物的概念化結構,使數據庫的設計人員在設計初期,避開計算機系統及…

ATA-L2水聲功率放大器驅動水聲換能器的測試研究

隨著水聲通信技術的發展&#xff0c;水下通信設備也開始逐步走向實用化&#xff0c;為了滿足其實際的使用要求&#xff0c;功率放大器的設計需要具有高效率的特性&#xff0c;并能在水下長時間連續可靠的工作。 壓電陶瓷換能器主要負責電信號與聲信號之間的轉換&#xff0c;換能…

mybatis配置返回boolean類型

先大概說明一下ResultMap和ResultType的使用場景 ResultMap適用于復雜的查詢&#xff0c;可以處理多表關聯查詢、嵌套查詢等情況。通過ResultMap&#xff0c;可以更精確地控制查詢結果的映射。ResultType適用于簡單的查詢&#xff0c;而ResultMap適用于復雜的查詢。具體使用哪…

學習整理在php中使用PHPExcel讀取excel表列數大于Z時讀取不到的解決方案

php讀取excel列數大于Z時讀取不到 背景解決方案關鍵代碼 背景 表格數據超過26列&#xff0c; 也就是在Z列之前沒有AA列及以后的情況&#xff0c; 測試一直都沒有問題&#xff0c;超過&#xff0c;就會獲取不到數據了 解決方案 private function getExcelData(){//獲取excel文…

使用Python進行文件屬性修改

哈嘍,大家好,我是木頭左! 在計算機中,文件屬性是指與文件相關的元數據,如創建時間、修改時間、訪問時間等。這些屬性對于管理和組織文件非常重要。Python提供了一些內置的函數和方法,可以方便地修改文件的屬性。本文將介紹如何使用Python進行文件屬性的修改。 1. 獲取文件…

應用密碼學—(擴展)歐幾里得、DES、RSA、SHA-1算法

1. 歐幾里得算法 1.1 分析算法的實現原理 歐幾里德&#xff08;Euclid&#xff09;算法&#xff0c;也既常說的“輾轉相除法”&#xff0c;公式為gcd(m, n) { return gcd(n, m%n); }&#xff0c;對于任意兩個正整數m、n&#xff0c;每次求的一個數字r m % n&#xff0c;然后把…

教育場景中的自動化分揀系統!基于大象機器人UltraArm P340機械臂和傳送帶的實現

引言 今天我們將展示一個高度自動化的模擬場景&#xff0c;展示多個機械臂與傳送帶協同工作的高效分揀系統。在這個場景中&#xff0c;機械臂通過視覺識別技術對物體進行分類&#xff0c;并通過精確的機械操作將它們放置在指定的位置。這一系統不僅提高了分揀的速度和準確性&am…

PTrade怎么獲取KDJ隨機指標?想做量化策略怎么申請PTrade量化軟件?

get_KDJ - 隨機指標 get_KDJ(high, low, close, n9, m13, m23) 使用場景 該函數僅在回測、交易模塊可用 接口說明 獲取隨機指標KDJ指標的計算結果 PTrade是恒生公司開發的一款專業量化軟件&#xff0c;部分合作券商可提供&#xff0c;↑↑↑&#xff01; 參數 high&…

什么是分庫分表?它有哪些實現類型?

假如你正在使用關系型數據庫開發一款健康類系統。業務發展很好&#xff0c;系統有很多活躍的新老用戶&#xff0c;這些用戶會和平臺的醫生團隊進行交互&#xff0c;每天可能會生成數萬甚至數十萬級別的業務數據。這樣的話&#xff0c;隨著數據量越來越大&#xff0c;系統中的某…

如何在返利App中進行高效的異常處理與監控

如何在返利App中進行高效的異常處理與監控 大家好&#xff0c;我是微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在開發返利App過程中&#xff0c;高效的異常處理與監控是確保系統穩定性和用戶體驗的關鍵。本文將深入探討…

被?絡罪犯利?的5?ChatGPT越獄提?

?ChatGPT發布的近18個月以來&#xff0c;?絡罪犯們已經能夠利??成式AI進?攻擊。OpenAI在其內容政策中制定了限制措施&#xff0c;以阻??成惡意內容。作為回應&#xff0c;攻擊者們創建了??的?成式AI平臺&#xff0c;如 WormGPT和FraudGPT&#xff0c;并且他們還分享了…