欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Go語(yǔ)言微服務(wù)開(kāi)發(fā)框架之Go chassis

 更新時(shí)間:2021年05月19日 10:16:01   作者:華為云開(kāi)發(fā)者社區(qū)  
分布式系統(tǒng)中每個(gè)進(jìn)程的動(dòng)態(tài)配置管理及運(yùn)行時(shí)熱加載就成為了一個(gè)亟待解決的問(wèn)題。go chassis汲取了netflix的archaius框架經(jīng)驗(yàn),并做出來(lái)自己的創(chuàng)新特性。

引言

https://github.com/go-chassis/go-chassis是一個(gè)微服務(wù)開(kāi)發(fā)框架,而微服務(wù)開(kāi)發(fā)框架帶來(lái)的其中一個(gè)課題就是:當(dāng)單體應(yīng)用向微服務(wù)轉(zhuǎn)型后,有大量的配置需要管理,而你并不希望登錄到遠(yuǎn)端機(jī)器去更改配置,并重啟應(yīng)用,尤其是現(xiàn)在已經(jīng)是容器的時(shí)代了,也不希望因?yàn)橐粋€(gè)配置的變更,而發(fā)布一個(gè)新的軟件包。那么分布式系統(tǒng)中每個(gè)進(jìn)程的動(dòng)態(tài)配置管理及運(yùn)行時(shí)熱加載就成為了一個(gè)亟待解決的問(wèn)題。https://github.com/go-chassis/go-archaius為gochassis而生,他汲取了netflix的archaius框架經(jīng)驗(yàn),并做出來(lái)自己的創(chuàng)新特性。

架構(gòu)

Source:配置源是一種標(biāo)準(zhǔn)接口,可以通過(guò)實(shí)現(xiàn)一個(gè)source來(lái)接入不同配置源,它定義配置來(lái)自哪個(gè)資源,配置可以來(lái)自配置中心configcenter,來(lái)自本地文件,來(lái)自環(huán)境變量或是啟動(dòng)命令行。source負(fù)責(zé)將配置項(xiàng)緩存到本地內(nèi)存。用戶可以選擇加載任意的source實(shí)現(xiàn)。

Config center source:配置中心源不同于其他source,它包含一個(gè)client抽象,可以對(duì)接不同的生態(tài)系統(tǒng),目前對(duì)接了攜程開(kāi)源的配置中心Apollo。

Config manager:負(fù)責(zé)整合管理所有source的配置,每個(gè)source可以定義優(yōu)先級(jí),當(dāng)通過(guò)manager獲取配置時(shí),如果2個(gè)不同的source有相同的配置,那么就會(huì)取最大優(yōu)先級(jí)的配置。

Event Dispatcher:用戶可以通過(guò)Archaius API進(jìn)行配置變化監(jiān)聽(tīng),當(dāng)source內(nèi)部的配置項(xiàng)新增,更新,刪除配置時(shí),都會(huì)通知到監(jiān)聽(tīng)器。

Source優(yōu)先級(jí):優(yōu)先級(jí)由大到小依次為Config center,CLI,ENV,file,當(dāng)有相同配置項(xiàng)的時(shí)候僅優(yōu)先級(jí)大的配置生效。在一個(gè)分布式系統(tǒng)中,遠(yuǎn)程的配置中心理應(yīng)擁有最大優(yōu)先級(jí),而在本地運(yùn)行一個(gè)獨(dú)立的進(jìn)程時(shí),通常的思維是,命令行參數(shù)優(yōu)先級(jí)高于環(huán)境變量,高于本地文件內(nèi)容。擁有了這樣一套機(jī)制后,用戶就無(wú)需再寫(xiě)代碼處理配置項(xiàng)生效邏輯。

Config Factory:封裝了event 和 config manager的API

Archaius API:封裝底層實(shí)現(xiàn),提供友好的API供開(kāi)發(fā)者使用

獲取配置

獲取配置有2種不同的手段:

1. 調(diào)用archaius API的Get 方法

2. 注冊(cè)監(jiān)聽(tīng)器

事件的觸發(fā)是由soruce的開(kāi)發(fā)者來(lái)決定的,每個(gè)source的行為會(huì)有不同:

