SpringCloud Config配置中心原理以及环境切换方式

目录
  • Config配置中心原理以及环境切换
    • 原理介绍
    • 一、ConfigServer引入依赖
    • 二、Configclient
    • 注意
  • 简易配置中心原理及流程说明
    • 原理
    • 简易搭建例子

Config配置中心原理以及环境切换

springCloud config项目,用来为分布式的微服务系统中提供集成式外部配置支持,分为客户端和服务端

spring官方如下介绍:

Spring Cloud Config provides server and client-side support for externalized configuration in a distributed system. With the Config Server you have a central place to manage external properties for applications across all environments. The concepts on both client and server map identically to the Spring Environment and PropertySource abstractions, so they fit very well with Spring applications, but can be used with any application running in any language. As an application moves through the deployment pipeline from dev to test and into production you can manage the configuration between those environments and be certain that applications have everything they need to run when they migrate. The default implementation of the server storage backend uses git so it easily supports labelled versions of configuration environments, as well as being accessible to a wide range of tooling for managing the content. It is easy to add alternative implementations and plug them in with Spring configuration.

简而言之: 通过配置服务(Config Server)来为所有的环境和应用提供外部配置的集中管理,这些概念都通过spring的Environment和PropertySource来抽象,所以他可以适用于各类Spring应用,它也能对应用的开发环境、测试环境、生成环境的配置做切换、迁移

原理介绍

git服务器会从远程git拉取配置文件,并存入到本地git文件库,当远程git不可用时,会从本地git文件库拉取配置信息

一、Config Server 引入依赖

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
      <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-eureka</artifactId>
 </dependency>

接入配置中心,让客户端可以发现服务端,启动类加上@EnableConfigServer,@EnableDiscoveryClient注解,命名chu-config

配置中心服务器,会根据spring.cloud.config.server.git.uri来找到配置数据(它可以是git存储库的位置,也可以是本地文件),这是必须的,Config server才能从远程Git服务pull资源来配置在远程码云仓储中新建application.yml和chu-user.yml配置文件

二、Config client

在项目中,基本上所有的基础微服务都是config client,它们都通过config server做外部配置集中管理和动态环境切换

客户端默认拉取规则如下:

/{name}-{profile}.yml
/{label}-{name}-{profile}.yml
  • name:即spring.application.name
  • profile: 激活的剖面
  • label: git分支,默认是master

例如,这里搭建一个chu-user服务:

引入客户端依赖

 <dependency>
     <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-config-client</artifactId>
 </dependency>

在配置文件中通过spring.cloud.config.discovery.enabled=true和spring.cloud.config.discovery.service-id=chu-config来注册发现配置中心服务端

测试:

上头我们介绍了配置中心的拉取规则

远程码云chu-user.yml上有个test:123的属性,在chu-user服务上可通过@Value("${test}")注解获取到,如果chu-user服务上的配置文件中也有个test:456的属性,默认情况下,Config Server优先

经过测试,我们证明了config client可以成功的拉取到远程服务器的配置文件,那么不同环境的配置切换拉取怎么做呢?

1.在远程码云上改造chu-user.yml配置文件如下:

---
spring:
  profiles: dev
isDev: true

---
spring:
  profiles: pro
isDev: false

重启config server,在浏览器输入localhost:8888/chu-user-dev.yml可以成功拉取到配置信息

2.客户端通过spring.cloud.config.profile=pro/dev来指定拉取的环境配置

测试:启动config server和config client,并在chu-user服务控制台看到

分别拉取到application#pro环境和chu-user#pro环境信息,同时程序通过@Value("${isDev}")读取配置值为false

每个资源也可以选择在子目录存储配置文件,通过关键字searchPaths来查询定义的目录,例如

spring:
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/China_shenzhen_git/one-config-server
          search-paths: /config,'{application}'

将会从config目录和与application相同名字的目录中开始查询配置文件

Config server如果希望客户端能够授权访问配置中心库,可以引入security配置,引入依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-security</artifactId>
</dependency>
security:
  basic:
    enabled: true
  user:
    name: config-repo
    password: 123456

那么客户端就需要增加spring.cloud.config.username=config-repo ,password=123456配置来授权访问配置中心服务器

注意

  • spring profiles进行不同环境版本配置分离、切换,通过spring.profiles.active=dev,mysql,如果配置文件基于文件的,服务器将优先根据{applicationName}.yml,在根据application.yml创建一个Environment对象,如果这些yml文件中有了指定的spring profiles,那么这些profiles将有较高优先级
  • spring.profile.avtive是指定spring boot运行的环境,而spring.cloud.config.profile是客户端指定拉取资源库的profile配置,如果有多个profiles,最后一个起作用

简易配置中心原理及流程说明

以下将详细说明简易配置中心原理及流程说明。

原理

在启动后优先于spring默认配置扫描器增加所需配置项,spring将读取第一个值使之生效。

源码详解

