SpringCloud(九):SpringCloud 配置中心 Spring Cloud Config

发布于 2019-08-29 09:10:12

9-1. Spring Cloud Config 是什么

在分布式系统中,尤其是当我们的分布式项目越来越多,每个项目都有自己的配
置文件,对配置文件的统一管理就成了一种需要,而 Spring Cloud Config 就
提供了对各个分布式项目配置文件的统一管理支持。Spring Cloud Config 也叫
分布式配置中心,市面上开源的分布式配置中心有很多,比如国内的,360 的
QConf、淘宝的 diamond、百度的 disconf 都是解决分布式系统配置管理问题,
国外也有很多开源的配置中心 Apache 的 Apache Commons Configuration、
owner、cfg4j 等等;

Spring Cloud Config 是一个解决分布式系统的配置管理方案。它包含 Client和 Server 两个部分,Server 提供配置文件的存储、以接口的形式将配置文件的内容提供出去,Client 通过接口获取数据、并依据此数据初始化自己的应用。Spring cloud Config使用 git 或 svn 存放配置文件,默认情况下使用 git。

9-2. 构建 Springcloud config 配置中心

构建一个 spring cloud config 配置中心按照如下方式进行:
1、创建一个普通的 Spring Boot 项目
image.png

2、在 pom.xml 文件中添加如下依赖:

<!--SpringCloud config 依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>

3、在入口类,也就是 main 方法的类上添加注解 @EnableConfigServer

4、在 application.properties 中配置一下 git 仓库信息,此处我们使用 GitHub
( 也 可 以 使 用 码 云 gitee ) , 首 先 在 我 的 Github 上 创 建 一 个 名 为spring-cloud-config 的项目,创建之后,再做如下配置:

image.png

server.port=3721
spring.application.name=08-springcloud-config-server
spring.cloud.config.server.git.uri=https://github.com/shenlailai/spring-cloud-config.git
spring.cloud.config.server.git.search-paths=config-center
spring.cloud.config.server.git.username=xxxxx@qq.com
spring.cloud.config.server.git.password=xxxx

其中:
1.uri 表示配置中心所在仓库的位置
2.search-paths 表示仓库下的子目录
3.username 表示你的 GitHub 用户名
4.password 表示你的 GitHub 密码
至此我们的配置中心服务端就创建好了。

9-3. 构建 Springcloud config 配置中心仓库

接下来我们需要在 github 上设置好配置中心,首先在本地创建一个文件夹叫
cloud,然后在里面创建一个文件夹叫 config-center,然后在 config-center
中创建四个配置文件,如下:

application.properties
application-dev.properties
application-test.properties
application-online.properties

在四个文件里面分别写上要测试的内容:

url=http://www.java3.cn
url=http://dev.java3.cn
url=http://test.java3.cn
url=http://online.java3.cn

然后回到 cloud目录下,依次执行如下命令将本地文件同步到 Github 仓库中:

说明:在使用命令之前先从 https://git-scm.com/ 网站下载安装 git 的 window 客户端

在cloud文件夹下右击鼠标,打开 Git Bash Here

1、添加提交人的账号信息,git 需要知道提交人的信息作为标识;

git config --global user.name 'lailai'
git config --global user.email 'XXX@163.com'

2、将该目录变为 git 可以管理的目录;

git init

3、将文件添加到暂存区;

git add config-center/

4、把文件提交到本地仓库;

git commit -m 'add config-center'

5、添加远程主机;

git remote add origin https://github.com/hnylj/spring-cloud-config.git

6、将本地的 master 分支推送到 origin 主机;

git push -u origin master

这里可能会弹窗让你输入用户名和密码

git

至此,我们的配置文件就上传到 GitHub 上了。
此时启动我们的配置中心,通过/{application}/{profile}/{label}就能访问到我们
的配置文件了;

其中:

