『互联网架构』软件架构-分布式集中配置中心Spring Cloud Config详解(上)(103)

在程序运行期间,动态的更改内存中的配置,不知道各位老铁了解过不,或者在项目中用过。不是数据库改配置这种,是直接更改内存。之前说过分布式集中配置中心,百度的一款disconf分布式配置中心,但是disconf这个2016年之后就不在维护了。diamond是针对dubbo的一款分布式的配置框架也有6年没有维护了。Apollo(阿波罗)是携程框架部门研发的分布式配置中心。但是本次主要说springcloud,其实springcloud也有自己的分布式集中配置中心Spring Cloud Config。
源码:https://github.com/limingios/netFuture/tree/master/源码/『互联网架构』软件架构-分布式集中配置中心Spring Cloud Config详解(上)(103)/

(一)config配置中心介绍

  • 为什么需要配置中心?
  1. 集中管理配置。
  2. 不同环境不同配置。
  3. 运行期间动态调整配置。
  4. 自动刷新。
  • 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

  • 使用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仓库的密码

  • 启动项目,访问地址:http://localhost:8080/ms-config/dev,得到整个项目的配置信息

里面有个version,其实跟git中的版本是一致的。

http://localhost:8080/ms-config-dev.properties

http://localhost:8080/task/ms-config-dev.properties

每次访问后,都会将文件通过server下载到本地

  • config文件的映射规则
    1.application 项目的名称
    2.label 是分支名称
    3.profile 就是类别 dev test
    4.默认是 master

  • 各种配置方法见项目配置文件

客户端client,启动的时候其实就是config从server中获取一下配置文件,对应的参数放入内存中,不保存在本地。如果server-config挂了的话,只要clent不重启不影响client的。

####(三) 编写config配置中心客户端

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为配置内容的加密与解密提供了支持。

  • 安装JCE
    > 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端如何获取,而且还说了加密和解密。下次咱们说说动态刷新配置这块。

>>原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢!
>>原文链接地址:『互联网架构』软件架构-分布式集中配置中心Spring Cloud Config详解(上)(103)
上一篇: 下一篇:

发表评论

电子邮件地址不会被公开。 必填项已用*标注