.NET微服務從0到1:配置中心(Apollo)

Apollo是攜程框架部門研發的分佈式配置中心,能夠集中化管理應用不同環境、不同集羣的配置,配置修改後能夠實時推送到應用端,並且具備規範的權限、流程治理等特性,適用於微服務配置管理場景。

安裝

以下yml依賴於同級目錄下的sql文件夾,可在Github下載

version: '2'

services:
  apollo-quick-start:
    image: nobodyiam/apollo-quick-start
    container_name: apollo-quick-start
    depends_on:
      - apollo-db
    ports:
      - "8080:8080"
      - "8070:8070"
    links:
      - apollo-db

  apollo-db:
    image: mysql:5.7
    container_name: apollo-db
    environment:
      TZ: Asia/Shanghai
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
    depends_on:
      - apollo-dbdata
    ports:
      - "13306:3306"
    volumes:
      - ./sql:/docker-entrypoint-initdb.d
    volumes_from:
      - apollo-dbdata

  apollo-dbdata:
    image: alpine:latest
    container_name: apollo-dbdata
    volumes:
      - /var/lib/mysql

更多部署方式參考部署文檔Quick Start

部署成功後,我們可以看到類似下圖:
在這裏插入圖片描述
我們可以在此處創建項目

配置

如下,我已經新增兩個主版本配置
在這裏插入圖片描述
還有一個灰度版本配置
在這裏插入圖片描述
更多特性,你可以訪問Apollo-Github查看

.NET中的使用

在這裏插入圖片描述
Apollo客戶端與服務端會有一個長連接以獲得服務端的配置更新推送,另外,爲了提高配置的可用性,客戶端提供了回退機制(定時拉拉取配置),客戶端還會把從服務端獲取到的配置在本地文件系統緩存一份以便在服務不可以時從本地恢復。
配置位置:

  • Mac/Linux: /opt/data/{appId}/config-cache
  • Windows: C:\opt\data{appId}\config-cache

官方已經爲我們提供了SDK,如果你對源碼感興趣,也可訪問apollo.net
如果你是在ASP.NET Core中使用,首先需要添加nuget包

Install-Package Com.Ctrip.Framework.Apollo.Configuration -Version 2.3.0

配置HostBuilder

public static IHostBuilder CreateHostBuilder(string[] args)
{
    return Host.CreateDefaultBuilder(args)
         .ConfigureAppConfiguration((hostingContext, builder) =>
         {
             builder.AddApollo(builder.Build().GetSection("apollo"))
             	.AddDefault();
         })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });
}

如果你希望Apollo輸出日誌(默認不會輸出),你可以進行如下配置

public static void Main(string[] args)
{
    LogManager.UseConsoleLogging(Com.Ctrip.Framework.Apollo.Logging.LogLevel.Trace);
    CreateHostBuilder(args).Build().Run();
}

添加Apollo配置項
如下,你可以爲開發環境功能驗收測試環境用戶驗收測試環境生產環境配置不同的Apollo地址

{
  "apollo": {
    "AppId": "netapp1001",
    "MetaServer": "http://localhost:8080/",
    "ConfigServer": [ "http://106.54.227.205:8080/" ],
    "Env": "Dev",
    "Meta": {
      "DEV": "http://localhost:8080/",
      "FAT": "http://localhost:8080/",
      "UAT": "http://localhost:8080/",
      "PRO": "http://localhost:8080/"
    }
  }
}

另外,如果你在使用docker安裝時,無法獲取到配置值,你可以參考這個issues:使用倉庫中提供的ASP.NET Core程序,鏈接docker下部署的apollo服務獲取值爲null ,如果你嫌麻煩,可以直接拷貝以下配置到你的配置文件中即可:

{
    "apollo": {
        "ConfigServer": ["http://localhost:8080/"]
    }
}

我們現在添加一個API來測試下配置獲取情況:

[Route("[controller]")]
[ApiController]
public class ApolloController : ControllerBase
{
    private readonly IConfiguration Configuration;
    public ApolloController(IConfiguration configuration)
    {
        Configuration = configuration;
    }
    public IActionResult Get(string key)
    {
        if (string.IsNullOrWhiteSpace(key))
            return Ok("no key.");
        var value = Configuration[key];
        if (string.IsNullOrWhiteSpace(value))
            return Ok("no value.");
        return Ok($"{key}:{value}");
    }
}

運行程序,如下圖,已成功獲取到request.timeout的value。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章