精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Go 云原生實戰:如何增加應用配置模塊

開發 前端
本文介紹了項目配置文件的由來和重要性,并從零到一編寫代碼,成功在我們的 Web 項目中增加了應用配置功能。并結合上一節的日志功能進行了測試。

Part1介紹

當我們為自己編寫程序時,通常會將一些重要的配置項直接寫在源代碼里,比如:服務器監聽的端口、數據庫使用的名稱和端口號、HTTP請求超時的持續時間...

但是,如果我們嘗試將這個項目開源分享給他人使用,用戶使用的數據庫的用戶名和名稱可能與你不相同,甚至你還要為他們的服務器使用另一個端口。

如果你還設置了數據庫的密碼的話,為了安全,更不可能在代碼中信息泄露出來。因此,本節,將介紹如何增加我們的 ??sports?? 應用的配置模塊。

Part2增加配置模塊

在許多的開源項目中,配置都是通過鍵值(key-value) 數據結構來處理的。在真實應用中,你經常會發現一個公開配置選項的類(或者是結構體),這個類經常會將文件解析出來,將每個選擇賦值。應用程序通常會提出命令行選項以調整配置。

2.1 定義 Configuration 接口

接下來,我們為應用程序增加配置的能力,這樣上面說的很多配置就不用在代碼文件中定義。1、創建 ??sports/config??? 文件夾,然后新建一個 ??config.go?? 文件,寫入如下的代碼:

package config

type Configuration interface {
GetString(name string) (configValue string, found bool)
GetInt(name string) (configValue int, found bool)
GetBool(name string) (configValue bool, found bool)
GetFloat(name string) (configValue float64, found bool)

GetStringDefault(name, defVal string) (configValue string)
GetIntDefault(name string, defVal int) (configValue int)
GetBoolDefault(name string, defVal bool) (configValue bool)
GetFloatDefault(name string, defVal float64) (configValue float64)

GetSection(sectionName string) (section Configuration, found bool)
}

可以看到,Configuration? 接口定義了檢索配置設置的方法,支持獲取字符串 string?、數字 int?、浮點型 float64?、布爾型 bool 的值:

  • GetString()
  • GetInt()
  • GetBool()
  • GetFloat()

還有一組方法允許提供一個默認值:

  • GetStringDefault()
  • GetIntDefault()
  • GetBoolDefault()
  • GetFloatDefault()

配置數據將允許嵌套的配置部分,這個將使用 GetSection() 方法實現。

2.2 來看一個基本的 JSON 配置文件

配置可以從命令行中獲取,當然更好的方式是將配置保存在一個文件中,由應用程序自動解析。

文件的格式取決于應用程序的需求。如果你需要一個復雜的配置,有級別和層次(以 Windows 注冊表的方式)關系的話,那么你可能需要考慮 JSON、YAML 或 XML 等格式。

讓我們看一個 JSON 配置文件的例子:

{
"server": {
"host": "localhost",
"port": 80
},
"database": {
"host": "localhost",
"username": "myUsername",
"password": "abcdefgh"
}
}

上面的 JSON 配置文件中定義了服務器 server 和數據庫 database 的信息。但在本文中,我們基于上一節介紹的日志功能來看,為了簡化操作,只簡單配置我們的日志和主函數的信息。

2、在 sports? 目錄下,創建一個 config.json 文件,寫入如下內容:

{
"logging": {
"level": "debug"
},
"main": {
"message": "Hello, Let's Go! Hello from the config file"
}
}

這個配置文件定義了兩個配置部分,分別命名為 logging? 和 main:

  • logging? 部分包含一個單一的字符串配置設置,名稱為 level
  • main? 部分包含一個單一的字符串配置設置,名稱為 message

這個文件顯示了配置文件使用的基本結構,在 JSON 配置文件中,要注意引號和逗號符合 JSON 文件的格式要求,很多人經常搞錯。

2.3 實現 Configuration 接口

為了能夠實現 Configuration? 接口,我們將在 sports/config? 文件夾下創建一個 config_default.go 文件,然后寫入如下代碼:

package config

import "strings"

