最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go微服務(wù)項(xiàng)目配置文件的定義和讀取示例詳解

 更新時(shí)間:2022年06月21日 09:42:15   作者:萬俊峰Kevin  
這篇文章主要為大家介紹了Go微服務(wù)項(xiàng)目配置文件的定義和讀取示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

我們?cè)趯憫?yīng)用時(shí),基本都會(huì)用到配置文件,從各種 shell 到 nginx 等,都有自己的配置文件。雖然這沒有太多難度,但是配置項(xiàng)一般相對(duì)比較繁雜,解析、校驗(yàn)也會(huì)比較麻煩。本文就給大家講講我們是怎么簡(jiǎn)化配置文件的定義和解析的。

場(chǎng)景

如果我們要寫一個(gè) Restful API 的服務(wù),配置項(xiàng)大概有如下內(nèi)容:

  • Host,偵聽的 IP,如果不填,默認(rèn)用 0.0.0.0
  • Port,偵聽的端口,必填,只能是數(shù)字,大于等于80,小于65535
  • LogMode,日志模式,只能選 file 或者 console
  • Verbose,看是否輸出詳細(xì)日志,可選,默認(rèn)為 false
  • MaxConns,允許的最大并發(fā)連接數(shù),默認(rèn) 10000
  • Timeout,超時(shí)設(shè)置,默認(rèn) 3s
  • CpuThreshold,設(shè)置 CPU 使用率觸發(fā)系統(tǒng)降載的閾值,默認(rèn) 900,1000m 表示 100%

之前我們用 json 做配置文件,但是 json 有個(gè)問題,無法加注釋,所以我們后來切換到了 yaml 格式。

接下來讓我們看看借助 go-zero 怎么來方便的的定義和解析這樣的配置文件~

定義配置

首先,我們需要將上述配置需求定義到 Go 結(jié)構(gòu)體里,如下:

RestfulConf struct {
    Host         string        `json:",default=0.0.0.0"`
    Port         int           `json:",range=[80,65535)"`
    LogMode      string        `json:",options=[file,console]"`
    Verbose      bool          `json:",optional"`
    MaxConns     int           `json:",default=10000"`
    Timeout      time.Duration `json:",default=3s"`
    CpuThreshold int64         `json:",default=900,range=[0:1000]"`
}

可以看到,我們對(duì)每個(gè)配置項(xiàng)都有一定的定義和限制,其中一些定義如下:

  • default,配置沒填的話,使用該默認(rèn)值,可以看到其中的 3s 會(huì)自動(dòng)解析成 time.Duration 類型
  • optional,此項(xiàng)可以不配置,沒有的話,用類型零值
  • range,限定數(shù)字類型,需要在給定的范圍內(nèi)
  • options,限制配置的值只能是給出的這幾個(gè)之一

并且,一些屬性可以疊加使用,比如:

  • default 和 range 一起使用,就可以既增加了范圍限制,又提供了默認(rèn)值
  • default 和 options 一起使用,就可以既增加了可選項(xiàng)限制,又提供了默認(rèn)值

配置文件

因?yàn)槲覀冊(cè)诙x配置的時(shí)候,給了很多的默認(rèn)值,還有使用 optional 指定為可選,所以我們的配置文件里的配置項(xiàng)就相對(duì)比較少了,能用默認(rèn)值的就不用寫了,如下:

# 因?yàn)楹芏喽加心J(rèn)值,所以只需要寫需要指定值和沒有默認(rèn)值的
Port: 8080
LogMode: console
# 可以讀取環(huán)境變量的值
MaxBytes: ${MAX_BYTES}

這里有個(gè)注意點(diǎn),如果配置項(xiàng)的 value 全部是數(shù)字,而你定義的配置類型是 string,比如有人測(cè)試密碼經(jīng)常用 123456,但是密碼一般會(huì)定義為 string,配置就要寫成如下(只是舉個(gè)例子哈,密碼一般不建議裸寫到配置文件里):

Password: "123456"

這里的雙引號(hào)不能少,少了會(huì)報(bào) type mismatch 之類的錯(cuò)誤,因?yàn)閥aml解析器會(huì)把不帶雙引號(hào)的 123456 解析成 int。

加載配置文件

我們有了配置定義(config.go)和配置文件(config.yaml),接下來就是加載配置文件了,加載配置文件有三種方式:

  • 必須加載成功,否則程序退出,我們一般這么用,如果配置不對(duì),程序就無法繼續(xù)了
// 有錯(cuò)誤直接退出程序
var config RestfulConf
conf.MustLoad("config.yaml", &config)

go-zero 自帶的 goctl 生成的默認(rèn)代碼也是使用 MustLoad 來加載配置文件的

  • 加載配置,并自行判斷是否有 error
// 自己判斷并處理 error
var config RestfulConf
// 為了更簡(jiǎn)潔,這里的 LoadConfig 后續(xù)會(huì)改為 Load,LoadConfig 已被標(biāo)記為 Deprecated
if err := conf.LoadConfig("config.yaml", &config); err != nil {
    log.Fatal(err)
}
  • 加載配置并讀取環(huán)境變量
// 自動(dòng)讀取環(huán)境變量
var config RestfulConf
conf.MustLoad(configFile, &config, conf.UseEnv())

這里為啥我們需要顯式指定 conf.UseEnv(),因?yàn)槿绻J(rèn)讀取的話,可能在配置里大家寫特定字符的時(shí)候就需要 escape 了,所以默認(rèn)不讀取環(huán)境變量,這個(gè)設(shè)計(jì)也歡迎大家多提提建議哈

實(shí)現(xiàn)原理

