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


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

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

  在微服務架構環境中,項目中配置文件比較繁雜,而且不同環境的不同配置修改相對頻繁,每次發布都需要對應修改配置,如果配置出現錯誤,需要重新打包發布,時間成本較高,因此需要做統一的配置中心,能做到自動更新配置文件信息,解決以上問題。

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

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

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

  Java客戶端不依賴任何框架,能夠運行於所有Java運行時環境,同時對Spring/Spring Boot環境也有額外支持。

  .Net客戶端不依賴任何框架,能夠運行於所有.Net運行時環境。

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

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

2.1 快速安裝

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

  這里我使用的是Windows Server的虛擬機在本機搭的,當然你可以在你的Linux虛擬機中搭建,另外你也可以通過Docker更快捷地部署Apollo

  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集成吧。

三、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,並發布

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

  

四、小結

  本篇簡單介紹了一下統一配置中心與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客戶端使用指南

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM