netcore專案中使用 SpringCloudConfig 和apollo做配置中心
版權所有,轉載請註明出處 https://www.cnblogs.com/netqq/p/14251403.html
一、使用apollo作為配置中心
首先apollo 專案簡介和安裝請自行百度,本文只介紹如何使用
坑:
1、window10下使用指令碼無法執行起apollo的專案,進入專案目錄,位址列輸入cmd,使用以下命令可以執行起apollo專案,請依次各個執行
java -jar apollo-xxxxxx.jar
執行前的配置:
1、確保8080,8070,8090埠未被佔用,如果佔用請自行修改 apollo 的執行埠
2、修改 apolloconfigdb.serverconfig 表 eureka.service.url 的為公司的Eureka 地址
3、修改apolloportaldb.serverconfig 表 apollo.portal.envs ,增加test,pro兩個環境變數,多個值之間使用英文逗號分隔
啟動apollo專案
配置aollo
在瀏覽器中分別訪問8070 8080 8090埠號
使用預設賬號apollo/admin 登入到apollo配置中心(8070埠)
1、點選右上角選單,進入系統引數頁面
查詢organizations key,在表單中新增或者修改,1分鐘後生效,此處資料在建立專案中會用到。
2、建立一個專案
3、在左側選擇環境,右側新增配置鍵值對,作為netcore的程式設計師,善用json,所以,在左側點選新增 Namespace
選中框中的選項 ,記住 “名稱” 這個選項,下問中要用到,也可以在專案中心檢視
提交後就可以存放json格式的資料了
4、填寫此namespace 下的配置項
在netcore 中使用 apollo
筆者使用的框架是netcore3.1
1、配置appsetting.json ,增加apollo配置節點
"apollo": { "AppId": "f664d4241996307a", // 應用id "MetaServer": "http://localhost:8080", //localhost:8080 是apollo 的服務地址,如果apollo在本地這使用localhost即可 "ConfigServer": "http://localhost:8080", "Env": "DEV" //要使用的環境變數,上文資料庫中有配置過環境 },
2、安裝apollo客戶端引用
PM>Install-Package Com.Ctrip.Framework.Apollo.Configuration
3、修改Program.cs 中的 Host 配置項
.ConfigureAppConfiguration((context, configBuiler) => { var env = context.HostingEnvironment; configBuiler.SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true); if (env.IsDevelopment()) { var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName)); if (appAssembly != null) { configBuiler.AddUserSecrets(appAssembly, optional: true); } } configBuiler.AddApollo(configBuiler.Build().GetSection("apollo")) //apollo配置中心,載入配置中心 .AddNamespace("appsettings", ConfigFileFormat.Json) // 引入 namespace:appsettings ,在apollo配置中心可查 .AddDefault(); // 預設 namespace: application configBuiler.AddEnvironmentVariables(); //載入環境變數 configBuiler.AddConfigServer(); //載入遠端配置中心 if (args != null) { configBuiler.AddCommandLine(args); //控制檯命令引數最後載入 } })
至此,netcore 使用 apollo作為配置中心大概做法已經完成
擴充套件: apollo,此處使用的是單機配置,也可以使用slb 給apolloadmin和apolloconfig 做叢集。因為筆者搜遍全網也沒有找到apollo 通過Eureka 註冊中心提供服務的案例,所以使用slb做叢集也可以
二、使用git作為配置中心(偽)
安裝 Steeltoe.Extensions.Configuration.ConfigServerCore 引用
此元件依賴服務發現:Steeltoe.Discovery.ClientCore ,Steeltoe.Discovery.Eureka
說明: 公司自己的Eureka 註冊中心,公司使用git作為配置中心版本管理,有自己的配置中心專案,並且注入到Eureka中心
由於公司使用spring全家桶,所以配置中心也在Eureka 中註冊了,專案讀取配置時候只需要配置 “配置中心”的服務id 這種方式,所以你需要首先執行起來一個Euraka註冊中心,Spring Cloud Config 配置中心
配置中心註冊到Euraka
1、配置 appsetting.json ,增加spring 節點
"spring": { "application": { "name": "xxx-serverId" }, "cloud": { "config": { "enabled": true, "env": "test", "password": "123456", "username": "user", "label": "master", "discovery": { "serviceId": "config-content-serverId", "enabled": true } } } }, "eureka": { //eureka註冊中心 "client": { //作為client使用 "serviceUrl": "http://xxxx.inner.com:8889/eureka/", "shouldFetchRegistry": true, //是否啟用發現服務 "shouldRegisterWithEureka": true //是否註冊到服務中心 }, "instance": { //作為服務使用 "port": 5002, "PreferIpAddress": true, "instanceId": "" //如果不填寫,則使用ip:port格式,此處需要在staup 中手動實現,Steeltoe實現的是計算機名稱+埠號 } },
節點說明: config節點用於獲取配置中心的配置 ,eureka 使用者服務註冊和服務發現,config 依賴於服務發現
2、Program.cs 中 host 增加配置
Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((context, configBuiler) => { var env = context.HostingEnvironment; configBuiler.SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true); if (env.IsDevelopment()) { var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName)); if (appAssembly != null) { configBuiler.AddUserSecrets(appAssembly, optional: true); } } configBuiler.AddApollo(configBuiler.Build().GetSection("apollo")) //載入配置中心 .AddNamespace("appsettings", ConfigFileFormat.Json) // 引入 TEST1.Common 名稱空間 .AddDefault(); // 預設 namespace: application configBuiler.AddEnvironmentVariables(); //載入環境變數 configBuiler.AddConfigServer(); //用於載入配置中心的配置,通過 appsetting.json config節點的配置呼叫 if (args != null) { configBuiler.AddCommandLine(args); //控制檯命令引數最後載入 } })
3、因為要使用服務治理,所以需要將服務治理加入到ioc容器中
在 public void ConfigureServices(IServiceCollection services) 方法中加入如下程式碼
services.AddDiscoveryClient(Configuration); //服務治理相關元件 services.Configure<EurekaInstanceOptions>(options => //重新設定 { if (string.IsNullOrWhiteSpace(options.InstanceId)) { options.InstanceId = options.IpAddress + ":" + options.Port; } });
4、服務治理相關配置加入到了IOC中,但是並未啟用,所以需要啟用
在 public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime lifetime, IServiceProvider svp, ILoggerFactory loggerFactory) 中啟用服務治理功能
//使用服務治理 app.UseDiscoveryClient();
擴充套件:筆者搜遍全網也未找到通過Eureka 註冊中心獲取配置的示例,此示例經過筆者兩天查詢和翻閱資料實現,希望筆者的貢獻能讓netcore 猿 少寫一個bug,少奮鬥一個小時,少掉10跟頭髮,希望你眼中有光,心中有嚮往
參考資料: 《steeltoe》 https://docs.steeltoe.io/api/v3/configuration/config-server-provider.html
《apollo》https://github.com/ctripcorp/apollo/releases
《apollo分散式部署》https://github.com/ctripcorp/apollo/wiki/%E5%88%86%E5%B8%83%E5%BC%8F%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97
版權所有,轉載請註明出處
&n