我們?cè)趯?shí)現(xiàn)類似 yaml/json 解析的時(shí)候一般會(huì)直接使用 encoding/json 或者對(duì)應(yīng)的 yaml 庫,但是對(duì)于 go-zero 來說,我們需要在 unmarshal 的時(shí)候有更精確的控制,這就需要我們自己定制 yaml/json 的解析了,完整的代碼實(shí)現(xiàn)在:

配置文件代碼:github.com/zeromicro/g…

yaml/json 解析代碼:github.com/zeromicro/g…

這里也充分展示了 reflect 的用法,以及復(fù)雜場(chǎng)景下如何通過單元測(cè)試保證代碼的正確性。

總結(jié)

我一直比較推薦 Fail Fast 的思想,我們?cè)诩虞d配置文件的時(shí)候也是這樣,一旦有錯(cuò)誤,立馬退出,這樣運(yùn)維在部署服務(wù)時(shí)就會(huì)及時(shí)發(fā)現(xiàn)問題,因?yàn)檫M(jìn)程壓根起不來。

go-zero 的所有服務(wù)的配置項(xiàng)都是通過這樣的方式來加載和自動(dòng)驗(yàn)證的,包括我寫的很多工具的配置也是基于此來實(shí)現(xiàn)的

項(xiàng)目地址 github.com/zeromicro/g…

更多關(guān)于Go配置文件定義讀取的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!希望能對(duì)你有所幫助!

相關(guān)文章

  • Go語言共享內(nèi)存讀寫實(shí)例分析

    Go語言共享內(nèi)存讀寫實(shí)例分析

    這篇文章主要介紹了Go語言共享內(nèi)存讀寫方法,實(shí)例分析了共享內(nèi)存的原理與讀寫技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • gin 獲取post請(qǐng)求的json body操作

    gin 獲取post請(qǐng)求的json body操作

    這篇文章主要介紹了gin 獲取post請(qǐng)求的json body操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • golang實(shí)現(xiàn)讀取excel數(shù)據(jù)并導(dǎo)入數(shù)據(jù)庫

    golang實(shí)現(xiàn)讀取excel數(shù)據(jù)并導(dǎo)入數(shù)據(jù)庫

    Go 語言是一門適合用于編寫高效且并發(fā)的 Web 應(yīng)用程序的編程語言,同時(shí)也可以使用它進(jìn)行數(shù)據(jù)處理和分析,本文主要介紹了如何通過go語言實(shí)現(xiàn)讀取excel數(shù)據(jù)并導(dǎo)入數(shù)據(jù)庫,感興趣的小伙伴可以了解下
    2025-04-04
  • Golang上下文Context的常見應(yīng)用場(chǎng)景

    Golang上下文Context的常見應(yīng)用場(chǎng)景

    Golang?context主要用于定義超時(shí)取消,取消后續(xù)操作,在不同操作中傳遞值。本文通過簡(jiǎn)單易懂的示例進(jìn)行說明,感興趣的可以了解一下
    2023-04-04
  • Go語言計(jì)算指定年月天數(shù)的方法

    Go語言計(jì)算指定年月天數(shù)的方法

    這篇文章主要介紹了Go語言計(jì)算指定年月天數(shù)的方法,實(shí)例分析了Go語言操作時(shí)間的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Go語言中重構(gòu)的技巧分享

    Go語言中重構(gòu)的技巧分享

    這篇文章主要來和大家分享一下Go語言中重構(gòu)的技巧,即如何盡量避免使用 else、break 和 continue,從而讓代碼更透明、更易讀,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-10-10
  • 利用ChatGPT編寫一個(gè)Golang圖像壓縮函數(shù)

    利用ChatGPT編寫一個(gè)Golang圖像壓縮函數(shù)

    這篇文章主要為大家詳細(xì)介紹了如何利用ChatGPT幫我們寫了一個(gè)Golang圖像壓縮函數(shù),文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以嘗試一下
    2023-04-04
  • Golang設(shè)計(jì)模式工廠模式實(shí)戰(zhàn)寫法示例詳解

    Golang設(shè)計(jì)模式工廠模式實(shí)戰(zhàn)寫法示例詳解

    這篇文章主要為大家介紹了Golang 工廠模式實(shí)戰(zhàn)寫法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • golang結(jié)構(gòu)化日志slog的用法簡(jiǎn)介

    golang結(jié)構(gòu)化日志slog的用法簡(jiǎn)介

    日志是任何軟件的重要組成部分,Go?提供了一個(gè)內(nèi)置日志包(slog),在本文中,小編將簡(jiǎn)單介紹一下slog包的功能以及如何在?Go?應(yīng)用程序中使用它,感興趣的可以了解下
    2023-09-09
  • Go語言實(shí)現(xiàn)RSA加解密算法詳解

    Go語言實(shí)現(xiàn)RSA加解密算法詳解

    隨著互聯(lián)網(wǎng)的高速發(fā)展,人們對(duì)安全的要求也越來越高,加解密也變得越來越重要,本文主要為大家介紹了Go語言中實(shí)現(xiàn)RSA加解密與簽名驗(yàn)證算法,希望對(duì)大家有所幫助
    2023-06-06

最新評(píng)論

浦城县| 邵武市| 六盘水市| 乌海市| 乐都县| 灌阳县| 江阴市| 长武县| 互助| 莱阳市| 阿坝县| 张掖市| 莱芜市| 皮山县| 集贤县| 瑞金市| 兰溪市| 涟水县| 灵璧县| 万盛区| 娄烦县| 玛曲县| 天门市| 肇州县| 新安县| 丰顺县| 莱州市| 新和县| 北海市| 青阳县| 彩票| 阜宁县| 曲水县| 仪征市| 三原县| 衢州市| 台江县| 永修县| 中江县| 化隆| 榆树市|