type DefaultConfig struct {
configData map[string]interface{}
}

func (c *DefaultConfig) get(name string) (result interface{}, found bool) {

data := c.configData
for _, key := range strings.Split(name, ":") {
result, found = data[key]
if newSection, ok := result.(map[string]interface{}); ok && found {
data = newSection
} else {
return
}
}
return
}

func (c *DefaultConfig) GetSection(name string) (section Configuration, found bool) {
value, found := c.get(name)
if found {
if sectionData, ok := value.(map[string]interface{}); ok {
section = &DefaultConfig{configData: sectionData}
}
}
return
}

func (c *DefaultConfig) GetString(name string) (result string, found bool) {
value, found := c.get(name)
if found {
result = value.(string)
}
return
}

func (c *DefaultConfig) GetInt(name string) (result int, found bool) {
value, found := c.get(name)
if found {
result = int(value.(float64))
}
return
}

func (c *DefaultConfig) GetBool(name string) (result bool, found bool) {
value, found := c.get(name)
if found {
result = value.(bool)
}
return
}

func (c *DefaultConfig) GetFloat(name string) (result float64, found bool) {
value, found := c.get(name)
if found {
result = value.(float64)
}
return
}

DefaultConfig? 結構體用 map 實現了 Configuration 接口,嵌套配置部分也同樣用 maps 表示。即上面的代碼中的:

type DefaultConfig struct {
configData map[string] interface{}
}

一個單獨的配置可以通過將 section? 名稱和 setting? 名稱分開,例如:logging:level?,或者使用 map? 映射來根據鍵的名稱或者值,例如 logging 。

2.4 定義接收默認值的方法

為了處理來自配置文件的值,我們在 sports/config? 文件夾下創建一個 config_default_fallback.go 文件:

package config

func (c *DefaultConfig) GetStringDefault(name, val string) (result string) {
result, ok := c.GetString(name)
if !ok {
result = val
}
return
}

func (c *DefaultConfig) GetIntDefault(name string, val int) (result int) {
result, ok := c.GetInt(name)
if !ok {
result = val
}
return
}

func (c *DefaultConfig) GetBoolDefault(name string, val bool) (result bool) {
result, ok := c.GetBool(name)
if !ok {
result = val
}
return
}

func (c *DefaultConfig) GetFloatDefault(name string, val float64) (result float64) {
result, ok := c.GetFloat(name)
if !ok {
result = val
}
return
}

2.5 定義從配置文件加載數據的函數

在 sports/config? 文件夾下新建一個加載 JSON 數據的 config_json.go 文件,寫入如下代碼:

package config

import (
"encoding/json"
"os"
"strings"
)

func Load(filename string) (config Configuration, err error) {
var data []byte
data, err = os.ReadFile(filename)
if err == nil {
decoder := json.NewDecoder(strings.NewReader(string(data)))
m := map[string]interface{}{}
err = decoder.Decode(&m)
if err == nil {
config = &DefaultConfig{configData: m}
}
}
return
}

Load? 函數讀取一個文件的內容,將其包含的 JSON? 文件解析為一個映射,并使用該映射創建一個 DefaultConfig 的值。

關于 Go 如何處理 JSON 文件,感興趣可以搜索我之前的文章:《Go 語言入門很簡單:Go 語言解析JSON》

Part3使用 Configuration 配置系統

為了從剛剛增加的配置系統中獲取日志級別的信息,我們將回到上一節中 logging 文件夾中的 default_create.go 文件中,寫入如下代碼:

package logging

import (
"log"
"os"
"strings"

"sports/config"
)

// func NewDefaultLogger(level LogLevel) Logger {
func NewDefaultLogger(cfg config.Configuration) Logger {

// 使用 Configuration
var level LogLevel = Debug
if configLevelString, found := cfg.GetString("logging:level"); found {
level = LogLevelFromString(configLevelString)
}

flags := log.Lmsgprefix | log.Ltime
return &DefaultLogger{
minLevel: level,
loggers: map[LogLevel]*log.Logger{
Trace: log.New(os.Stdout, "TRACE ", flags),
Debug: log.New(os.Stdout, "DEBUG ", flags),
Information: log.New(os.Stdout, "INFO ", flags),
Warning: log.New(os.Stdout, "WARNING ", flags),
Fatal: log.New(os.Stdout, "FATAL ", flags),
},
triggerPanic: true,
}
}

