Spring Cloud Config Server/Client结合Git

Spring Cloud Config Server/Client结合Git

前言

Spring Cloud Config 中心化配置,本文将使用Spring Cloud Config 并结合Git挂在云配置,Git仓库选择的gitee,具体用意跟实现理由等等理论化就不说了。进入主题,第一步是创建gitee仓库,并在仓库里新建一个配置文件jamtest-client.yml;第二步是新建工程SpringCloud-config-server;第三步是新建工程SpringCloud-config-client。

1. 创建gitee仓库

这里新建了个名为spring-cloud-demo的仓库,根目录下,重点关注 jamtest-client.yml
在这里插入图片描述

仓库里实际上有三个yml配置文件,jamtest-dev.yml和jamtest-prod.yml其实只是从一个多环境切换的yml分成了几个文件而已,可以忽略。

#jamtest-client.yml
spring:
  profiles:
    active: dev
    
---
#开发环境端口8001
server:
  port: 8001 
spring:
  profiles: dev

---
#生产环境端口8002
server:
  port: 8002
spring:
  profiles: prod

至此,配置仓库建立完成,需要记录下该仓库的git地址。

2. 创建Spring Cloud config-server工程

首先需要添加spinrg-cloud-config-server的依赖,pom.xml的关键内容

<!--pom.xml-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
            <version>1.3.1.RELEASE</version>
        </dependency>

修改application.yml文件

server:
  port: 8888

spring:
  cloud:
    config:
      server: #声明是sping cloud config server
        git:
          uri: https://gitee.com/YGJam/spring-cloud-demo.git #第一步创建的gitee仓库的uri
          #searchPaths 文件目录
          #username 由于我第一步创建的是public仓库,不需要再写用户名和密码,未尝试private
          #password 有兴趣可以试试看

关键配置部分:spring.cloud.config.server和spring.cloud.config.server.git.uri以及spring.cloud.config.server.git.uri.searchPaths属性。由于是直接放在根目录,所以只需uri,如果是放在根目录下的某个文件夹内,可以添加 searchPaths:文件夹名。

修改启动类ConfigServerApplication.java

@SpringBootApplication
@EnableConfigServer //开启配置
public class ConfigServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }

}

此时Spring Cloud Config Server已经搭建完成,而它的端口8888已经可以拉取配置信息,具体如下,通过postman发送GET请求 ip:port/[文件名]-[激活的配置项].yml ,可以获取到对应的配置信息

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rLRRSJPp-1590305349587)(C:\Users\a\AppData\Roaming\Typora\typora-user-images\1590300661818.png)]

我的仓库中保留了之前的写的两份把yml配置分开的文件,也可以进行拉取。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4fDIoKU7-1590305349590)(C:\Users\a\AppData\Roaming\Typora\typora-user-images\1590300823806.png)]

至此,Spring Cloud Config Server已经配置完成,所写的配置信息可以选择多环境配置集中在一个yml文件中 如jamtest-client.yml,里面在通过profiles来区分环境,或者直接分开多开配置文件 如jamtest-prod,jamtest-dev。

3.创建Spring Cloud config-client工程

这里所说的spring cloud config client 通俗来讲就是通过spring cloud config 这样的中心配置来获取自身配置信息的任意一个客户端(它可以是一个eureka、也可以是一个comsumer)。

首先,肯定还是pom.xml的依赖

<!--pom.xml-->
  <dependency> <!--spring web,后续测试用到-->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency> <!--监视器功能依赖,后续动态刷新时需要用到,建议添加-->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
            <version>1.3.1.RELEASE</version>
        </dependency>

配置bootstrap.yml,bootstrap.yml跟application.yml的功能类似,但是级别不一样,理论上来说,前者是系统级别的,一般不做更改的配置信息会放在bootstrap.yml里,不会被覆盖,而后者是用户应用级别的,存放的是可以更改的配置信息。(甚至可以不配置application.yml)

#bootstrap.yml
spring:
  application:
    name: cloud-config-client-test
  cloud:
    config:
      name: jamtest-client #选择的配置文件
      profile: prod #当前激活的配置环境,常写的有prod、dev等
      uri: http://127.0.0.1:8888 # Config server的uri
      label: master #选择的分支
management:
  security:
    enabled: false # 动态更新配置所需要的配置

