18

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

 4 years ago
source link: https://www.tuicool.com/articles/2e6RvaF
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

源码:https://github.com/limingios/netFuture/tree/master/源码/『互联网架构』软件架构-分布式集中配置中心Spring Cloud Config详解(上)(103)/

n6V7va3.png!web

(一)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中的配置属性。

immANrB.png!web

mQbUzaE.png!web

  • 使用config实现配置中心服务端及客户端

    > 首先新增git配置仓库中心,地址为:https://github.com/limingios/springcloudconfig.git,在仓库里增加如下配置文件

6jA3IjA.png!web

YvIJ3uF.png!web

AzmIze3.png!web

####(二) 服务端源码

 10-ms-config-server 

EJRFbyI.png!web

添加依赖

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

RRbUBnM.png!web

并在启动类上增加注解@EnableConfigServer

ErANrqj.png!web

配置文件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仓库的密码

aQfaQfm.png!web

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

niyIBfu.png!web

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

ANzyQr7.png!web

7jeQ7fE.png!web

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

2aM3aqb.png!web

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

J73AJjU.png!web

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

eaMBnua.png!web

rmaQJzj.png!web

  • config文件的映射规则
    1.application 项目的名称
    2.label 是分支名称
    3.profile 就是类别 dev test
    4.默认是 master
    a2uQfeY.png!web
  • 各种配置方法见项目配置文件

jUzQBz3.png!web

uYvMnuv.png!web

M7ZfeaQ.png!web

客户端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>

za2qmmF.png!web

默认的application.yml配置文件,还需增加一个bootstrap.yml的配置文件

je6raeR.png!web

jeymEfe.png!web

1.client端启动后,启动访问server端,从server端下载配置文件到【内存】中

2.访问对应的value中的值,直接就可以看到server端配置的属性

vmUbEj3.png!web

编写了一个Controller,value获取配置文件中的数据。这都是spring mvc的基础,这里就不在做阐述了。

byIbUjz.png!web

(四)配置信息的加解密安全处理

在 Git仓库中明文存储配置属性的。很多场景下,对于某些敏感的配置内容(例如数据库账号、密码等),应当加密存储。 config server为配置内容的加密与解密提供了支持。

A3mYBfb.png!web

  • 安装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

mquE3in.png!web

下载JCE并解压,将其中的jar包覆盖到JDK/jre/lib/security目录中

UnuaaaU.png!web

  • 对称加密

    > config server提供了加密与解密的接口,分别是/encrypt与/decrypt

源码:10-ms-config-server-encryption

启动项目:注意填写加密的key。

2yEFVrb.png!web

获取加密信息(post方式):http://localhost:8080/encrypt

body中填写要加密的信息:www.idig8.com

ZzMfAbV.png!web

获取到加密信息:9ef1e86a01b272fd75d72a0dc40161db938430c069a76d6d82a17b2b5a8e2cf2

IZzYNbM.png!web

将这个信息放入需要加密的信息中前面一定要加入{cipher}

{cipher} 英文就是暗号的意思,有了暗号才会给你解密的

注意:如果是properties 不需要加引号引入value值,如果是yml需要加入引号

nqQ3iyI.png!web

获取解密信息 http://localhost:8080/decrypt

将刚才加密的信息进行解密9ef1e86a01b272fd75d72a0dc40161db938430c069a76d6d82a17b2b5a8e2cf2

VbuuEvv.png!web

N7VvAjn.png!web

直接访问http://localhost:8080/ms-config-encryption-dev.yml,得到密钥原文

m6nyYvI.png!web

说明 config server能自动解密配置内容。一些场景下,想要让 config server直接返回密文

本身,而并非解密后的内容,可设置spring.cloud.config.server.encrypt.enabled=false,这时可由 ConfigCIient自行解密。

PS:分布式集中配置中心Spring Cloud Config 确实功能很强大,这次咱们主要说下,如果制作server,client端如何获取,而且还说了加密和解密。下次咱们说说动态刷新配置这块。

百度未收录

>>原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢!

>>原文链接地址:上一篇:

已是最新文章


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK