在程序运行期间,动态的更改内存中的配置,不知道各位老铁了解过不,或者在项目中用过。不是数据库改配置这种,是直接更改内存。之前说过分布式集中配置中心,百度的一款disconf分布式配置中心,但是disconf这个2016年之后就不在维护了。diamond是针对dubbo的一款分布式的配置框架也有6年没有维护了。Apollo(阿波罗)是携程框架部门研发的分布式配置中心。但是本次主要说springcloud,其实springcloud也有自己的分布式集中配置中心Spring Cloud Config。
Spring Cloud Config为分布式系统外部化配置提供了服务器端和客户端的支持,它包括Config Server和Config Client两部分。Config Server是一个可横向扩展、集中式的配置服务器,它用于集中管理应用程序各个环境下的配置,默认使用Git存储配置内容(也可使用Subversion、本地文件系统或Vault存储配置),因此可以方便的实现对配置的版本控制与内容审计。Config Client 是Config Server的客户端,用于操作存储在Config Server中的配置属性。
官网 https://github.com/spring-cloud/spring-cloud-config
首先新增git配置仓库中心,地址为:https://github.com/limingios/springcloudconfig.git,在仓库里增加如下配置文件
10-ms-config-server
添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
并在启动类上增加注解@EnableConfigServer
配置文件application.yml
server:
port: 8080
spring:
application:
name: microservice-config-server
cloud:
config:
server:
git:
uri: https://github.com/limingios/springcloudconfig.git # 配置Git仓库的地址
force-pull: true
username: # Git仓库的账号
password: # Git仓库的密码
里面有个version,其实跟git中的版本是一致的。
http://localhost:8080/ms-config-dev.properties
http://localhost:8080/task/ms-config-dev.properties
每次访问后,都会将文件通过server下载到本地
1.application 项目的名称 2.label 是分支名称 3.profile 就是类别 dev test 4.默认是 master
客户端client,启动的时候其实就是config从server中获取一下配置文件,对应的参数放入内存中,不保存在本地。如果server-config挂了的话,只要clent不重启不影响client的。
spring cloud有一个【引导上下文】的概念,这是主应用程序的父上下文。引导上下文负责从配置服务器加载配置属性,以及解密外部配置文件中的属性。和主应用程序加载application.(yml或 properties)中的属性不同,引导上下文加载(bootstrap.)中的属性。配置在 bootstrap.*中的属性有更高的优先级,因此默认情况下它们不能被本地配置覆盖。
10-ms-config-client
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
默认的application.yml配置文件,还需增加一个bootstrap.yml的配置文件
1.client端启动后,启动访问server端,从server端下载配置文件到【内存】中 2.访问对应的value中的值,直接就可以看到server端配置的属性
编写了一个Controller,value获取配置文件中的数据。这都是spring mvc的基础,这里就不再做阐述了。
在 Git仓库中明文存储配置属性的。很多场景下,对于某些敏感的配置内容(例如数据库账号、密码等),应当加密存储。config server为配置内容的加密与解密提供了支持。
config server的加解密功能依赖Java Cryptography Extension(JCE) Java8 JCE下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
注意:就算有也要覆盖,负责会报错:Unable to initialize due to invalid secret key
下载JCE并解压,将其中的jar包覆盖到JDK/jre/lib/security目录中
config server提供了加密与解密的接口,分别是/encrypt与/decrypt
源码:10-ms-config-server-encryption
启动项目:注意填写加密的key。
获取加密信息(post方式):http://localhost:8080/encrypt body中填写要加密的信息:www.idig8.com
获取到加密信息:9ef1e86a01b272fd75d72a0dc40161db938430c069a76d6d82a17b2b5a8e2cf2
将这个信息放入需要加密的信息中前面一定要加入{cipher} {cipher} 英文就是暗号的意思,有了暗号才会给你解密的 注意:如果是properties 不需要加引号引入value值,如果是yml需要加入引号
获取解密信息 http://localhost:8080/decrypt 将刚才加密的信息进行解密9ef1e86a01b272fd75d72a0dc40161db938430c069a76d6d82a17b2b5a8e2cf2
直接访问http://localhost:8080/ms-config-encryption-dev.yml,得到密钥原文
说明 config server能自动解密配置内容。一些场景下,想要让 config server直接返回密文 本身,而并非解密后的内容,可设置spring.cloud.config.server.encrypt.enabled=false,这时可由 ConfigCIient自行解密。
PS:分布式集中配置中心Spring Cloud Config 确实功能很强大,这次咱们主要说下,如果制作server,client端如何获取,而且还说了加密和解密。下次咱们说说动态刷新配置这块。