对spring有了解的朋友都知道,spring对于默认组件或一些配置都是写在META-INF文件夹下的spring.factories文件中,spring默认配置项也是配置在此。

在spring-boot-1.5.9.RELEASE.jar!/META-INF/spring.factories文件中,有一项与配置相关的配置

# Application Listeners 监听
org.springframework.context.ApplicationListener=\
org.springframework.boot.context.config.ConfigFileApplicationListener
# Environment Post Processors 环境处理
org.springframework.boot.env.EnvironmentPostProcessor=\
org.springframework.boot.cloud.CloudFoundryVcapEnvironmentPostProcessor,\
org.springframework.boot.env.SpringApplicationJsonEnvironmentPostProcessor

此监听类为配置文件关键类。

public class ConfigFileApplicationListener implements EnvironmentPostProcessor, SmartApplicationListener, Ordered {}

可以看到,此监听实现了EnvironmentPostProcessor,SmartApplicationListener与Ordered。

// 监听回调函数
@Override
public void onApplicationEvent(ApplicationEvent event) {
    if (event instanceof ApplicationEnvironmentPreparedEvent) {
        //在此初始化配置项
        onApplicationEnvironmentPreparedEvent(
                (ApplicationEnvironmentPreparedEvent) event);
    }
    if (event instanceof ApplicationPreparedEvent) {
        onApplicationPreparedEvent(event);
    }
}
//配置文件初始化读取
private void onApplicationEnvironmentPreparedEvent(
    ApplicationEnvironmentPreparedEvent event) {
    //加载所有EnvironmentPostProcessor类型bean,此时扫描还未开始,获取到的都必须是上面说的spring.factories中配置的Environment Post Processors。
    List<EnvironmentPostProcessor> postProcessors = loadPostProcessors();
    //增加自己
    postProcessors.add(this);
    //排序
    AnnotationAwareOrderComparator.sort(postProcessors);
    for (EnvironmentPostProcessor postProcessor : postProcessors) {
        //执行
        postProcessor.postProcessEnvironment(event.getEnvironment(),
                event.getSpringApplication());
    }
}
//加载application.yml及指定profile文件
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment,
        SpringApplication application) {
        //加载
    addPropertySources(environment, application.getResourceLoader());
    configureIgnoreBeanInfo(environment);
    bindToSpringApplication(environment, application);
}

配置中心思路

加载流程及优先级清楚了,那么可以开始动手了~

由于执行到这步的时候,还未开始扫描,所以使用注解是无效的。那么新建一个/META-INF/spring.factories文件,并增加相应配置,在ConfigFileApplicationListener之前执行即可。

简易搭建例子

老规矩,不会写详细的步骤,更希望大家能明白原理,举一反三哟

以修改tomcat端口为例子,由于时间关系,只在代码中模拟获得配置项。

新建配置类PropertiesConfigPostProcessor

public class PropertiesConfigPostProcessor implements EnvironmentPostProcessor, Ordered {
    //优先于ConfigFileApplicationListener
    public static final int DEFAULT_ORDER = Ordered.HIGHEST_PRECEDENCE + 9;
    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
       //此时PropertySources中无application配置项,我们新增一个server.port为8999的配置。此步骤如为真实配置中心则可自行获得。
        environment.getPropertySources().addLast(new MapPropertySource("configServerInitProperties", new QuickHashMap<String, Object>().quickPut("server.port", 8999)));
    }
    @Override
    public int getOrder() {
        return DEFAULT_ORDER;
    }
}

新建一个/META-INF/spring.factories文件,内容为

org.springframework.boot.env.EnvironmentPostProcessor=\
top.wboost.example.PropertiesConfigPostProcessor

-application.yml配置

server:
  port: 8000

启动后,日志显示端口为8999.

我们查看系统中存在的配置项为如下所示(省略其他配置项)

{
    "data": {
        "applicationConfigurationProperties": {
            "server.port,class org.springframework.boot.context.config.ConfigFileApplicationListener$ConfigurationPropertySources": 8000
        },
        "configServerInitProperties,class org.springframework.core.env.MapPropertySource": {
            "server.port": 8999
        }
    },
    "info": {
        "code": 10906,
        "message": "执行成功",
        "systemCode": "DO_OK"
    },
    "status": 0
}

