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