{application} 表示配置文件的名字,对应的配置文件即 application,
{profile} 表示环境,有 dev、test、online 及默认,
{label} 表示分支,默认我们放在 master 分支上,

通过浏览器上访问 http://localhost:3721/application/dev/master
返回的 JSON 格式的数据:
name 表示配置文件名 application 部分,
profiles 表示环境部分,
label 表示分支,
version 表示 GitHub 上提交时产生的版本号,
同时当我们访问成功后,在控制台会打印了相关的日志信息;
当访问成功后配置中心会通过 git clone 命令将远程配置文件在本地也保存一
份,以确保在 git 仓库故障时我们的应用还可以继续正常使用。

9-4. 构建 Springcloud config 配置中心客户端

前面已经搭建好了配置中心的服务端,接下来我们来看看如何在客户端应用中使
用。

1、创建一个普通的 Spring Boot 工程 08-springcloud-config-client,并添加
如下依赖:

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

springcloud依赖和仓库依赖也要添加

  <!--springcloud依赖-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <!--springcloud仓库-->
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

ps:注意 ,这个依赖不是添加<dependencies>里面的哦

2、创建 bootstrap.properties 文件,用于获取配置信息,文件内容如下:
<span style="color: red">(注意这些信息一定要放在 bootstrap.properties 文件中才有效)</span>

server.port=3722
spring.application.name=application
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.uri=http://localhost:3721/

SpringCloud Config

其中:
name 对应配置文件中的 application 部分,
profile 对应了 profile 部分,
label 对应了 label 部分,
uri 表示配置中心的地址。

3、创建一个 Controller 进行测试:

1.用@Value 注解注入配置的属性值

@RestController
public class ConfigController {

    @Value("${url}")
    private String url;

    @RequestMapping("/cloud/url")
    public String url(){
        return url;
    }
}

访问http://localhost:3722/cloud/url

image.png

2.通过 Environment对象来获取配置的属性值

@RefreshScope //配置文件自动刷新
@RestController
public class ConfigController {


    @Autowired
    private Environment env;

    @RequestMapping("/cloud/url2")
    public String url2 () {
        return env.getProperty("url");
    }
}

image.png

访问http://localhost:3722/cloud/url2

image.png

9-5. Springcloud config 配置中心客户端测试

通过客户端应用测试是否能够获取到配置中心配置的数据;

9-6. Springcloud config 的工作原理

Spring cloud Config Server 的工作过程如下图所示:

image.png

1、首先需要一个远程 Git 仓库,平时测试可以使用 GitHub,在实际生产环境中,需要自己搭建一个 Git 服务器,远程 Git 仓库的主要作用是用来保存我们的配置文件;

2、除了远程 Git 仓库之外,我们还需要一个本地 Git 仓库,每当 Config Server访问远程 Git 仓库时,都会克隆一份到本地,这样当远程仓库无法连接时,就直接使用本地存储的配置信息;

3、微服务 A、微服务 B 则是我们的具体应用,这些应用在启动的时会从 Config Server 中获取相应的配置信息;

4.当微服务 A、微服务 B 尝试从 Config Server 中加载配置信息的时候,Config Server 会先通过 git clone 命令克隆一份配置文件保存到本地;

5、由于配置文件是存储在 Git 仓库中,所以配置文件天然具有版本管理功能;

9-7. Springcloud config 的安全保护

生产环境中我们的配置中心肯定是不能随随便便被人访问的,我们可以加上适当的保护机制,由于微服务是构建在 Spring Boot 之上,所以整合 Spring Security是最方便的方式。

1、在 springcloud config server 项目添加依赖:

         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

2、在 springcloud config server 项目的 application.properties 中配置用户名密码:

spring.security.user.name=cloud
spring.security.user.password=123456

3、在 springcloud config client 上 bootstrap.properties 配置用户名和密码:

spring.cloud.config.username=cloud
spring.cloud.config.password=123456

4、测试验证;

localhost:3721/application/dev/master

image.png

0 条评论

发布
问题