命令行與環(huán)境變量是不會(huì)產(chǎn)生任何事件的,當(dāng)archaius運(yùn)行后配置項(xiàng)就已經(jīng)定下來(lái)了,只能使用Get方法獲取。而文件source會(huì)在啟動(dòng)后拉取一遍本地文件內(nèi)容并轉(zhuǎn)換為配置項(xiàng)(可自定義轉(zhuǎn)換算法,決定配置項(xiàng)形態(tài)),之后持續(xù)監(jiān)聽(tīng)本地文件變化,當(dāng)有變化發(fā)生時(shí)會(huì)刷新本地配置并通知到監(jiān)聽(tīng)器。所以2種方法都支持。config center source行為與文件又不同,在啟動(dòng)后,它就會(huì)周期拉取配置中心的配置,并且對(duì)比每一次配置項(xiàng)的不同,并觸發(fā)不同類型事件。

配置項(xiàng)形態(tài)

假設(shè)程序有一個(gè)配置文件叫a.yaml,內(nèi)容如下

registry:

  enabled: true

  interval: 30s復(fù)制代碼

要考慮該如何去對(duì)待這raw data,目前有2種方式

第一種,將配置項(xiàng)拆分為java properties風(fēng)格的配置:

registry.refresh: true

registry.interval: 30s

go archaius開(kāi)放了file handler接口,允許你決定如何將文件內(nèi)容處理為配置項(xiàng)

那么在遠(yuǎn)程的配置中心中,key value的管理方式就要遵循 file handler的行為,當(dāng)你想變更registry.refresh時(shí),就要在配置中心種更改這個(gè)配置項(xiàng)及值。

類似于開(kāi)關(guān)類的配置項(xiàng),這種java properties的管理方式還是不錯(cuò)的,當(dāng)一個(gè)配置項(xiàng)改變時(shí)觸發(fā)一次事件。

但是有一類配置項(xiàng)并不適合如此管理,這就是第二種方式,比如go chassis中的路由管理配置文件:

通常都需要大范圍的更改配置項(xiàng),那么如果還使用切分的方式在配置中心中管理將會(huì)引起go archaius運(yùn)行時(shí)大量的事件觸發(fā),并且,用戶在使用體驗(yàn)上大打折扣,到處去找分散的配置項(xiàng),逐一更改。正確的行為是,將文件名作為配置中心中的key,文件內(nèi)容作為value。用戶需要更改時(shí),去找對(duì)應(yīng)的文件名即可,修改后一次性下發(fā),只會(huì)觸發(fā)一次事件,完成路由的變更。

開(kāi)發(fā)者應(yīng)根據(jù)實(shí)際場(chǎng)景判斷如何處理配置項(xiàng)形態(tài)。也可以自己實(shí)現(xiàn)handler來(lái)決定配置項(xiàng)形態(tài)

配置運(yùn)行時(shí)熱加載

在運(yùn)行時(shí)可以隨時(shí)通過(guò)統(tǒng)一的配置中心或者本地文件(不推薦分布式環(huán)境登到機(jī)器里改文件,但在本地debug時(shí)還是推薦使用文件來(lái)測(cè)試程序的熱加載邏輯)更改配置了,那么接下來(lái)要解決的問(wèn)題就是配置在運(yùn)行時(shí)生效。

這里的技巧是使用go語(yǔ)言中的讀寫(xiě)鎖。我以go chassis中路由配置來(lái)說(shuō)明

go chassis運(yùn)行時(shí)總是會(huì)有不斷地大并發(fā)數(shù)據(jù)訪問(wèn)router config這塊緩存,使用一個(gè)讀寫(xiě)鎖lock中的讀鎖,每次訪問(wèn)緩存都用讀鎖,使用后,解開(kāi)讀鎖。

向archaius注冊(cè)監(jiān)聽(tīng)器,需要自己編寫(xiě)監(jiān)聽(tīng)器的邏輯,每當(dāng)事件出發(fā)后就會(huì)通過(guò)archaius中的數(shù)據(jù)構(gòu)建一個(gè)結(jié)構(gòu)體數(shù)據(jù),然后將數(shù)據(jù)存到本地緩存,首先使用lock的寫(xiě)鎖鎖住router config,更新后,解開(kāi)寫(xiě)鎖。

在這樣的機(jī)制下,就可以做到運(yùn)行時(shí)熱加載配置項(xiàng)而無(wú)需重啟服務(wù)。

例子

一個(gè)本地文件事件監(jiān)控的例子

https://github.com/go-chassis/go-archaius/tree/master/examples/event

管理本地多文件的例子

https://github.com/go-chassis/go-archaius/tree/master/examples/file

Go chassis介紹

https://juejin.im/post/6844903682362834952

以上就是詳解Go語(yǔ)言微服務(wù)開(kāi)發(fā)框架之Go chassis的詳細(xì)內(nèi)容,更多關(guān)于Go語(yǔ)言的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • go語(yǔ)言使用中提示%!(NOVERB)的解決方案

    go語(yǔ)言使用中提示%!(NOVERB)的解決方案

    o語(yǔ)言的設(shè)計(jì)目標(biāo)是提供一種簡(jiǎn)單易用的編程語(yǔ)言,同時(shí)保持高效性和可擴(kuò)展性,它支持垃圾回收機(jī)制,具有強(qiáng)大的并發(fā)編程能力,可以輕松處理大規(guī)模的并發(fā)任務(wù),Go語(yǔ)言還擁有豐富的標(biāo)準(zhǔn)庫(kù)和活躍的開(kāi)發(fā)社區(qū),使得開(kāi)發(fā)者能夠快速構(gòu)建出高質(zhì)量的應(yīng)用程序,需要的朋友可以參考下
    2023-10-10
  • golang http連接復(fù)用方法

    golang http連接復(fù)用方法

    今天小編就為大家分享一篇golang http連接復(fù)用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • Go源碼字符串規(guī)范檢查lint工具strchecker使用詳解

    Go源碼字符串規(guī)范檢查lint工具strchecker使用詳解

    這篇文章主要為大家介紹了Go源碼字符串規(guī)范檢查lint工具strchecker使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Golang解析yaml文件操作指南

    Golang解析yaml文件操作指南

    之前一直從事java開(kāi)發(fā),習(xí)慣了使用yaml文件的格式,尤其是清晰的層次結(jié)構(gòu)、注釋,下面這篇文章主要給大家介紹了關(guān)于Golang解析yaml文件的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • Golang 處理浮點(diǎn)數(shù)遇到的精度問(wèn)題(使用decimal)

    Golang 處理浮點(diǎn)數(shù)遇到的精度問(wèn)題(使用decimal)

    本文主要介紹了Golang 處理浮點(diǎn)數(shù)遇到的精度問(wèn)題,不使用decimal會(huì)出大問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Golang教程之不可重入函數(shù)的實(shí)現(xiàn)方法

    Golang教程之不可重入函數(shù)的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于Golang教程之不可重入函數(shù)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • Go語(yǔ)言Cookie用法分析

    Go語(yǔ)言Cookie用法分析

    這篇文章主要介紹了Go語(yǔ)言Cookie用法,結(jié)合實(shí)例形式分析了Go語(yǔ)言Cookie的設(shè)置、讀取等相關(guān)操作技巧,需要的朋友可以參考下
    2017-02-02
  • Go框架自動(dòng)化工具Beego使用詳解

    Go框架自動(dòng)化工具Beego使用詳解

    這篇文章主要為大家介紹了Go框架自動(dòng)化工具Beego使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Golang中日志使用詳解

    Golang中日志使用詳解

    這篇文章記錄了Golang項(xiàng)目中日志使用,以及結(jié)合Gin框架記錄請(qǐng)求日志,文中通過(guò)代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • 使用Golang開(kāi)發(fā)一個(gè)簡(jiǎn)易版shell

    使用Golang開(kāi)發(fā)一個(gè)簡(jiǎn)易版shell

    這篇文章主要為大家詳細(xì)介紹了如何使用Golang開(kāi)發(fā)一個(gè)簡(jiǎn)易版shell,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02

最新評(píng)論