你可能不知道的.Net Core Configuration

执行原理

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

原文:http://www.cnblogs.com/Erik_Xu/p/7624323.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322182.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Dubbo(一)之简介

转载自 Dubbo 2.7入门 一、背景 本文介绍了网站应用的演进 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。 单一…

P1600-天天爱跑步【LCA,桶,树上差分】

正题 题目链接:https://www.luogu.org/problemnew/show/P1600 题目大意 一棵nnn个点的树,通过每条边需要时间为1。有mmm个玩家从SiS_iSi​跑到TiT_iTi​(不停留,跑完之后马上消失)。然后对于第iii个点求第wiw_iwi​刻停留在改点…

Dubbo(二)之SpringBoot nacos集成

一、框架 使用springboot启动&#xff0c;注册中心现在naocs。 nacos安装 二、样例项目 &#xff08;1&#xff09;maven设置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId> <…

ASP.NET Core Web API下事件驱动型架构的实现(三):基于RabbitMQ的事件总线

在上文中&#xff0c;我们讨论了事件处理器中对象生命周期的问题&#xff0c;在进入新的讨论之前&#xff0c;首先让我们总结一下&#xff0c;我们已经实现了哪些内容。下面的类图描述了我们已经实现的组件及其之间的关系&#xff0c;貌似系统已经变得越来越复杂了。其中绿色的…

P5024-保卫王国【动态dp,最小覆盖集】

正题 题目链接:https://www.luogu.org/problem/P5024 题目大意 一棵树&#xff0c;每次有要求 axby:a\ x\ b\ y:a x b y:表示aaa点是否必选和bbb点是否必选 然后每次求最小覆盖集。 解题思路 最小覆盖集全集-最大独立集 所以我们每次必选不选就用infinfinf或−inf-inf−inf…

Dubbo(三)之Spring zookeeper集成

转载自 Dubbo快速开始 Dubbo 采用全 Spring 配置方式&#xff0c;透明化接入应用&#xff0c;对应用没有任何 API 侵入&#xff0c;只需用 Spring 加载 Dubbo 的配置即可&#xff0c;Dubbo 基于 Spring 的 Schema 扩展 进行加载。 如果不想使用 Spring 配置&#xff0c;可以…

浅谈开发模式及架构发展

一、传统开发模式传统的开发模式基本一般是重服务端的开发方式&#xff0c;大部分工作都在服务端执行&#xff0c;然后返回到客户端&#xff08;通常是HTML&#xff09;。以Asp.net MVC为例&#xff0c;如下图&#xff1a;#1 根据请求的路由定位到对应的Controller的对应的Acti…

P1613-跑路【Floyd,倍增】

正题 题目链接:https://www.luogu.org/problem/P1613 题目大意 询问111到nnn的路径&#xff0c;每次可以走2n2^n2n条边&#xff0c;求最少次数(可以重复)。 解题思路 定义geti,j,tget_{i,j,t}geti,j,t​表示iii到jjj是否有2t2^t2t的路径。 然后geti,j,tgeti,k,t−1&amp;…

Dubbo(四)之xml配置方式

转载自 Dubbo xml配置方式 以 XML 配置的方式来配置你的 Dubbo 应用 有关 XML 的详细配置项&#xff0c;请参见&#xff1a;配置参考手册。如果不想使用 Spring 配置&#xff0c;而希望通过 API 的方式进行调用&#xff0c;请参见&#xff1a;API配置。想知道如何使用配置&a…

Actor-ES框架:Ray-Handler之CoreHandler编写

如图右上角所示&#xff0c;Ray中有两类Handler&#xff08;SubHandler和PartSubHandler&#xff09;,在使用中&#xff0c;SubHandler派生Actor的CoreHandler&#xff0c;PartSubHandler派生SQLToReadHandler&#xff0c;SQLToReadHandler派生Actor的ToReadHandler&#xff0c…

Dubbo(五)之动态配置中心

