目录

执行原理

环境变量

Spring Cloud Config Server

挂卷Volume

Config Server vs Volume

执行原理

  1. 配置读取顺序:与代码先后顺序一致。

    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的内容。

  2. 覆盖逻辑:原有的配置继承,相同的配置覆写,新增的配置添加。

  appsettings.json:

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

  cussettings.json

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

  结果:

  

  

  3. 可以设置配置文件不存在或失效时,程序不会被中止,该配置会被忽略。

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

  

环境变量

  1. appsettings.{env.EnvironmentName}.json

  可以根据当前的环境变量设置读取对应的配置,来覆盖之前的配置,有点像Asp.Net的Web Transform,其中环境变量的key为:ASPNETCORE_ENVIRONMENT。

  可以在四个地方设置该环境变量:

  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支持各种配置文件类型。

你可能不知道的.Net Core Configuration的更多相关文章

  1. 你不得不知道的 .NET CORE —— .NET Framework, .NET Core 和 .NET Standard 的区别

    .NET Framework 和 .NET Core 是平台应用框架,而 .NET Standard 是 .NET 底层库.因此只要用 .NET Standard 工程来写的代码可以直接在上层的平台应 ...

  2. 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制

    你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...

  3. Android中Context详解 ---- 你所不知道的Context

    转自:http://blog.csdn.net/qinjuning/article/details/7310620Android中Context详解 ---- 你所不知道的Context 大家好,  ...

  4. Spring中你可能不知道的事(一)

    Spring作为Java的王牌开源项目,相信大家都用过,但是可能大家仅仅用到了Spring最常用的功能,Spring实在是庞大了,很多功能可能一辈子都不会用到,今天我就罗列下Spring中你可能不知道 ...

  5. Android中Context详解 ---- 你所不知道的Context(转)

    Android中Context详解 ---- 你所不知道的Context(转)                                               本文出处 :http://b ...

  6. 你所不知道的setInterval

    在你所不知道的setTimeout记载了下setTimeout相关,此篇则整理了下setInterval:作为拥有广泛应用场景(定时器,轮播图,动画效果,自动滚动等等),而又充满各种不确定性的这set ...

  7. 你所不知道的setTimeout

    JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.它们向任务队列添加定时任务.初始接触它的人都觉得好简单 ...

  8. 你可能不知道的陷阱, IEnumerable接口

    1.  IEnumerable 与  IEnumerator IEnumerable枚举器接口的重要性,说一万句话都不过分.几乎所有集合都实现了这个接口,Linq的核心也依赖于这个万能的接口.C语言的 ...

  9. 你真的会玩SQL吗?你所不知道的 数据聚合

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

随机推荐

  1. 【Java】Java中BigDecimal的基本运算

    BigDecimal一共有4个够造方法,让来看看其中比较常用的两种用法: 第一种:BigDecimal(double val)Translates a double into a BigDecimal ...

  2. vb代码之------画一个半透明矩形

    入吾QQ群183435019 (学习 交流+唠嗑). 废话不说,咱们来看代码吧 程序结果运行如下 需要如下API 1:GdipCreateFromHDC 功能:创建设备场景相对应的绘图区域(相当于给设 ...

  3. vue路由对象($route)参数简介

    路由对象在使用了 vue-router 的应用中,路由对象会被注入每个组件中,赋值为 this.$route ,并且当路由切换时,路由对象会被更新. so , 路由对象暴露了以下属性: 1.$rout ...

  4. eclipse自动提示功能没了的解决方法

    eclipse没有自动提示功能,也就是当一个对象居然点不出他的相关方法.后来网上搜索了下,成功的 办法是. 1.我window->Preferences->Java->Editor- ...

  5. iOS 使用矢量图

    iOS 使用矢量图 iOS 图标通常用 PNG 格式的图片.PNG 图片放大到超过自身的大小就会模糊.可以使用 PDF 格式的矢量图,优点是任意改变图片大小并且保持清晰度. 简单使用 与 PNG 格式 ...

  6. 【JavaScript 实现当前动态时间】

    实现一个简单动态的当前时间 <!doctype html> <html lang="en"> <head> <meta charset=& ...

  7. C/C++中substr函数的应用(简单讲解)

    substr(字符串,截取开始位置,截取长度) //返回截取的字 substr('Hello World',0,1) //返回结果为 'H'  *从字符串第一个字符开始截取长度为1的字符串 subst ...

  8. [bzoj1783] [Usaco2010 Jan]Taking Turns

    题意: 一排数,两个人轮流取数,保证取的位置递增,每个人要使自己取的数的和尽量大,求两个人都在最优策略下取的和各是多少. 注:双方都知道对方也是按照最优策略取的... 傻逼推了半天dp......然后 ...

  9. 树状数组-HDU1541-Stars一维树状数组 POJ1195-Mobile phones-二维树状数组

    树状数组,学长很早之前讲过,最近才重视起来,enmmmm... 树状数组(Binary Indexed Tree(B.I.T), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据 ...

  10. CodeForces 543D:Road Improvement

    题目:http://codeforces.com/problemset/problem/543/D 题意:给你一棵树,一开始边都是0,可以使任意的边变成1,对于每一个根节点求使得它到其他任一点的路径上 ...