你可能不知道的.Net Core Configuration

目錄

執行原理

環境變量

Spring Cloud Config Server

掛卷Volume

Config Server vs Volume

 

執行原理

  1. 配置讀取順序:與代碼前後順序一致。javascript

    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", false, true)
            .AddJsonFile("cussettings.json", false, true);
        Configuration = builder.Build();
    }

   以上代碼會先讀取appsettings.json,再讀取cussettings.json,cussettings.json的內容會覆蓋appsettings.json的內容。html

 

  2. 覆蓋邏輯:原有的配置繼承,相同的配置覆寫,新增的配置添加。java

  appsettings.json:git

    {
      "settings": {
        "name": "AppSetting",
        "age": 20 
      } 
    }

  cussettings.jsongithub

    {
      "settings": {
        "name": "CusSetting",
        "gender": "Male"
      } 
    }

  結果:spring

  

   

  3. 能夠設置配置文件不存在或失效時,程序不會被停止,該配置會被忽略。docker

  如cussettings.json不存在或失效時:json

  

 

環境變量

  1. appsettings.{env.EnvironmentName}.jsonapp

  能夠根據當前的環境變量設置讀取對應的配置,來覆蓋以前的配置,有點像Asp.Net的Web Transform,其中環境變量的key爲:ASPNETCORE_ENVIRONMENT。tcp

  能夠在四個地方設置該環境變量:

  a) Visual Studio 2017中的launchSettings.json

  

  b) 操做系統的環境變量

  Windows:

  

 

  Linux:

  

 

  c) Dockerfile

  FROM microsoft/aspnetcore:1.1
  COPY . /app
  WORKDIR /app
  EXPOSE 5000/tcp
  ENV ASPNETCORE_URLS http://*:5000/
  ENV ASPNETCORE_ENVIRONMENT Production
  ENTRYPOINT ["dotnet", "EnvironmentVariable.dll"]

 

  d) Docker啓動指令

  docker run --name {name} -e ASPNETCORE_ENVIRONMENT=Production ...

  如:

  

 

  2. AddEnvironmentVariables()的做用

    var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", false, true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true)
                .AddEnvironmentVariables();//做用?
    Configuration = builder.Build();

  a) 讀取系統的環境變量信息,這個應該大部分人都知道。

  b) 覆蓋以前的配置信息。

  appsettings.json:

{
  "settings": {
    "name": "AppSetting"
  }
}

  經過環境變量來覆蓋settings:name:

  

  

  說明:這裏是用控制檯運行,由於操做系統的環境變量要對IIS Express生效,要重啓vs2017,我懶!

  另外環境變量使用兩下劃線(__)做爲層次的分隔符,具體可參考EnvironmentVariablesConfigurationProvider的源碼。

  

   

Spring Cloud Config Server

  Config Server是Spring Cloud 配置管理的重要中間件,接下來,咱們看一下.Net Core如何跟Config Server進行交互。

  1. 準備配置文件,這裏使用Git做爲配置文件的Source,地址:https://github.com/ErikXu/.NetCore-Configuration

  2. 獲取安裝包,這裏使用Docker啓動,所以,是拉取官方鏡像:docker pull hyness/spring-cloud-config-server

  

  3.  準備啓動資源文件application.yml

info:
  component: config service
 
server:
  port: 8888
 
spring:
  application:
    name: git-config
  profiles:
    active: dev
  cloud:
    config:
      server:
        git:
          uri: https://github.com/ErikXu/.NetCore-Configuration
          searchPaths: Configs

  4. 執行指令啓動Config Server

  docker run --name configsvr -it -d -p 8888:8888 -v /root/config-server/application.yml:/config/application.yml hyness/spring-cloud-config-server

 

   5. 引入Nuget包

  Install-Package Steeltoe.Extensions.Configuration.ConfigServer -Version 1.1.1

 

  6. 準備appsetting.json

{
  "spring": {
    "application": {
      "name": "foo"
    },
    "cloud": {
      "config": {
        "uri": "http://192.168.52.142:8888",
        "validate_certificates": false,
        "env": "dev" 
      }
    }
  },
  "settings": {
    "name": "AppSetting"//會被Config Server的內容覆蓋
  }
}

 

  7. 引入Config Server

  

  結果:

  

 

掛卷Volume

  掛卷是docker的一種機制,能夠把特定的目錄或者文件掛載到docker容器的指定位置。配合.Net Core Configuration的機制,能夠在appsetting.json中記錄開發環境的配置,而後再指定一個待掛載的文件用於記錄不一樣環境的配置,從而覆蓋開發環境的配置,達到多環境適配的能力。

  1. appsetting.json

{
  "settings": {
    "name": "AppSetting"
  }
}

  2. 指定一個待掛載的目錄,可是在開發環境不存在此文件。

    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", false, true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true)
            .AddEnvironmentVariables()
            .AddJsonFile("/configs/volume.json", true, true); //待掛載

        Configuration = builder.Build();
    }

  3. 開發環境

  

 

  4. docker啓動指令

  docker run --name {name} -v {source}:{target} ...

  

  注:若是有權限問題,須要先執行setenforce 0

 

  5. 效果

  

 

   掛卷感受跟appsettings.{env.EnvironmentName}.json很像,既然如此,爲何還要有掛卷呢?那是由於appsettings.{env.EnvironmentName}.json是.net core的機制,其它語言不必定會有,或者是另外的機制,docker的掛卷是服務各類語言的。.Net Core是很優秀的語言,它接收了不少業界的需求,也響應了docker掛卷的機制,在這一點上,.net的能力就相對較弱了。

  

Config Server vs Volume

  Config Server是Spring Cloud體系的配置管理中心,而Kubernetes更可能是使用Volume的方式(HostPath,Config Map,Secret)。

  Config Server是運行時的配置管理,它會按期檢測(心跳,2s)remote config的內容,若是內容更新,就刷新容器的配置信息。Volume是發佈(更新)時的配置管理,在發佈(更新)期間,就把配置信息掛載到容器中。

  Config Server要本身保證其高可用,不然,Config Server掛了,會讀取容器內的原始配置,Volume是把文件掛載到容器中,所以無中間件高可用要求,但要利用Kubernetes等保證發佈更新時,配置掛載到了各個容器中。

  Config Server具備必定的語言侵入性(必需要有驅動jdk或者sdk),Volume無語言侵入性。

  Config Server只支持Yaml等少許配置文件類型,Volume支持各類配置文件類型。

相關文章
相關標籤/搜索