关键配置部分:

  • spring.cloud.config.name 指定选择的配置文件名 本仓库中可以选择 jamtest-clinet 或者 jamtest
  • spring.cloud.config.profile 当前激活的配置环境 本仓库可以选择 prod 或者 dev
  • spring.cloud.config.uri 配置服务器的uri,也即 spring cloud config server的访问地址
  • spring.cloud.config.label 选择的分支

最下面的managment那一系列是为了能够动态刷新配置信息,spring boot 1.5x+会默认为true(网上是这么说的)

本次只配置了bootstrap.yml,没有配置application.yml,监听端口也没有出现在这里的配置文件中,而把监听端口放在了git的远端仓库。

ConfigClientApplication.java不需要额外配置注解啥的,默认就可以

为了方便测试,写了一个controller来进行访问。

// TestController
@RestController
@RefreshScope //开启实时更新功能
public class TestController {
    @Value("${server.port}")
    private String port;

    @GetMapping("/test")
    public String test(){
        return port;
    }
}

在bootstrap.yml的配置中 拉去的是jamtest-client-prod的配置内容,端口应该为8002,如果正确,启动这两个程序后,可以访问 localhost:8002/test ,并且会返回当前的端口。

4.验证测试,进行动态刷新配置

先启动SpringCloud-config-server,然后再启动SpringCloud-config-client,测试:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mPvzsweo-1590305349594)(C:\Users\a\AppData\Roaming\Typora\typora-user-images\1590302621003.png)]

得到了想要的结果,可以通过更改 client工程里的bootstrap.yml中的profile进行环境的切换,或者在打jar包时来指定环境进行更改。

**实时动态刷新:**springboot程序只会在启动时读取它们的配置属性,所以如果我们的gitee仓库中的配置文件发生了变化,在本次运行时,是不会被更新的,如果要进行动态的刷新,就需要@Refresh注解,并访问 /refresh 断点,这样可以让SpringBoot程序重新读取。

在启动程序后,手动修改gitee仓库中jamtest-client-prod的端口信息为8003。

首先通过SpringCloud config-server来查看配置信息,会发现配置信息在服务器上已经发生了变化。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6yUhl2mi-1590305349598)(C:\Users\a\AppData\Roaming\Typora\typora-user-images\1590303066660.png)]

然而在它的客户端,配置信息并没有发送变化,监听的端口依然是8002,可以尝试请求 localhost:8002/test ,它的返回值结果依然是8002。而如上所说,可以通过访问 /refresh端点,所以要执行刷新操作,可以访问 ip:port/refresh,这里的ip仍然是8002。

**注意这是一个POST操作!**我猜测它的返回是发生变化的配置信息(具体我也没验证,但是从结果上来说 是的)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SoGjhm4x-1590305349600)(C:\Users\a\AppData\Roaming\Typora\typora-user-images\1590303345668.png)]

最后来看一下最终的结果,这个结果是我最初比较意外的,发现刷新之后,通过 server.prot里 获取到的端口值,确实是更新后的8003,而实际程序运行监听的端口 依然是最初启动时所监听的8002,而我最初设想的刷新后的客户端服务路径应该是 localhost:8003/test 有较大的偏差 。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RbXmz3Vk-1590305349602)(C:\Users\a\AppData\Roaming\Typora\typora-user-images\1590304167722.png)]
但仔细一想,似乎确实也应该是这样,(以下结论为个人的猜想与推测,可能存在有误,会进一步去请教业内大佬,如果持有不同意见或有所了解,请评论指正)。

5.结论

这里的刷新新属性仅仅是刷新了客户端程序中 yml配置文件中的值,而对于当前正在运行的客户端服务实例,它的监听端口依然会是最初启动时的监听端口,虽然这个程序的yml配置文件发生了变化,但程序并未重启,端口没有改变,而@Value操作是从yml文件中读取server.port 此时读取到的是最新的端口值。所以会出现 访问端口是8002而server.port返回值是8003的情况

存留疑惑:

  • 如果想要让运行中的服务实例真正的做到“最新”,是否一定要重启该服务,还是有其他的手段?
  • 我只测试了端口的变化,而如果配置信息是数据库连接信息,那么refresh后 是会重新定位到更改后的数据库 还是仍然原先的数据库
  • 热部署应该是可以解决以上问题?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章