精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产厕拍一区| 影音先锋在线视频| 免费成人av在线播放| 中文字幕日韩欧美精品在线观看| 亚洲精品性视频| 污视频免费在线观看| 91女厕偷拍女厕偷拍高清| 国产精品白丝jk喷水视频一区| 久久在线中文字幕| 国产精品国产精品国产专区| 国产精品hd| 国产一区二区三区精品久久久| 爱情岛论坛亚洲自拍| 在线黄色的网站| 成人免费的视频| 久久影院在线观看| 特大黑人巨人吊xxxx| 四虎影视国产精品| 香蕉乱码成人久久天堂爱免费| 欧美深深色噜噜狠狠yyy| 国产又粗又长视频| 久久国产精品久久w女人spa| 欧美成人性色生活仑片| 精品人妻一区二区三区蜜桃视频| 一区二区中文字幕在线观看| 欧美综合天天夜夜久久| 国产va亚洲va在线va| 快射视频在线观看| 国产一区二区不卡| 国产精品91免费在线| 国产午夜福利一区二区| 婷婷激情图片久久| 最好看的2019年中文视频| 五月婷婷综合在线观看| 亚洲精品**中文毛片| 亚洲欧美偷拍另类a∨色屁股| 欧美性大战久久久久| 蜜桃视频污在线观看| 国产剧情一区在线| 国产日本欧美在线观看| 国产一级片av| 久久av最新网址| 欧洲美女免费图片一区| 国产在线拍揄自揄拍| 亚洲精品一区二区妖精| 日韩最新中文字幕电影免费看| 亚洲欧洲久久久| 亚洲+小说+欧美+激情+另类 | 欧美亚洲成人网| 国产一国产二国产三| 午夜日韩在线| 亚洲国产精品va在线看黑人动漫 | xxxx日韩| 亚洲成人网在线| 亚洲最大视频网| silk一区二区三区精品视频| 精品国产乱码久久久久久闺蜜| 超碰人人cao| 无人区乱码一区二区三区| 日韩欧美一二三区| 精品国产乱码久久久久夜深人妻| 在线精品自拍| 精品国产乱码久久久久久图片 | 国产精品无码人妻一区二区在线| 国内高清免费在线视频| 性久久久久久久久久久久| 热99这里只有精品| 澳门av一区二区三区| 欧美三级资源在线| 91丨porny丨九色| 97精品久久| 日韩大陆欧美高清视频区| 国产艳俗歌舞表演hd| jlzzjlzz亚洲女人| 久久人人爽人人爽人人片亚洲| 欧美偷拍第一页| 亚洲一级高清| 在线日韩欧美视频| 亚洲精品电影院| 神马午夜久久| 亚洲夜晚福利在线观看| 日本 欧美 国产| 欧美视频福利| 国产成人亚洲综合青青| 一级黄色大片网站| 成人免费视频视频| 日韩精品大片| 视频在线这里都是精品| 天天色图综合网| 亚洲黄色小视频在线观看| 国产一区二区三区亚洲综合| 精品久久久久久久人人人人传媒 | 蜜桃精品wwwmitaows| 精品国产视频在线| 日韩少妇高潮抽搐| 蜜臀久久99精品久久久久久9| 99r国产精品视频| 日本护士...精品国| 日韩一区欧美小说| av黄色在线网站| 97久久精品一区二区三区的观看方式| 亚洲国产精品久久91精品| 欧美激情视频二区| 激情自拍一区| 91精品久久久久久久久久 | 日韩黄色av| 亚洲欧美一区二区精品久久久| 欧美xxxx日本和非洲| 精品一区亚洲| 欧美第一黄网免费网站| 香蕉污视频在线观看| 国产成人精品免费| 亚洲精品在线视频观看| 你懂的在线免费观看| 1000部国产精品成人观看| 成人免费在线小视频| 国产色99精品9i| 国产亚洲一区精品| 日韩av综合在线| 国产盗摄精品一区二区三区在线| 日韩高清av| 涩涩视频在线播放| 欧美sm极限捆绑bd| 外国一级黄色片| 美女视频免费一区| 乱色588欧美| 久热在线观看视频| 亚洲成人av片在线观看| 久久久精品视频免费观看| 欧美aaaaa成人免费观看视频| 国产精品一区二区a| 在线看女人毛片| 欧美丰满嫩嫩电影| 国产真人真事毛片视频| 久久精品一本| 日本精品一区| jizz内谢中国亚洲jizz| 日韩久久精品电影| 青青草av在线播放| 99这里只有精品| 日本在线观看一区二区三区| 丰乳肥臀在线| 日韩美女视频一区二区在线观看| 久草视频手机在线| 精品制服美女丁香| 伊人婷婷久久| 91成人福利社区| 久久午夜a级毛片| 99在线精品视频免费观看软件| 亚洲丝袜精品丝袜在线| 天天影视色综合| 91精品福利| 成人av免费电影| av在线不卡免费| 日韩av在线高清| 黄色大片网站在线观看| 久久久777精品电影网影网 | 久久久精品国产sm调教| 国产69精品久久久久777| 亚洲爆乳无码精品aaa片蜜桃| 韩国一区二区三区视频| 亚洲精品电影网站| 男人的天堂一区二区| 久久女同性恋中文字幕| 亚欧在线免费观看| 国产精品x453.com| 99久久无色码| www.51av欧美视频| 欧美剧情片在线观看| 欧美性x x x| 国产99久久久精品| 欧美黑人经典片免费观看| 天海翼精品一区二区三区| 欧洲午夜精品久久久| 北岛玲一区二区三区| 欧美日韩国产综合一区二区三区| 欧美日韩色视频| 成人美女视频在线观看| 日本精品www| 欧美电影免费播放| 99re在线观看| 欧美电影网站| 久久激情视频免费观看| 黄色av免费观看| 亚洲欧洲在线观看av| 国产成人精品综合久久久久99 | 亚洲成av人片一区二区三区| 亚洲欧美日本一区| 麻豆91在线播放免费| 黄色片免费在线观看视频| 黑人久久a级毛片免费观看| 日本精品久久久| 亚洲性生活大片| 亚洲一区二区在线免费观看视频 | 久久动漫网址| 国产美女扒开尿口久久久| 日本乱理伦在线| 亚洲人精选亚洲人成在线| 国产精品无码一区二区桃花视频| 亚洲国产欧美日韩另类综合| 小明看看成人免费视频| 激情亚洲网站| 影音先锋欧美在线| 猫咪成人在线观看| 成人精品视频99在线观看免费| av影视在线看| 久久精品久久久久久| 日本不卡视频一区二区| 欧美一区二区三区视频在线| 国产嫩bbwbbw高潮| 一区二区三区蜜桃网| 亚洲图片另类小说| 大桥未久av一区二区三区中文| 天天操天天爽天天射| 在线播放一区| 91免费视频黄| 成人午夜国产| 久久久水蜜桃| 风间由美一区二区av101| 国产欧美精品一区二区| wwww亚洲| 久久国产精品久久久| av在线免费播放网站| 日韩精品视频在线观看网址| 国产高清视频免费| 欧美酷刑日本凌虐凌虐| 精品视频一二三区| 黑人巨大精品欧美一区二区一视频 | 国产高清在线免费| 欧美色国产精品| 国产午夜无码视频在线观看| 五月激情六月综合| 久久久久97国产| 亚洲色大成网站www久久九九| 谁有免费的黄色网址| 91麻豆视频网站| 日韩成人av一区二区| 成人一区二区视频| 中文字幕无人区二| 国产一区二区三区精品欧美日韩一区二区三区 | 日韩中文字幕av在线| 亚洲bt欧美bt精品777| 精品视频导航| 欧美福利在线播放| 91po在线观看91精品国产性色| 啦啦啦中文在线观看日本| 久久躁狠狠躁夜夜爽| 久草资源在线| 久久九九国产精品怡红院| 蜜桃av在线免费观看| 亚洲第一天堂av| 免费av一级片| 日韩av中文在线| 日韩av免费观影| 亚洲人成网在线播放| 搞黄视频在线观看| 尤物九九久久国产精品的特点| av男人的天堂在线| 日韩中文字幕av| 成年人视频免费在线观看| xxxxxxxxx欧美| dy888亚洲精品一区二区三区| 欧美成人免费在线视频| 男女视频在线| 91精品国产高清久久久久久| 在线日韩影院| 国产精品久久久av| 天堂久久一区| 99精彩视频| 久久精品国产亚洲5555| 蜜桃麻豆91| 成人高清av| 欧美三级午夜理伦三级老人| 欧美日本二区| 精品无码国模私拍视频| 免费在线观看视频一区| aaaaaaaa毛片| 99久久99精品久久久久久| 极品人妻一区二区三区| 国产欧美日本一区视频| 欧美黄色aaa| 疯狂欧美牲乱大交777| 国产主播第一页| 日韩女优av电影| 亚洲欧美另类视频| 一区二区成人精品| 青青青草视频在线| 日本精品久久久久影院| 日本久久一区| 久久www免费人成精品| 欧美亚洲高清| 分分操这里只有精品| 首页亚洲欧美制服丝腿| 国产精品999.| 久久亚洲免费视频| 欧美 日韩 国产 一区二区三区| 亚洲a一区二区| 制服丝袜在线一区| 精品国内片67194| 色欧美激情视频在线| 亚洲欧洲在线视频| av网站在线免费看推荐| 日本精品久久电影| 精品午夜视频| 色99中文字幕| 亚洲经典在线| 亚洲第一区第二区第三区| 92精品国产成人观看免费| 欧美一级特黄高清视频| 色综合天天综合狠狠| 99久久精品国产色欲| 91精品国产一区二区三区蜜臀 | 动漫一区二区三区| 欧美日韩电影一区二区| 国产一区二区中文| 午夜免费看视频| 麻豆成人在线观看| 亚洲天堂成人av| 亚洲精选在线视频| 亚洲午夜在线播放| 日韩精品极品在线观看播放免费视频| www.久久ai| 国产欧美精品xxxx另类| 国产精品一区二区av日韩在线| 大伊香蕉精品视频在线| 国产精品影视在线观看| 国产精品麻豆免费版现看视频| 日韩欧美在线一区| 色窝窝无码一区二区三区成人网站 | 欧美午夜寂寞影院| 欧美香蕉爽爽人人爽| 久久人人爽国产| 视频二区欧美毛片免费观看| 亚洲资源视频| 日本午夜精品一区二区三区电影| 懂色av粉嫩av蜜乳av| 一区二区三区鲁丝不卡| 99久久99久久久精品棕色圆| 久久九九有精品国产23| 韩国精品视频在线观看| 91亚洲永久免费精品| 色婷婷一区二区三区| 青草全福视在线| 韩国毛片一区二区三区| 91视频最新网址| 欧美日韩精品是欧美日韩精品| 大片免费播放在线视频| 国产91久久婷婷一区二区| 你懂的视频欧美| 毛葺葺老太做受视频| 国产日韩欧美激情| 中文字幕av影视| 色婷婷综合久久久久| 日韩三区四区| 国产av不卡一区二区| 国产精品香蕉一区二区三区| 九九热精品免费视频| 亚洲成人中文字幕| 国产伦理精品| 欧美一级二级三级| 日韩福利视频导航| 日本黄色激情视频| 678五月天丁香亚洲综合网| 成人av黄色| 成人动漫视频在线观看完整版| 国模吧视频一区| 国产乱了高清露脸对白| 色综合中文字幕| 97视频精彩视频在线观看| 成人激情av在线| 欧美视频一区| 成人免费看aa片| 欧美三级一区二区| 亚洲婷婷噜噜| 久久国产精品一区二区三区| 日韩精品一级二级 | 亚洲国产毛片aaaaa无费看 | 国产一区二区三区18| 日韩午夜电影免费看| 国产精品视频一二三四区| 99国产精品久久久久久久久久久| 在线视频一区二区三区四区| 色av中文字幕一区| 亚洲伊人影院| 成熟老妇女视频| 最新久久zyz资源站| 天天射天天操天天干| 国产精品爽黄69天堂a| 欧美涩涩视频| av免费播放网站| 精品国产一区二区三区av性色| **欧美日韩在线观看| 青少年xxxxx性开放hg| 91视频免费看| 国产绿帽刺激高潮对白| 欧美一级片一区| 亚洲欧美偷拍自拍| 一本色道久久综合亚洲精品图片| 91精品国产综合久久福利| 中文字幕这里只有精品|