以上就是简易流程,懂得原理,可自行扩展!希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • spring cloud config 配置中心快速实现过程解析

    spring-cloud-config 配置中心实现 Spring Cloud Config 用于为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,分为server端和client端. server端为分布式配置中心,是一个独立的微服务应用:client端为分布式系统中的基础设置或微服务应用,通过指定配置中心来管理相关的配置. Spring Cloud Config 构建的配置中心,除了适用于 Spring 构建的应用外,也可以在任何其他语言构建的应用中使用. Spring Clou

  • 详解SpringCloud Config配置中心

    一.创建Config配置中心项目 1.添加依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> 2.启动类,需要添加@EnableConfigServer import org.springframework.boot.SpringApp

  • SpringCloud配置中心Config过程解析

    1.什么是配置中心 统一管理配置,怏速切换各个环境的配置 相关产品: 百度的 discont https://github.com/knightliao/disconf 阿里的diamand https://github.com/takeseem/diamond springcloud的configs-server: http://cloud.spring.io/spring-cloud-config/ 2.添加依赖 <dependency> <groupId>org.spring

  • SpringCloud Config配置中心原理以及环境切换方式

    目录 Config配置中心原理以及环境切换 原理介绍 一.ConfigServer引入依赖 二.Configclient 注意 简易配置中心原理及流程说明 原理 简易搭建例子 Config配置中心原理以及环境切换 springCloud config项目,用来为分布式的微服务系统中提供集成式外部配置支持,分为客户端和服务端 spring官方如下介绍: Spring Cloud Config provides server and client-side support for externali

  • Springcloud Config配置中心使用与相关介绍

    目录 Springcloud Config 什么是springcloud Config config服务端的配置使用 config客户端的相关问题 config客户端的配置使用 动态刷新问题 config客户端的遗留问题 Springcloud Config 什么是springcloud Config   简单来说,Spring Cloud Config就是我们通常意义上的配置中心,也就是微服务项目中,每一个微服务都需要配置相应的配置,如果不同服务的配置文件有相同的配置,如果这些相同配置需要修改

  • SpringCloud微服务应用config配置中心详解

    目录 前言 一.传统应用配置痛点 二.Config 配置中心介绍 三.服务端Config Server搭建 1.pom依赖 2.application启动类配置 3.application.yml配置 4.test-dev.xml(客户端应读取的配置) 5.项目结构 四.客户端Config Client搭建 1.pom依赖 2.application启动类配置 3.bootstrap.yml配置 4.application.yml配置 5.测试controller 6.项目结构 五.动态刷新 六

  • SpringCloud Nacos配置中心管理超详细讲解

    目录 一.Nacos配置管理 1.1 统一配置管理 1.1.1在nacos中添加配置文件 1.1.2 从微服务拉取配置 1.2 配置热更新 1.2.1 方式一 1.2.2 方式二 1.3 配置共享 一.Nacos配置管理 Nacos除了可以做注册中心,同样可以做配置管理来用 1.1 统一配置管理 当微服务部署越来越多,达到数十,数百时,逐个修改微服务配置就会很麻烦,且容易出错.我们需要一种统一配置管理方案,可以集中管理所有实例的配置. Nacos一方面更可以将配置集中管理另一方面在配置变更时,及

  • SpringCloud Config配置加密解密用法解析

    1. Java8自带无限制加密解密算法, 不需要再引入网上说的那俩包 2. 加密解密是SpringCloud Config的功能, 所以必须先启动一个SCC项目 3. 在SCC项目的配置文件中添加加密解密的钥匙: 密钥----> encrypt.key=xuejian 4. 启动SCC项目,通过http://localhost:port/encrypt/status检查加密解密功能是否能用,如果能用,会返回OK,否则会返回一个不能用的提示 5. 启动一个使用SpringCloud Config配

  • springcloud config配置读取优先级过程详解

    情景描述 最近在修复Eureka的静态页面加载不出的缺陷时,最终发现是远程GIT仓库将静态资源访问方式配置给禁用了(spring.resources.add-mappings=false).虽然最后直接修改远程GIT仓库的此配置项给解决了(spring.resources.add-mappings=true),但是从中牵涉出的配置读取优先级我们必须好好的再回顾下 springcloud config读取仓库配置 通过config client模块来读取远程的仓库配置,只需要在boostrap.p

  • Spring Cloud Alibaba Nacos Config配置中心实现

    什么是 Nacos Config 在分布式系统中,由于服务数量巨多,为了方便服务 配置文件统一管理,实时更新,所以需要分布式配置中心组件. Spring Cloud Alibaba Nacos Config 是 Spring Cloud Config 的替代方案. Nacos Config 的存储配置功能为分布式系统中的外部化配置提供服务器端和客户端支持,可以在 Nacos 中集中管理 Spring Cloud 应用的外部属性配置. 引入依赖 在 pom.xml 中添加 spring-cloud

  • SpringCloud Config统一配置中心问题分析解决与客户端动态刷新实现

    目录 一.问题分析及解决方案 1.问题分析 2.解决方案 二.手动刷新 1.添加服务监控 2.暴露服务端点 3.刷新业务类controller 4.手动刷新 三.自动刷新 什么是总线 基本原理 一.问题分析及解决方案 1.问题分析 上一章我们讲过远程仓储统一管理配置信息,客户端可以通过统一配置服务中心 config server 服务端获取配置信息.现在我们来做一个改变,并进行分析. 首先启动注册中心.统一配置中心configserver服务端.订单服务.浏览器访问地址:http://local

随机推荐