func LogLevelFromString(val string) (level LogLevel) {
switch strings.ToLower(val) {
case "debug":
level = Debug
case "information":
level = Information
case "warning":
level = Warning
case "fatal":
level = Fatal
case "none":
level = None
}
return
}

在 JSON 中沒有很好的方法來表示 iota? 值,所以我們使用一個字符串并定義了 LogLevelFromString()? 函數,以此來將配置設置轉換為 LogLevel 的值。

最后,我們更新 main()? 函數來加載和應用配置數據,并使用配置系統來讀取它所輸出的信息,更改 main.go 文件如下。

package main

import (
// "fmt"
"sports/config"
"sports/logging"
)

// func writeMessage(logger logging.Logger) {
// // fmt.Println("Let's Go")
// logger.Info("Let's Go, logger")
// }

// func main() {

// var logger logging.Logger = logging.NewDefaultLogger(logging.Information)
// writeMessage(logger)
// }

func writeMessage(logger logging.Logger, cfg config.Configuration) {
section, ok := cfg.GetSection("main")
if ok {
message, ok := section.GetString("message")
if ok {
logger.Info(message)
} else {
logger.Panic("Cannot find configuration setting")
}
} else {
logger.Panic("Config section not found")
}
}

func main() {

var cfg config.Configuration
var err error
cfg, err = config.Load("config.json")
if err != nil {
panic(err)
}

var logger logging.Logger = logging.NewDefaultLogger(cfg)
writeMessage(logger, cfg)
}

至此,我們的配置是從 config.json? 文件中獲取,通過 NewDefaultLogger() 函數來傳遞 Configuration 的實現,最終讀取到 log 日志級別設置。

writeMessage() 函數顯示了配置部分的使用,提供了組件所需的設置,特別是在需要多個具有不同配置的實例時,每一個設置都可以在自己的部分進行定義。

最后的項目結構如圖:

圖片

最終,我們在終端中編譯并運行我們整個代碼:

$ go run .
17:20:46 INFO Hello, Let's Go! Hello from the config file

整個代碼會輸出并打印出配置文件中的信息,如圖所示:

圖片

Part4總結

本文介紹了項目配置文件的由來和重要性,并從零到一編寫代碼,成功在我們的 Web 項目中增加了應用配置功能。并結合上一節的日志功能進行了測試。

其實在 Go 開源項目中,有個非常著名的開源配置包:Viper ,提供針對 Go 應用項目的完整配置解決方案,幫助我們快速處理所有類型的配置需求和配置文件格式。目前 GitHub Stars 數量高達 21k,今后將在后續的文章中介紹這個項目。

責任編輯:武曉燕 來源: 宇宙之一粟
相關推薦

2020-12-01 17:44:15

華為云Go語言云原生

2023-12-26 10:04:29

Electron應用開發框架

2022-02-21 09:00:00

云原生應用開發

2022-10-27 18:03:04

GogRPC云原生

2021-10-11 09:00:00

云原生Kubernetes安全

2017-12-10 14:13:14

云服務云原生應用程序

2025-06-04 10:08:00

Go開發云原生

2020-07-16 08:05:15

JavaGo

2020-10-21 10:04:56

云原生應用架構

2021-07-20 09:44:34

云原生應用程序安全云安全

2023-05-15 08:01:21

k8s容器

2022-06-22 09:24:30

云原生Go 語言

2025-07-03 11:21:04

2021-10-29 10:12:34

云原生勒索軟件網絡攻擊

2023-03-27 07:43:35

2019-08-07 17:18:18

云計算云原生函數

2022-05-06 09:40:48

智能云原生云原生人工智能

2023-05-15 07:33:06

云原生自身業務云廠商

2022-08-24 16:47:01

云原生安全通信

2024-05-13 08:00:00

點贊
收藏

51CTO技術棧公眾號

