.NET Core微服務之基於Apollo實現統一配置中心

Tip: 此篇已加入.NET Core微服務基礎系列文章索引html

1、關於統一配置中心與Apollo

  在微服務架構環境中,項目中配置文件比較繁雜,並且不一樣環境的不一樣配置修改相對頻繁,每次發佈都須要對應修改配置,若是配置出現錯誤,須要從新打包發佈,時間成本較高,所以須要作統一的配置中心,能作到自動更新配置文件信息,解決以上問題。java

  Apollo(阿波羅)是攜程框架部門研發的配置管理平臺,可以集中化管理應用不一樣環境、不一樣集羣的配置,配置修改後可以實時推送到應用端,而且具有規範的權限、流程治理等特性。其服務端基於Spring Boot和Spring Cloud開發,打包後能夠直接運行,不須要額外安裝Tomcat等應用容器。mysql

Apollo目前在國內開發者社區比較熱,在Github上有超過5k顆星,在國內衆多互聯網公司有落地案例,能夠說Apollo是目前配置中心產品領域No.1的產品,其成熟度和企業級特性要遠遠強於Spring Cloud體系中的Spring Cloud Config產品git

  目前有針對Java和.Net的兩個客戶端供使用:程序員

  Java客戶端不依賴任何框架,可以運行於全部Java運行時環境,同時對Spring/Spring Boot環境也有額外支持。github

  .Net客戶端不依賴任何框架,可以運行於全部.Net運行時環境。sql

  更多Apollo介紹請瀏覽 Apollo配置中心介紹數據庫

2、Apollo的快速安裝與基本配置

2.1 快速安裝

  Apollo GitHub中提供了一個讓咱們快速上手的Quick Start,幫助咱們快速在本地環境部署,啓動Apollo配置中心。這裏主要集中於針對開發環境的本地部署(單機環境),要部署到生產環境,請參考 Apollo分佈式部署指南json

  這裏我使用的是Windows Server的虛擬機在本機搭的,固然你能夠在你的Linux虛擬機中搭建,另外你也能夠經過Docker更快捷地部署Apollowindows

  Step1.準備下列軟件/環境

Java => JDK 1.8+

MySQL => 5.6.6+

Gitbash

Apollo QuickStart 

  Step2.陸續安裝Java JDK, MySQL與Git

  Step3.導入腳本(從QuickStart目錄中的sql文件夾中拷貝),導入的結果會建立兩個數據庫:

  

  Step4.修改demo.sh中關於數據庫鏈接的信息,主要是url、username與password

# apollo config db info
apollo_config_db_url=jdbc:mysql://192.168.80.70:3306/ApolloConfigDB?characterEncoding=utf8
apollo_config_db_username=root
apollo_config_db_password=213224591

# apollo portal db info
apollo_portal_db_url=jdbc:mysql://192.168.80.70:3306/ApolloPortalDB?characterEncoding=utf8
apollo_portal_db_username=root
apollo_portal_db_password=213224591

  Step5.經過如下命令啓動(切換到quickstart的目錄中),後續能夠將其做爲Windows服務,不過生產環境通常用Linux。

cmd>cd C:\Apollo\apollo-build-scripts-master

cmd>demo.sh start  

  啓動後會最終顯示如下信息:

==== starting service ====
Service logging file is ./service/apollo-service.log
Started [3099]
Waiting for config service startup.......
Config service started. You may visit http://localhost:8080 for service status now!
Waiting for admin service startup....
Admin service started
==== starting portal ====
Portal logging file is ./portal/apollo-portal.log
Started [4071]
Waiting for portal startup......
Portal started. You can visit http://localhost:8070 now!

  看到上述信息顯示完畢,證實咱們的Apollo已經成功啓動起來了,那麼咱們能夠去這兩個端口8080和8070去看看:

  [8070 => Apollo 配置中心管理界面,默認帳號:apollo/admin]

  

  進入以後會看到一個示例項目SampleApp,點進去能夠看到其中有一個示例配置applicaiton

  

  [8080 => Eureka服務註冊&發現,和Consul相似,由於Apollo採用了Eureka做爲服務註冊中心,對Apollo架構感興趣的童鞋能夠閱讀波波老師的《攜程配置中心Apollo架構分析》,這裏不是本文的重點]

  

