承接前文springcloud情操陶冶-springcloud config server(一),本文将在前文的基础上讲解config server的涉外接口

前话

通过前文笔者得知,cloud config server提供了多种方式的外部源配置获取。当然也暴露了接口供外界调用,通用的方式是通过JMX接口来调用;笔者则比较关注其MVC方式,这也是本文分析的重点

ConfigServerAutoConfiguration

该自动配置类将server所涉及的功能安排的明明白白的。笔者先贴下它的源码

@Configuration
// 只有使用了@EnableConfigServer注解才会生效
@ConditionalOnBean(ConfigServerConfiguration.Marker.class)
@EnableConfigurationProperties(ConfigServerProperties.class)
@Import({ EnvironmentRepositoryConfiguration.class, CompositeConfiguration.class, ResourceRepositoryConfiguration.class,
ConfigServerEncryptionConfiguration.class, ConfigServerMvcConfiguration.class })
public class ConfigServerAutoConfiguration { }

导入的类有五个,按照步骤来稍微分析下

EnvironmentRepositoryConfiguration-环境仓库配置

此类在前文已经提过了,也就是提供多种方式的获取远程配置,比如GIT、SVN、VAULT等,具体可查阅前文

CompositeConfiguration-多环境仓库Bean创建

与前者的EnvironmentRepository环境仓库搭配使用,内部源码也很简单

	private List<EnvironmentRepository> environmentRepos = new ArrayList<>();

	@Bean
@Primary
@ConditionalOnBean(SearchPathLocator.class)
public SearchPathCompositeEnvironmentRepository searchPathCompositeEnvironmentRepository() {
return new SearchPathCompositeEnvironmentRepository(environmentRepos);
} @Bean
@Primary
@ConditionalOnMissingBean(SearchPathLocator.class)
public CompositeEnvironmentRepository compositeEnvironmentRepository() {
return new CompositeEnvironmentRepository(environmentRepos);
} @Autowired
public void setEnvironmentRepos(List<EnvironmentRepository> repos) {
this.environmentRepos = repos;
}

上述的SearchPathLocator接口一般指代的是环境仓库类,比如JGitEnvironmentRepository。采用了适配器方式进行了整合

ResourceRepositoryConfiguration-文件资源仓库配置

内部的源码也很简单,就是创建了一个ResourceRepository对象,用于读取符合条件的任一单个PropertySource文件

@Configuration
@EnableConfigurationProperties(ConfigServerProperties.class)
@ConditionalOnMissingBean(ResourceRepository.class)
public class ResourceRepositoryConfiguration { // GenericResourceRepository对象创建
@Bean
@ConditionalOnBean(SearchPathLocator.class)
public ResourceRepository resourceRepository(SearchPathLocator service) {
return new GenericResourceRepository(service);
}
}

其会在ResourceController类中有所提及,下文分析。有兴趣的可以去分析其源码,其内部有个findOne()方法用于找寻符合条件的任一文件

public interface ResourceRepository {

	/**
**
** @param name 与搜寻路径搭配使用,见前文
** @param profile 与搜寻路径搭配使用,见前文
** @param label 与搜寻路径搭配使用,见前文
** @param path 文件具体名,比如application.properties
**
**
*/
Resource findOne(String name, String profile, String label, String path); }

ConfigServerEncryptionConfiguration-加解密功能

对外暴露了EncryptionController,用于加解密参数。具体的读者可自行分析

@Configuration
public class ConfigServerEncryptionConfiguration { @Autowired(required=false)
private TextEncryptorLocator encryptor; @Autowired
private ConfigServerProperties properties; @Bean
public EncryptionController encryptionController() {
EncryptionController controller = new EncryptionController(this.encryptor);
controller.setDefaultApplicationName(this.properties.getDefaultApplicationName());
controller.setDefaultProfile(this.properties.getDefaultProfile());
return controller;
} }

ConfigServerMvcConfiguration-MVC配置

MVC的对外功能,主要是由此类来提供的,其创建了两个Controller:EnvironmentController和ResourceController。前者主要暴露符合条件的所有PropertySource,后者则暴露符合条件的任一个PropertySource。

@Configuration
@ConditionalOnWebApplication
// 复写WebMvcConfigurer接口
public class ConfigServerMvcConfiguration extends WebMvcConfigurerAdapter { @Autowired(required = false)
private EnvironmentEncryptor environmentEncryptor; @Autowired(required = false)
private ObjectMapper objectMapper = new ObjectMapper(); // 增加对properties/yml/yaml文件的输出支持
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.mediaType("properties", MediaType.valueOf("text/plain"));
configurer.mediaType("yml", MediaType.valueOf("text/yaml"));
configurer.mediaType("yaml", MediaType.valueOf("text/yaml"));
} // 针对环境属性
@Bean
public EnvironmentController environmentController(EnvironmentRepository envRepository, ConfigServerProperties server) {
EnvironmentController controller = new EnvironmentController(encrypted(envRepository, server), this.objectMapper);
controller.setStripDocumentFromYaml(server.isStripDocumentFromYaml());
controller.setAcceptEmpty(server.isAcceptEmpty());
return controller;
} // 针对文件,与GenericResourceRepository搭配使用
@Bean
@ConditionalOnBean(ResourceRepository.class)
public ResourceController resourceController(ResourceRepository repository, EnvironmentRepository envRepository, ConfigServerProperties server) {
ResourceController controller = new ResourceController(repository,
encrypted(envRepository, server));
return controller;
}
}

