亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

前言

我們在寫應(yīng)用時,基本都會用到配置文件,從各種 shell 到 nginx 等,都有自己的配置文件。雖然這沒有太多難度,但是配置項一般相對比較繁雜,解析、校驗也會比較麻煩。本文就給大家講講我們是怎么簡化配置文件的定義和解析的。

場景

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

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

之前我們用 json 做配置文件,但是 json 有個問題,無法加注釋,所以我們后來切換到了 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]"`
}

可以看到,我們對每個配置項都有一定的定義和限制,其中一些定義如下:

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

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

  • default 和 range 一起使用,就可以既增加了范圍限制,又提供了默認值
  • default 和 options 一起使用,就可以既增加了可選項限制,又提供了默認值

配置文件

因為我們在定義配置的時候,給了很多的默認值,還有使用 optional 指定為可選,所以我們的配置文件里的配置項就相對比較少了,能用默認值的就不用寫了,如下:

# 因為很多都有默認值,所以只需要寫需要指定值和沒有默認值的
Port: 8080
LogMode: console
# 可以讀取環(huán)境變量的值
MaxBytes: ${MAX_BYTES}

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

Password: "123456"

這里的雙引號不能少,少了會報 type mismatch 之類的錯誤,因為yaml解析器會把不帶雙引號的 123456 解析成 int。

加載配置文件

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

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

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

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

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

實現(xiàn)原理

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

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

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

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

總結(jié)

我一直比較推薦 Fail Fast 的思想,我們在加載配置文件的時候也是這樣,一旦有錯誤,立馬退出,這樣運維在部署服務(wù)時就會及時發(fā)現(xiàn)問題,因為進程壓根起不來。

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

項目地址 github.com/zeromicro/g…

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

相關(guān)文章

  • 為什么Go語言把類型聲明放在后面?

    為什么Go語言把類型聲明放在后面?

    今天小編就為大家分享一篇關(guān)于為什么Go語言把類型聲明放在后面?,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • Go語言實現(xiàn)lru淘汰策略和超時過期

    Go語言實現(xiàn)lru淘汰策略和超時過期

    緩存的大小是有限的,當添加數(shù)據(jù)發(fā)現(xiàn)剩余緩存不夠時,需要淘汰緩存中的部分數(shù)據(jù),本文主要介紹了Go語言實現(xiàn)lru淘汰策略和超時過期,感興趣的可以了解一下
    2024-02-02
  • 在Go語言程序中使用gojson來解析JSON格式文件

    在Go語言程序中使用gojson來解析JSON格式文件

    這篇文章主要介紹了在Go語言程序中使用gojson來解析JSON格式文件的方法,Go是由Google開發(fā)的高人氣新興編程語言,需要的朋友可以參考下
    2015-10-10
  • Go語言中websocket的使用demo分享

    Go語言中websocket的使用demo分享

    WebSocket是一種在單個TCP連接上進行全雙工通信的協(xié)議。這篇文章主要和大家分享了一個Go語言中websocket的使用demo,需要的可以參考一下
    2022-12-12
  • goland2020.2.x永久激活碼破解詳細教程親測可用(Windows Linux Mac)

    goland2020.2.x永久激活碼破解詳細教程親測可用(Windows Linux Mac)

    這篇文章主要介紹了goland2020.2.x永久激活碼破解詳細教程親測可用(Windows Linux Mac) ,對goland激活碼注冊碼相關(guān)知識感興趣的朋友跟隨小編一起看看吧
    2020-11-11
  • go中控制goroutine數(shù)量的方法

    go中控制goroutine數(shù)量的方法

    這篇文章主要介紹了go中控制goroutine數(shù)量的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • Go語言同步等待組sync.WaitGroup結(jié)構(gòu)體對象方法詳解

    Go語言同步等待組sync.WaitGroup結(jié)構(gòu)體對象方法詳解

    這篇文章主要為大家介紹了Go語言同步等待組sync.WaitGroup結(jié)構(gòu)體對象方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Go語言普通指針unsafe.Pointer?uintpt之間的關(guān)系及指針運算

    Go語言普通指針unsafe.Pointer?uintpt之間的關(guān)系及指針運算

    這篇文章主要為大家介紹了Go語言普通指針unsafe.Pointer?uintpt之間的關(guān)系及指針運算示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • 淺析Gin框架中路由參數(shù)的使用

    淺析Gin框架中路由參數(shù)的使用

    這篇文章主要為大家介紹了路由參數(shù)的基本語法,以及路由匹配和路由參數(shù)值提取等相關(guān)內(nèi)容,以幫助讀者更好地對Gin?框架中路由參數(shù)進行使用,需要的可以參考下
    2023-08-08
  • GoPath模式和GoMoudle模式的相愛相殺

    GoPath模式和GoMoudle模式的相愛相殺

    這篇文章主要介紹了GoPath模式和GoMoudle模式的相愛相殺,本文通過實例圖文相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03

最新評論