2.2 基本配置

  Step1.建立一個新項目(這裏部門能夠本身在數據中編輯serverconfig表添加)

  

  Step2.默認狀況下,建立新項目後有一個默認的application的Namespace,咱們刪除它,而後從新建立咱們要用到的配置。對於通常共用的數據庫、Redis、RabbitMQ等配置,咱們通常會將其放到一個Public的配置列表中,而每一個項目中私有的配置信息(如Swagger文檔的說明信息)咱們會單首創建一個Private的配置列表給每一個項目。

  下圖爲建立一個共享的配置列表(在Apollo中稱爲Namespace,詳細內容能夠參考:Apollo核心概念之Namespace

    

  Step3.向Shared和ClientService兩個Namespace中添加Key/Value配置項(能夠經過文本形式添加,速度更快),添加以後記得點擊發布,最終結果以下圖所示:

  

  [經過文本形式添加以下圖所示,當批量添加時建議採用文本形式提升效率]

  

  如今配置都有了,開始和咱們的ASP.Net Core集成吧。

3、ASP.NET Core中集成Apollo

3.1 準備工做

  導入.Net Core的客戶端package,看這個名字Com.Ctrip.Framework.Apollo.Configuration應該是Java程序員寫的,特別的Java Style.

PM>Install-Package Com.Ctrip.Framework.Apollo.Configuration 

  修改appsettings.json,添加apollo節點:指明apollo的AppId和Server地址 => AppId 用來標識應用身份的惟一id,Apollo客戶端針對不一樣的環境會從不一樣的服務器獲取配置 ,MetaServer 就是客戶端獲取配置的服務器配置

  "apollo": {
    "AppId": "MSAD",
    "MetaServer": "http://192.168.80.70:8080"
  }

3.2 更改Program.cs

  這裏主要會在啓動時讀取appsettings.json中的AppId和MetaServer來鏈接Apollo,而且指定要讀取哪一個Namespace的配置項,這裏設置讀取兩個Namespace的配置項(Shared和ClientService)。

    public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
 .ConfigureAppConfiguration((hostingContext, builder) => { builder .AddApollo(builder.Build().GetSection("apollo")) .AddDefault() .AddNamespace("TEST3.Shared") .AddNamespace("ClientService"); })
                .UseStartup<Startup>()
                .Build();

  Tip: Apollo對於Namespace還提供了一個相似於繼承的功能-關聯Namespace,你可讓私有的ClientService關聯一下Shared,這樣就只須要讀取一個ClientService的Namespace就能夠了。

  

3.3 更改StartUp.cs

  對於StartUp.cs,它承擔了不少初始化的注入工做,咱們會在裏邊引入不少配置項,可是幸運的是咱們不須要作太多更改,只是把配置項的Key換成Apollo中定義的便可。例如:

    // IoC - DbContext
    services.AddDbContextPool<ClientDbContext>(
                options => options.UseSqlServer(Configuration["DB"]));

    // Swagger
    services.AddSwaggerGen(s =>
    {
        s.SwaggerDoc(Configuration["Swagger.DocName"], new Info
        {
            Title = Configuration["Swagger.Title"],
            Version = Configuration["Swagger.Version"],
            Description = Configuration["Swagger.Description"],
            Contact = new Contact
            {
                Name = Configuration["Swagger.Contact.Name"],
                Email = Configuration["Swagger.Contact.Email"]
            }
        });
        ......
    });

  這裏經過查看Swagger API文檔來驗證一下是否讀出來了配置項Value:

  

  更多內容,請參考Apollo的.Net core客戶端分支:https://github.com/ctripcorp/apollo.net/tree/dotnet-core

  這時若是咱們在Apollo中更改了ClientService的Swagger.Title配置項併發布以後(由於咱們的Swagger在啓動時注入的,因此沒法獲取實時更新的值),重啓一下ClientService,配置已經更改成下圖所示:

  

  對於須要實時獲取更新的item,咱們也能夠作一個測試,好比在一個Controller中獲取:

    [Route("api/Values")]
    public class ValuesController : Controller
    {
        private IConfiguration _configuration;

        public ValuesController(IConfiguration configuration)
        {
            _configuration = configuration;
        }

        [HttpGet]
        public IActionResult Get()
        {
            string title = _configuration.GetValue<string>("Service_Swagger_Title");

            return Json(title);
        }
    }

  第一次獲取Title爲:

  

  在Apollo中修改Title爲:CAS Premium Service API v4,併發布

  刷新瀏覽器,已經實時更新:

  

4、小結

  本篇簡單介紹了一下統一配置中心與Apollo的基本概念,而後介紹了Apollo的快速安裝(基於QuickStart)與基本配置,最後經過與ASP.NET Core的集成演示瞭如何在項目中使用Apollo替代原有的配置文件(appsettings.json)。固然,本篇只是一個QuickStart,更多的內容都沒有覆蓋,須要咱們去看官方Wiki瞭解。Apollo目前在國內開發者社區比較熱,在Github上有超過5k顆星,在國內衆多互聯網公司有落地案例,值得咱們學習和了解

參考資料

(1)min.jiang,《統一配置中心

(2)張樂,《開源配置中心之Apollo

(3)陳珙,《基於Windows Server部署Apollo初次體驗

(4)Apollo Quick Start: https://github.com/ctripcorp/apollo/wiki/Quick-Start

(5)Apollo GitHub: https://github.com/ctripcorp/apollo

(6)楊波,《攜程配置中心Apollo架構分析

(7)focus-lei,《.Net core使用Apollo作統一配置中心

(8)張善友,《攜程Apollo(阿波羅)配置中心在.NET Core項目快速集成

(9)ctrip,《Apollo .Net客戶端使用指南

 

相關文章
相關標籤/搜索