97超碰欧美中文字幕| 亚洲激情婷婷| 精品少妇一区二区三区日产乱码| www.18av.com| 免费福利在线观看| 国产一区日韩二区欧美三区| 97人人做人人爱| 国产精品视频看看| 日韩欧美在线精品| 91精品国产综合久久久久久| 欧美日韩二三区| v片在线观看| 国产三级精品三级| 国产成人成网站在线播放青青| 亚洲第一网站在线观看| 亚洲视频日本| 日韩中文字幕网| 波多野结衣一本| 911精品国产| 欧美日韩一级二级| 播放灌醉水嫩大学生国内精品| 国产精品一卡二卡三卡| 久久久久久久久久久黄色| 99re在线国产| 国产又粗又猛又爽又黄91| 亚洲尤物精选| 久久久日本电影| 欧美爱爱免费视频| 欧美日韩中文字幕一区二区三区 | 久热国产精品视频| a天堂中文字幕| 日韩aaa久久蜜桃av| 日韩欧美第一区| 在线一区二区不卡| 中韩乱幕日产无线码一区| 日韩欧美成人网| www.99热这里只有精品| 五月天激情在线| 日韩美女视频19| 一区二区三区四区五区精品| 国产在线高清| 国产三级一区二区| 你懂的网址一区二区三区| 亚洲精品.www| 成人午夜激情片| 成人欧美一区二区| 亚洲av综合色区无码一二三区| 精品一区二区三区在线观看 | 亚洲精品无码国产| 任你弄在线视频免费观看| 亚洲人成人一区二区在线观看| 亚洲精品美女久久7777777| 国产视频二区在线观看| 国产欧美综合在线| 亚欧洲精品在线视频免费观看| 韩国三级在线观看久| 久久久精品影视| 欧美日韩精品不卡| 国产一级免费在线观看| 国产无一区二区| 日韩国产美国| 免费人成在线观看播放视频| 日韩理论片网站| 红桃一区二区三区| 久草在线视频资源| 精品国产91久久久久久老师| 欧美二区在线视频| 综合久久2023| 欧美日韩在线免费视频| 天天操精品视频| 视频二区欧美毛片免费观看| 精品乱人伦一区二区三区| 50一60岁老妇女毛片| 偷拍精品福利视频导航| 亚洲午夜激情免费视频| 特级西西人体高清大胆| 影视亚洲一区二区三区| 午夜精品国产精品大乳美女| 亚洲图片在线视频| 老司机一区二区| 91久久国产自产拍夜夜嗨| 黄色一级大片在线免费看国产一| 久久日韩粉嫩一区二区三区| 亚洲国产欧洲综合997久久 | 成人三级做爰av| 米奇精品关键词| 亚洲视频欧洲视频| 丰满少妇被猛烈进入一区二区| 亚洲黄网站黄| 国产日韩中文字幕在线| 成人免费视频国产| 欧美国产丝袜视频| 国产一区二区三区乱码| 桃色一区二区| 欧美一区二区三区四区视频| 性色av蜜臀av色欲av| 日韩国产一区| 午夜精品久久久久久99热| 欧美超碰在线观看| 国产成人综合亚洲网站| 五月天色一区| 国产白浆在线免费观看| 国产精品视屏| 欧美日韩精品一区二区三区| 99riav国产精品视频| 欧美日韩国产高清电影| 久久久久久久久久亚洲| 亚洲一卡二卡在线| 91麻豆国产香蕉久久精品| 综合婷婷亚洲小说| 欧美日韩高清在线一区| 性欧美高清come| 欧美自拍偷拍一区| 97人妻精品一区二区三区免费 | 一级性生活视频| 欧美天堂视频| 亚洲精品一区二区三区福利| 少妇的滋味中文字幕bd| 亚洲主播在线| 国产 高清 精品 在线 a| av电影在线观看一区二区三区| 偷拍一区二区三区| 日批免费观看视频| 你懂的成人av| 国产在线一区二区三区| 福利视频在线看| 色综合 综合色| 一边摸一边做爽的视频17国产| 亚洲欧美文学| 91亚洲精品在线| 中文日本在线观看| 在线观看免费亚洲| 色哟哟精品观看| 亚洲一区二区免费看| 国产精品亚洲不卡a| 免费在线看电影| 欧美一级淫片007| 欧美一级片在线视频| 麻豆免费精品视频| 亚洲一区二区高清视频| 成人国产综合| 最近2019中文字幕第三页视频| jizz国产在线| 国产精品婷婷午夜在线观看| 激情婷婷综合网| 国产探花一区| 日本欧美爱爱爱| 国产在线自天天| 在线精品视频免费播放| caopeng视频| 男女性色大片免费观看一区二区| 日韩av一区二区三区在线 | 欧美日韩亚洲视频| 18禁裸乳无遮挡啪啪无码免费| 国产精品日韩精品欧美精品| 欧美大香线蕉线伊人久久| 无遮挡爽大片在线观看视频| 亚洲丝袜av一区| 久久精品偷拍视频| 18成人在线观看| 无码人妻少妇色欲av一区二区| 欧美精品三级| 国产欧美亚洲日本| 制服丝袜专区在线| 中文字幕自拍vr一区二区三区| 亚洲在线视频播放| 有码一区二区三区| yy1111111| 日韩中文字幕不卡| 中文精品视频一区二区在线观看| 日本综合精品一区| 国语对白做受69| 裸体xxxx视频在线| 欧美日韩国产色站一区二区三区| wwwav国产| 99国内精品久久| 老熟妇仑乱视频一区二区| 夜间精品视频| 久久99精品久久久久久三级| 99久久久国产精品免费调教网站| 久久中文字幕一区| 五月婷婷深深爱| 欧美日韩一区二区在线观看| 欧美人妻精品一区二区三区| 久久在线免费观看| 成人不卡免费视频| 午夜一区不卡| 麻豆md0077饥渴少妇| 欧美激情网址| 成人在线国产精品| 日韩深夜视频| 不卡中文字幕av| 色就是色亚洲色图| 欧美一区二区精美| 中文字幕在线天堂| 亚洲在线观看免费| 成人做爰69片免网站| 不卡的av中国片| 欧美一级视频在线| 久久精品免费| 亚洲乱码日产精品bd在线观看| 欧美激情在线免费| 成人激情av| 国产原创一区| 69av在线播放| 午夜影院免费在线| 日韩在线视频一区| 国产在线一二三区| 亚洲精品wwwww| 国产农村妇女毛片精品| 欧美丝袜丝nylons| 国产精品午夜影院| 亚洲综合免费观看高清在线观看| 国产精品理论在线| 久久人人97超碰com| 久草免费资源站| 国产精品一区二区久久不卡| jizz大全欧美jizzcom| 午夜亚洲性色福利视频| 国产女主播自拍| 午夜精品网站| 欧美性受黑人性爽| 欧美少妇性xxxx| 欧美高清性xxxxhd| 欧美日韩麻豆| 国产精品美女xx| xxxxxhd亚洲人hd| 91视频九色网站| 伊人久久大香| 国产主播欧美精品| 亚洲欧美一级| 国产一区二中文字幕在线看 | 亚洲一区视频| 国产视频九色蝌蚪| 日韩午夜电影| 日本国产在线播放| 亚洲国产日韩在线| 男女日批视频在线观看| 国产主播一区| h无码动漫在线观看| 欧美精品播放| 成人网站免费观看入口| 在线国产精品一区| 日韩五码在线观看| 亚洲大片av| 免费无码不卡视频在线观看| 国产精品一二| 国产精品69页| 秋霞国产午夜精品免费视频| 波多结衣在线观看| 狠狠狠色丁香婷婷综合久久五月| 在线视频观看一区二区| 国产在线精品国自产拍免费| 欧美性猛交xx| 成人免费视频caoporn| 少妇精品无码一区二区三区| 91免费视频观看| b站大片免费直播| 国产欧美日韩在线看| www.xx日本| 亚洲激情欧美激情| 日韩av片在线播放| 欧美性猛交xxxx乱大交| 中文字幕av无码一区二区三区| 欧美日韩视频在线一区二区 | 日韩欧美精品电影| 国产日韩av在线| 一区二区三区亚洲变态调教大结局| 国产91视觉| 亚洲日本三级| 一区二区日本伦理| 欧美日韩综合| 97视频在线免费播放| 免费日本视频一区| 99免费观看视频| 国产欧美视频在线观看| 精品欧美一区二区久久久久 | 成年人网站免费视频| 日本欧美一区二区三区| 久久综合桃花网| 91社区在线播放| 北条麻妃在线观看视频| 婷婷久久综合九色国产成人| 中文字幕久久网| 精品国产1区二区| 国产午夜在线视频| 欧美国产日韩视频| 成人日韩在线观看| 成人在线免费网站| 国产剧情在线观看一区| 乱熟女高潮一区二区在线| 亚洲精品孕妇| 欧美激情第3页| 99这里只有久久精品视频| 国产三级在线观看完整版| 亚洲国产wwwccc36天堂| 国产又粗又大又爽视频| 日韩二区三区在线| 亚洲婷婷噜噜| 国产精品久久久久久av福利软件 | 亚洲最大网站| 亚洲综合中文字幕68页| 欧美日韩老妇| 波多野结衣家庭教师在线播放| 精品一区二区综合| 天天躁日日躁aaaa视频| 亚洲第一成人在线| 国产日本精品视频| 怡红院精品视频| 精精国产xxxx视频在线播放| 成人福利网站在线观看| 欧美猛男男男激情videos| 日本精品久久久久久久久久| 精品一区二区国语对白| 免费污网站在线观看| 亚洲.国产.中文慕字在线| 国产青青草视频| 在线成人免费网站| 一二三四视频在线中文| 丁香婷婷久久久综合精品国产| 欧美激情777| www.日本xxxx| 久久精品视频在线看| 亚洲国产精一区二区三区性色| 日韩西西人体444www| 麻豆视频在线观看免费| 国产精品影片在线观看| 成人婷婷网色偷偷亚洲男人的天堂| 男人揉女人奶房视频60分| av电影一区二区| 国产中文字幕免费| 精品日韩一区二区三区| 欧美日韩经典丝袜| 亚洲综合日韩中文字幕v在线| 亚洲国产一区二区在线观看| 五月天中文字幕在线| 国产精品久久三| 91久久久久久久久久久久| 色婷婷久久一区二区| 不卡亚洲精品| 亚洲综合首页| 精品一区二区免费| 亚洲女人久久久| 欧美精品国产精品| 久热国产在线| 5566中文字幕一区二区| 欧美国产专区| 中文字幕天堂网| 精品成人乱色一区二区| 欧美一区二区少妇| 国产不卡av在线| 成人激情视频| 极品粉嫩美女露脸啪啪| 玉米视频成人免费看| 日批视频免费播放| 国产999在线| 欧美xxav| 天堂va欧美va亚洲va老司机| 亚洲国产cao| 男人天堂资源在线| 国产一区二区丝袜| 欧美精品黄色| 成人免费看aa片| 欧美三区免费完整视频在线观看| 黄色精品在线观看| 国产精品久久久久久久小唯西川| 乱人伦精品视频在线观看| 欧美福利在线视频| 日韩一级精品视频在线观看| 大黄网站在线观看| 欧美日韩最好看的视频| 极品销魂美女一区二区三区| 久久影院一区二区| 亚洲网站视频福利| 中文字幕成人| 国产精品又粗又长| 日本一区二区综合亚洲| 国产欧美日韩成人| 茄子视频成人在线| 国产精品久久久久蜜臀| 久久免费精品国产| 欧美亚洲国产怡红院影院| 日本欧美电影在线观看| 欧美凹凸一区二区三区视频| 精品一区免费av| 精品欧美一区二区三区免费观看| 中文字幕成人精品久久不卡| 福利片一区二区| 天天干天天草天天| 午夜精品123| 美女国产在线| 久久久久久久有限公司| 国产酒店精品激情| 成年人晚上看的视频| 午夜精品久久17c| 66国产精品| 国产高清一区二区三区四区| 日韩一区二区在线看| 素人一区二区三区| 久久久久久久久久久99|