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

go kratos源碼及配置解析

 更新時間:2022年12月05日 11:57:55   作者:小宇渣渣渣  
這篇文章主要為大家介紹了go kratos源碼及配置解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

相關類圖

項目啟動時一般前置條件為解析配置文件, 我們看下這塊是怎么設計的.

流程解釋

  • config 實現 config Interface 接口, 初始化reader對象
  • 調用Load方法, 通過入口注入的不同文件源, 調用實現了source interface 對應的Load方法(以file舉例子)
  • file 通過 Load 入口, 判斷是目錄還是文件, 執(zhí)行對應的方法, 拿到文件內容返回
  • config 拿到file返回的內容, 交給reader去合并
  • reader 根據文件格式(yml) 轉為 map[string]interface{} 結構, 并進行覆蓋合并, 將結果存到對象變量上
  • reader 處理完成后, config調用 file watcher 進行文件變更監(jiān)聽, 啟動協(xié)程監(jiān)聽

由此可見, config對象其實作為入口, 將數據生產交給file、env, 將數據加工解析交給 reader

代碼案例

init 接收外部參數定義解析配置文件地址

func init() {
	flag.StringVar(&commonconf, "common", "./configs/local", "common config path, eg: -conf config.yaml")
	flag.StringVar(&flagconf, "conf", "./configs/local/api", "config path, eg: -conf config.yaml")
    flag.Parse()
}

使用config.New初始化文件配置

//初始化配置
//新增兩個配置源, 文件格式 common and flagconf 路徑
c := config.New(
    config.WithSource(
        file.NewSource(commonconf),
        file.NewSource(flagconf),
    ),
)
// 關閉watch相關的監(jiān)聽器
defer c.Close()
// 加載配置文件
if err := c.Load(); err != nil {
	panic(err)
}
//解析配置到bc結構上
var bc conf.Bootstrap
if err := c.Scan(&bc); err != nil {
    panic(err)
}

我們看下config.New的實現

// 初始化解析器, 關聯reader對象, 數據交給由reader加工和存儲
func New(opts ...Option) Config {
	o := options{
		decoder:  defaultDecoder,
		resolver: defaultResolver,
	}
	for _, opt := range opts {
		opt(&o)
	}
	return &config{
		opts:   o,
		reader: newReader(o),
	}
}

Options 有下面幾個屬性

type options struct {
	sources  []Source // 配置源, 由初始化負責傳入的source配置源
	decoder  Decoder //  解析器
	resolver Resolver // 變量解析替換
}

執(zhí)行 Load 配置加載

func (c *config) Load() error {
    // 因為我們在入口傳入的是file對象, 所以執(zhí)行src load的時候也是file對象的 load 方法
	for _, src := range c.opts.sources {
        // 獲取文件內容(可能是一個目錄, 會存在多個文件)
		kvs, err := src.Load()
		if err != nil {
			return err
		}
		for _, v := range kvs {
			log.Debugf("config loaded: %s format: %s", v.Key, v.Format)
		}
        // 合并配置key
		if err = c.reader.Merge(kvs...); err != nil {
			log.Errorf("failed to merge config source: %v", err)
			return err
		}
        // 調用file watch, 監(jiān)聽文件變化
		w, err := src.Watch()
		if err != nil {
			log.Errorf("failed to watch config source: %v", err)
			return err
		}
		c.watchers = append(c.watchers, w)
        // 異步監(jiān)聽文件變化(調用對應的watch對象)
		go c.watch(w)
	}
    // 解析內容中是否包含 ${APPID:default} 變量
    // 如果在配置文件中存在 APPID: xx 配置, 則進行替換
    // 否則使用default默認值
	if err := c.reader.Resolve(); err != nil {
		log.Errorf("failed to resolve config source: %v", err)
		return err
	}
	return nil
}

異步watch

func (c *config) watch(w Watcher) {
	for {
		kvs, err := w.Next()
		if err != nil {
			if errors.Is(err, context.Canceled) {
				log.Infof("watcher's ctx cancel : %v", err)
				return
			}
			time.Sleep(time.Second)
			log.Errorf("failed to watch next config: %v", err)
			continue
		}
    	// 處理邏輯忽略 .....
		c.cached.Range(func(key, value interface{}) bool {
			k := key.(string)
			v := value.(Value)
			if n, ok := c.reader.Value(k); ok && reflect.TypeOf(n.Load()) == reflect.TypeOf(v.Load()) && !reflect.DeepEqual(n.Load(), v.Load()) {
				v.Store(n.Load())
				if o, ok := c.observers.Load(k); ok {
					o.(Observer)(k, v)
				}
			}
			return true
		})
	}
}

