ASP.NET?Core集成Apollo(阿波羅)
1.介紹
Apollo(阿波羅)是攜程框架部研發(fā)并開源的一款生產(chǎn)級的配置中心產(chǎn)品,它能夠集中管理應(yīng)用在不同環(huán)境、不同集群的配置,配置修改后能夠?qū)崟r推送到應(yīng)用端,并且具備規(guī)范的權(quán)限、流程治理等特性,適用于微服務(wù)配置管理場景。
2.架構(gòu)和模塊
下面是Apollo架構(gòu)模塊圖(來源自于波波微課):
上圖簡要描述了Apollo的總體設(shè)計,我們可以從下往上看:
- Config Service提供配置的讀取、推送等功能,服務(wù)對象是Apollo客戶端。
- Admin Service提供配置的修改、發(fā)布等功能,服務(wù)對象是Apollo Portal(管理界面)。
- Config Service和Admin Service都是多實(shí)例、無狀態(tài)部署,所以需要將自己注冊到Eureka中并保持心跳。
- 在Eureka之上我們架了一層Meta Server用于封裝Eureka的服務(wù)發(fā)現(xiàn)接口。
- Client通過域名訪問Meta Server獲取Config Service服務(wù)列表(IP+Port),而后直接通過IP+Port訪問服務(wù),同時在Client側(cè)會做load balance、錯誤重試。
- Portal通過域名訪問Meta Server獲取Admin Service服務(wù)列表(IP+Port),而后直接通過IP+Port訪問服務(wù),同時在Portal側(cè)會做load balance、錯誤重試。
- 為了簡化部署,我們實(shí)際上會把Config Service、Eureka和Meta Server三個邏輯角色部署在同一個JVM進(jìn)程中。
2.1用戶在配置發(fā)布后的實(shí)時推送設(shè)計
在配置中心中,一個重要的功能就是配置發(fā)布后實(shí)時推送到客戶端。下面我們簡要看一下這塊是怎么設(shè)計實(shí)現(xiàn)的:
- 用戶在Portal操作配置發(fā)布。
- Portal調(diào)用Admin Service的接口操作發(fā)布。
- Admin Service發(fā)布配置后,發(fā)送ReleaseMessage給各個Config Service。
- Config Service收到ReleaseMessage后,通知對應(yīng)的客戶端。
2.2Apollo客戶端的實(shí)現(xiàn)原理
- 客戶端和服務(wù)端保持了一個長連接,從而能第一時間獲得配置更新的推送(通過Http Long Polling實(shí)現(xiàn))。
- 客戶端還會定時從Apollo配置中心服務(wù)端拉取應(yīng)用的最新配置。
- 這是一個fallback機(jī)制,為了防止推送機(jī)制失效導(dǎo)致配置不更新。
- 客戶端定時拉取會上報本地版本,所以一般情況下,對于定時拉取的操作,服務(wù)端都會返回304 - Not Modified。
- 定時頻率默認(rèn)為每5分鐘拉取一次,客戶端也可以通過在運(yùn)行時指定System Property: apollo.refreshInterval來覆蓋,單位為分鐘。
- 客戶端從Apollo配置中心服務(wù)端獲取到應(yīng)用的最新配置后,會保存在內(nèi)存中。
- 客戶端會把從服務(wù)端獲取到的配置在本地文件系統(tǒng)緩存一份。
- 在遇到服務(wù)不可用,或網(wǎng)絡(luò)不通的時候,依然能從本地恢復(fù)配置,不影響應(yīng)用正常運(yùn)行。本地緩存路徑位于C:\opt\data\{appId}\config-cache,所以請確保C:\opt\data\目錄存在,且應(yīng)用有讀寫權(quán)限。
- 應(yīng)用程序可以從Apollo客戶端獲取最新的配置、訂閱配置更新通知。
2.3環(huán)境配置(Environment)
Apollo支持應(yīng)用在不同的環(huán)境有不同的配置,所以Environment是另一個從服務(wù)器獲取配置的重要信息。Environment通過配置文件來指定,文件位置為C:\opt\settings\server.properties,文件內(nèi)容形如:
env=DEV
目前,env支持以下幾個值(大小寫不敏感):
- DEV:Development environment
- FAT:Feature Acceptance Test environment
- UAT:User Acceptance Test environment
- PRO:Production environment
3.Apollo在Windows上快速啟動
3.1準(zhǔn)備工作
3.1.1 Java jdk
Apollo服務(wù)端:1.8+
Apollo客戶端:1.7+
Java jdk1.8下載地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html,這里提醒一下,安裝目錄名稱千萬別有空格,不然會Apollo啟動時候會報錯的。
在配置好后,可以通過如下命令檢查:
java -version
配置下環(huán)境變量:
3.1.2MySQL
版本要求:5.6.5+(MySQL服務(wù)端安裝我就不說了,自行百度)
Apollo的表結(jié)構(gòu)對timestamp使用了多個default聲明,所以需要5.6.5以上版本。
連接上MySQL后,可以通過如下命令檢查:
SHOW VARIABLES WHERE Variable_name = 'version';
3.1.3下載快速啟動安裝包
下載Apollo安裝包,大家只需要下載到本地,就可以直接使用,免去了編譯、打包過程。
Github下載:https://github.com/nobodyiam/apollo-build-scripts
安裝包要58M這么大,是因?yàn)檫@是一個可以自啟動的jar包,里面包含了所有依賴jar包以及一個內(nèi)置的tomcat容器。解壓Apollo安裝包后會看到如下文件:
3.2安裝步驟
3.2.1創(chuàng)建數(shù)據(jù)庫
Apollo服務(wù)端共需要兩個數(shù)據(jù)庫:ApolloPortalDB和ApolloConfigDB,我們把數(shù)據(jù)庫、表的創(chuàng)建和樣例數(shù)據(jù)都分別準(zhǔn)備了sql文件,只需要導(dǎo)入數(shù)據(jù)庫即可。
創(chuàng)建ApolloPortalDB:通過各種MySQL客戶端導(dǎo)入sql/apolloportaldb.sql即可。
下面以MySQL原生客戶端為例:
source /your_local_path/sql/apolloportaldb.sql
創(chuàng)建ApolloConfigDB:通過各種MySQL客戶端導(dǎo)入sql/apolloconfigdb.sql即可。
下面以MySQL原生客戶端為例:
source /your_local_path/sql/apolloconfigdb.sql
3.2.2配置數(shù)據(jù)庫連接信息
Apollo服務(wù)端需要知道如何連接到你前面創(chuàng)建的數(shù)據(jù)庫,所以需要編輯Apollo目錄中的demo.sh,修改ApolloPortalDB和ApolloConfigDB相關(guān)的數(shù)據(jù)庫連接串信息:
# apollo config db info apollo_config_db_url=jdbc:mysql://172.168.16.xxx:5621/ApolloConfigDB?characterEncoding=utf8 apollo_config_db_username=用戶名 apollo_config_db_password=密碼 # apollo portal db info apollo_portal_db_url=jdbc:mysql://172.168.16.xxx:5621/ApolloPortalDB?characterEncoding=utf8 apollo_portal_db_username=用戶名 apollo_portal_db_password=密碼
3.3啟動Apollo配置中心
快速啟動腳本會在本地啟動3個服務(wù),分別使用8070, 8080, 8090端口,請確保這3個端口當(dāng)前沒有被使用。
- 在Linux/Mac下,可以通過如下命令檢查:
lsof -i:8080
- ●在Window下,可以通過如下命令檢查:
netstat -aon|findstr 8080
先切換到Apollo目錄:
cd D:\StudyDocuments\technology\Apollo\apollo-build-scripts-master
然后執(zhí)行啟動腳本:
./demo.sh start
因?yàn)槲沂窃诒緳C(jī)部署Apollo服務(wù)端的,所以直接打開http://localhost:8070即可:
默認(rèn)管理員用戶名:apollo,密碼:admin,輸入即可登錄成功!而Eureka默認(rèn)端口是8080,即打開http://localhost:8080/即可:
阿波羅如何創(chuàng)建修改用戶密碼、創(chuàng)建用戶、部門,分配權(quán)限等等操作,我就不說了,大伙可以自行百度或者去官網(wǎng)了解,這不在本文范疇之內(nèi)。
4.ASP.NET Core集成Apollo快速開發(fā)
4.1Apollo環(huán)境配置
Apollo默認(rèn)有兩個組織部門,可以通過登錄后管理員工具-系統(tǒng)參數(shù),輸入key值organizations添加修改。返回主界面點(diǎn)擊創(chuàng)建項(xiàng)目后,根據(jù)自身項(xiàng)目輸入相關(guān)項(xiàng)目信息,我這邊demo項(xiàng)目信息如下:
創(chuàng)建項(xiàng)目后,點(diǎn)擊進(jìn)去可能會報如下錯誤提示:
這種錯誤一般是數(shù)據(jù)庫Eureka服務(wù)配置參數(shù)不正確導(dǎo)致的!因?yàn)槲沂潜镜夭渴餉pollo服務(wù)端的,IIS已經(jīng)存在一個站點(diǎn)占用了Eureka服務(wù)默認(rèn)端口8080,所以停掉站點(diǎn)后,輸入demo.sh stop-demo.sh start重新啟動下Apollo即可。重新啟動Apollo后可能還會提示如下信息:
因?yàn)轫?xiàng)目缺少環(huán)境namespaces配置,點(diǎn)擊左側(cè)“添加Namespace”選項(xiàng)添加一個dev開發(fā)環(huán)境namespaces:
namespaces創(chuàng)建后新增AspNetCore.Apollo.Test.WebApi項(xiàng)目開發(fā)環(huán)境配置:
上述配置相當(dāng)于Core項(xiàng)目appsettings.json中以下配置:
然后點(diǎn)擊發(fā)布即可。
4.2ASP.NET Core集成Apollo
通過Github上https://github.com/ctripcorp/apollo.net源碼可以了解到,示例AspNetCore.Apollo.Test.WebApi應(yīng)用可以通過appsettings.json文件可以添加Apollo環(huán)境配置信息:
{ "apollo": { "AppId": "AspNetCore.Apollo.Test.WebApi", //"Cluster": "test",////沒有集群,暫時隱藏 "MetaServer": "http://localhost:8080/", //"Secret": "ffd9d01130ee4329875ac3441c0bedda",////沒有ids4接入,暫時隱藏 //"Namespaces": [ "application.xml", "application.json", "application.yml", "application.yaml", "application" ],////沒有Namespace數(shù)組,暫時隱藏 "Namespace": "dev", "Env": "Dev", "Meta": { "DEV": "http://localhost:8080/" //"FAT": "http://106.54.227.205:8080/", //"UAT": "http://106.54.227.205:8080/", //"PRO": "http://106.54.227.205:8080/" ////示例暫時只有開發(fā)環(huán)境 } } }
然后在Program主程序入口引用Com.Ctrip.Framework.Apollo.Configuration Nuget包,添加Apollo環(huán)境配置信息,添加Namespace名稱,具體配置代碼如下:
.ConfigureAppConfiguration(builder => { var iConfigurationRoot = builder.Build(); var apolloInfo = iConfigurationRoot.GetSection("apollo"); var namespaceName = iConfigurationRoot.GetSection("apollo").GetSection("Namespace").Value; builder.AddApollo(apolloInfo).AddNamespace(namespaceName); })
然后運(yùn)行示例AspNetCore.Apollo.Test.WebApi應(yīng)用,會看到如下調(diào)試信息:
從上述調(diào)試信息可以看到Apollo在ASP.NET Core集成成功!
到此這篇關(guān)于ASP.NET Core集成Apollo的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Asp.Net?Core使用Ocelot結(jié)合Consul實(shí)現(xiàn)服務(wù)注冊和發(fā)現(xiàn)
- ASP.NET Core為Ocelot網(wǎng)關(guān)配置Swagger
- ASP.NET?Core設(shè)置Ocelot網(wǎng)關(guān)限流
- ASP.NET?Core中的Ocelot網(wǎng)關(guān)介紹
- ASP.NET?Core使用Swagger/OpenAPI規(guī)范
- ASP.NET?Core使用AutoMapper組件
- ASP.NET?Core配置和管理Web主機(jī)
- ASP.NET Core中的Options選項(xiàng)模式
相關(guān)文章
在WinForm和WPF中使用GMap.Net地圖插件簡單教程
GMap.NET是一個強(qiáng)大、免費(fèi)、跨平臺、開源的.NET控件,它在Windows Forms 和WPF環(huán)境中能夠使用來自Google, Yahoo!, Bing, OpenStreetMap, ArcGIS, Pergo, SigPac等地圖,下面看一下使用方法2013-12-12ASP.NET檢測到不安全 Request.Form 值解決方案匯總
這篇文章主要介紹了ASP.NET檢測到不安全 Request.Form 值解決方案匯總 ,十分的全面,需要的朋友可以參考下2015-06-06.NET使用js制作百度搜索下拉提示效果(不是局部刷新)實(shí)現(xiàn)思路
搞了個不是局部刷新的百度搜索框下拉提示效果大致思路:前臺放一個input標(biāo)簽,然后當(dāng)該標(biāo)簽內(nèi)的值輸入有變化的時候,調(diào)用后臺代碼查詢 符合條件的數(shù)據(jù)綁定ListBox,感興趣的朋友可以了解下2013-01-01ASP.NET數(shù)據(jù)綁定之DataList控件實(shí)戰(zhàn)篇
這篇文章主要為大家介紹了ASP.NET數(shù)據(jù)綁定中的DataList控件,DataList控件以表的形式呈現(xiàn)數(shù)據(jù),通過該控件,您可以使用不同的布局來顯示數(shù)據(jù)記錄,對DataList控件感興趣的小伙伴們可以參考一下2016-01-01Lucene.Net實(shí)現(xiàn)搜索結(jié)果分類統(tǒng)計功能(中小型網(wǎng)站)
這篇文章主要介紹了Lucene.Net實(shí)現(xiàn)搜索結(jié)果分類統(tǒng)計功能(中小型網(wǎng)站),這種實(shí)現(xiàn)方式比較適合中小型網(wǎng)站,在數(shù)據(jù)量和搜索量不大的情況下可用。本文給大家介紹非常詳細(xì),需要的朋友可以參考下2017-03-03Asp.net利用JQuery AJAX實(shí)現(xiàn)無刷新評論思路與代碼
Asp.net利用JQuery AJAX實(shí)現(xiàn)無刷新評論,此功能是每一個從事asp.net開發(fā)者的朋友都希望實(shí)現(xiàn)的,本文利用閑暇時間整理了一些,有需要的朋友可以參考下2012-12-12DropDownList獲取的SelectIndex一直為0的問題
由于初始化判斷出錯導(dǎo)致每次傳到服務(wù)器的時候會初始化一次,這就導(dǎo)致每次獲取DropDownList的SelectIndex的時候只能是02014-06-06