暴露的HTTP接口本文就不赘述了,读者可自行查阅,附上些许例子


Environment接口

小结

最后以一张图来表明springcloud config server的工作原理,方便后期回顾整理

springcloud情操陶冶-springcloud config server(二)的更多相关文章

  1. springcloud情操陶冶-springcloud config server(三)

    承接前文springcloud情操陶冶-springcloud config server(二),本文就不讲述server了,就简单阐述下client的应用 前话 config server在引入的时 ...

  2. springcloud情操陶冶-springcloud config server(一)

    承接前文springcloud情操陶冶-springcloud context(二),本文将在前文基础上浅析下ConfigServer的工作原理 前话 根据前文得知,bootstrapContext引 ...

  3. 七、springcloud之配置中心Config(二)之高可用集群

    方案一:传统作法(不推荐) 服务端负载均衡 将所有的Config Server都指向同一个Git仓库,这样所有的配置内容就通过统一的共享文件系统来维护,而客户端在指定Config Server位置时, ...

  4. springcloud情操陶冶-初识springcloud

    许久之前便听到了springcloud如雷贯耳的大名,但是不曾谋面,其主要应用于微服务的相关架构.笔者对微服务并不是很了解,但其既然比较出众,遂也稍微接触研究下 springcloud特性 sprin ...

  5. springcloud情操陶冶-bootstrapContext(二)

    承接前文监听器对bootstrapContext创建的引导,笔者了解到其主要入口类为BootstrapImportSelectorConfiguration.本文将基于此类进行简单的分析 Bootst ...

  6. springcloud情操陶冶-bootstrapContext(一)

    基于前文对springcloud的引导,本文则从源码角度查阅下cloud的context板块的运行逻辑 前言 springcloud是基于springboot开发的,所以读者在阅读此文前最好已经了解了 ...

  7. springcloud情操陶冶-bootstrapContext(三)

    本文则将重点阐述context板块的自动配置类,观察其相关的特性并作相应的总结 自动配置类 直接查看cloudcontext板块下的spring.factories对应的EnableAutoConfi ...

  8. SpringCloud Config Bus webhook 只能刷新config server 不能刷新config client

    在 https://github.com/spring-cloud/spring-cloud-bus/issues/124 中有提到 版本 SpringCloud:Greenwich.RC1 原因 由 ...

  9. SpringCloud Config Server中{application}等占位符使用场景设置默认拉去分支

    Spring Cloud Config服务器支持一个Git仓库URL,其中包含{application}和{profile}(以及{label})的占位符. 1.各个占位符所代表的含义 applica ...

随机推荐

  1. BZOJ_4016_[FJOI2014]最短路径树问题_最短路+点分治

    BZOJ_4016_[FJOI2014]最短路径树问题_最短路+点分治 Description 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点分别走一次并返回. 往某一个点走时,选择 ...

  2. zabbix监控elasticsearch

    1.环境概述 虚拟机系统:CentOS Linux release 7.3.1611 (Core) 宿主机系统:Mac Sierra version 10.12.3 nginx:1.10.3 php: ...

  3. javascript的键盘事件大全

    javascript的键盘事件大全 ------------------------------------------------------------------- 使用event对象的keyC ...

  4. AT89S52最小系统

    NC是NOT CONNECTED的缩写,即空脚. 芯片中NC引脚没有任何用途,只是限于封装形式,该引脚必须存在.

  5. javascript深入浅出图解作用域链和闭包

    一.概要 对于闭包的定义(红宝书P178):闭包就是指有权访问另外一个函数的作用域中的变量的函数. 关键点: 1.闭包是一个函数 2.能够访问另外一个函数作用域中的变量 文章首发地址于sau交流学习社 ...

  6. 死磕 java集合之PriorityBlockingQueue源码分析

    问题 (1)PriorityBlockingQueue的实现方式? (2)PriorityBlockingQueue是否需要扩容? (3)PriorityBlockingQueue是怎么控制并发安全的 ...

  7. Redis的正确使用姿势

    前言 说到分布式缓存,可能大多数人脑海浮现的就是redis了,为什么redis能够在竞争激烈的缓存大战中脱颖而出呢?原因无非有一下几点:性能好,丰富的特性跟数据结构,api操作简单.但是用的人多了,就 ...

  8. SignalR第一节-在5分钟内完成通信连接和消息发送

    前言 首先声明,这又是一个小白从入门到进阶系列. SignalR 这个项目我关注了很长时间,中间好像还看到过微软即将放弃该项目的消息,然后我也就没有持续关注了,目前的我项目中使用的是自己搭建的 Web ...

  9. 图解 sql 事务隔离级别

    sql 事务隔离级别有四种分种为: 一 Read Uncpommitted(未提交读) 二 Read Committed(提交读) 三 Repeated Read(可重复读) 四 Serializab ...

  10. Java-每日编程练习题②(数组练习)

    1.有一个已经排好序的数组.现输入一个数,要求按原来的规律将它插入数组中. 分析思路: 先通过Random类随机创建一个数组,再调用Arrays类中的排序方法sort排好序,然后再开始实现功能. 按原 ...