Scan 將配置轉換成結構體

var bc conf.Bootstrap
if err := c.Scan(&bc); err != nil {
    panic(err)
}

以上就是go kratos源碼及配置解析的詳細內容,更多關于kratos源碼配置的資料請關注腳本之家其它相關文章!

相關文章

  • Golang中HTTP路由設計的使用與實現

    Golang中HTTP路由設計的使用與實現

    這篇文章主要介紹了Golang中HTTP路由設計的使用與實現,為什么要設計路由規(guī)則,因為路由規(guī)則是HTTP的請求按照一定的規(guī)則 ,匹配查找到對應的控制器并傳遞執(zhí)行的邏輯,需要的朋友可以參考下
    2023-05-05
  • go貨幣計算時如何避免浮點數精度問題

    go貨幣計算時如何避免浮點數精度問題

    在開發(fā)的初始階段,我們經常會遇到“浮點數精度”和“貨幣值表示”的問題,那么在golang中如何避免這一方面的問題呢,下面就跟隨小編一起來學習一下吧
    2024-02-02
  • golang 40行代碼實現通用協(xié)程池

    golang 40行代碼實現通用協(xié)程池

    golang協(xié)程機制很方便的解決了并發(fā)編程的問題,但是協(xié)程并不是沒有開銷的,所以也需要適當限制一下數量。這篇文章主要介紹了golang 40行代碼實現通用協(xié)程池,需要的朋友可以參考下
    2018-08-08
  • jenkins配置golang?代碼工程自動發(fā)布的實現方法

    jenkins配置golang?代碼工程自動發(fā)布的實現方法

    這篇文章主要介紹了jenkins配置golang?代碼工程自動發(fā)布,jks是個很好的工具,使用方法也很多,我只用了它簡單的功能,對jenkins配置golang相關知識感興趣的朋友一起看看吧
    2022-07-07
  • golang 如何刪除二進制文件中的源碼路徑信息

    golang 如何刪除二進制文件中的源碼路徑信息

    這篇文章主要介紹了golang 如何刪除二進制文件中的源碼路徑信息,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go語言學習之WaitGroup用法詳解

    Go語言學習之WaitGroup用法詳解

    Go語言中的?WaitGroup?和?Java?中的?CyclicBarrier、CountDownLatch?非常類似。本文將詳細為大家講講WaitGroup的用法,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-06-06
  • Go語言基礎函數包的使用學習

    Go語言基礎函數包的使用學習

    本文通過一個實現加減乘除運算的小程序來介紹go函數的使用,以及使用函數的注意事項,并引出了對包的了解和使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • golang time常用方法詳解

    golang time常用方法詳解

    這篇文章主要介紹了golang time常用方法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • golang占位符%v、%+v、%#v舉例詳解

    golang占位符%v、%+v、%#v舉例詳解

    這篇文章主要給大家介紹了關于golang占位符%v、%+v、%#v的相關資料,Go語言中的占位符通常用于格式化輸出,它們以%開頭,后跟一個字符,表示要轉換的數據類型,需要的朋友可以參考下
    2024-05-05
  • 詳解Golang中Context的原理和使用技巧

    詳解Golang中Context的原理和使用技巧

    Golang?的?Context?包,中文可以稱之為“上下文”,是用來在?goroutine?協(xié)程之間進行上下文信息傳遞的,這些上下文信息包括?kv?數據、取消信號、超時時間、截止時間等。本文主要介紹了Context的原理和使用技巧,希望對大家有所幫助
    2022-11-11

最新評論

高唐县| 朝阳区| 宽甸| 墨江| 西平县| 远安县| 扎鲁特旗| 文昌市| 新巴尔虎左旗| 四会市| 玉林市| 定南县| 双流县| 九江县| 淮南市| 侯马市| 行唐县| 金寨县| 布尔津县| 东海县| 兴宁市| 科技| 丹寨县| 翼城县| 杭州市| 茌平县| 筠连县| 华蓥市| 内江市| 时尚| 星子县| 厦门市| 四子王旗| 辽源市| 庆元县| 台前县| 郑州市| 辽阳县| 临猗县| 都匀市| 长沙县|