转载自 Dubbo动态配置中心 Dubbo 2.7 中的动态配置中心 配置中心&#xff08;v2.7.0&#xff09;在 Dubbo 中承担两个职责&#xff1a; 外部化配置。启动配置的集中式存储 &#xff08;简单理解为 dubbo.properties 的外部化存储&#xff09;。服务治理。服务治理规则的存储…

P4503-[CTSC2014]企鹅QQ【字符串hash】

题目大意 给出nnn个长度为lll且互不相同的串&#xff0c;若两个串只有一个字符不相同那么这两个串相似。 求有多少对相似的串。 解题思路 我们可以枚举不相似的位&#xff0c;然后我们考虑字符串hashhashhash 然后我们可以将删掉了一位的字符串拆分为由[1..k−1][1..k-1][1…

nssl1335-蛋糕切割【数论,GCD】

正题 题目大意 n∗mn*mn∗m的矩阵&#xff0c;求对角线经过多少个格子(经过格子内部才算)。 解题思路 FromZYCdalaoFrom\ ZYCdalaoFrom ZYCdalao的思路:::对于若(n,m)1(n,m)1(n,m)1(互质)则会经过nm−1nm-1nm−1个格子&#xff0c;所以我们可以将n∗mn*mn∗m拆分成gcd(n,m)gcd(…

使用Mono将C#编译运行至WebAssembly平台

因为所有的主流网页浏览器都支持WebAssembly&#xff0c;开发者们现在可以寻找一个新的平台来部署他们的应用程序。由WebAssembly团队提供的标准工具链仅能将C、C编译成为WebAssembly&#xff0c;然而这对使用其他编程语言的开发者们并没有什么帮助。C#开发者就幸运的多了&…

Dubbo(六)之属性配置

转载自 Dubbo属性配置 属性配置 以属性配置的方式来配置你的 Dubbo 应用 如果你的应用足够简单&#xff0c;例如&#xff0c;不需要多注册中心或多协议&#xff0c;并且需要在spring容器中共享配置&#xff0c;那么&#xff0c;我们可以直接使用 dubbo.properties 作为默认…

nssl1336-膜拜神牛【LIS】

正题 题目大意 序列AAA和序列BBB。一个子集SSS使得不存在 Ax≥Ay&amp;Bx≤By(x,y∈S)A_x\geq A_y\ \&amp;\ B_x\leq B_y(x,y\in S)Ax​≥Ay​ & Bx​≤By​(x,y∈S) 求子集最大大小 解题思路 很显然我们可以先排序然后变成LISLISLIS问题。 先按照AAA为第一关键字…

使用Docker分分钟启动常用应用

前言Docker是目前比较火的一个概念&#xff0c;同时也是微服务中比较关键的一个容器化技术。但是&#xff0c;单从理论上好难看出Docker的优势&#xff0c;因此&#xff0c;我希望在这篇文章中提供一些Docker的使用示例&#xff0c;希望从实际应用上帮助大家理解Docker的优势&a…

Dubbo(七)之自动加载环境变量

转载自 自动加载环境变量 在 Dubbo 中自动加载环境变量 从 2.7.3 版本开始&#xff0c;Dubbo 会自动从约定 key 中读取配置&#xff0c;并将配置以 Key-Value 的形式写入到URL中。 支持的 key 有以下两个&#xff1a; dubbo.labels&#xff0c;指定一些列配置到 URL 中的键…

nssl1337-矩形统计【单调栈】

正题 题目大意 一个n∗nn*nn∗n的矩阵&#xff0c;然后有些位置破损。求可以剪出多少个不破损的矩形。 解题思路 预处理upi,jup_{i,j}upi,j​表示从(i,j)(i,j)(i,j)向上多少格子都是非破损格子。 然后我们枚举下界LowLowLow&#xff0c;将图像变成一个下部平整的条形图&…

TypeScript 2.7 版本发布

TypeScript 2.7版本已经发布了&#xff0c;新增了几个主要功能特性并进行了一些bug的修正。其中一些亮点包括对类属性的赋值检查、固定长度的元组和改进对象文字的类型推断。总的来说&#xff0c;这个版本对类型系统、ES2015特性和总体的TypeScript开发者体验都进行了改进优化。…