SpringCloudConfig + SpringCloudBus实现动态刷新配置文件

​ 在微服务系统中,当服务越来越多, 服务的配置修改也会变得繁琐复杂,这时springCloudConfig就为微服务应用提供集中化配置的支持。

​ 一下示例中SpringCloud 版本为最新的2020.0.0,注册中心为eureka。

一、流程分析

​ config-server服务统一从某处拉取配置文件,其他client服务在spring实例化bean之前从config-server处获取最新的配置文件,如果本地配置文件中已经存在该配置,将读取本地文件的配置。这个过程中虽然client读取了最新的配置文件,但是必须重启才能加载读取的最新配置。

​ 为了解决重启才能读取最新配置的弊端,此时引入spring-boot-starter-actuator

二、config-server

​ config-server 主要是用来拉取git配置文件,同时config-server也是spring-cloud-bus的服务端

首先是config-server的yml配置

server:
  port: 12900
spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: http://192.168.2.168/gitlab/spring-config-test.git #配置文件所在仓库
          username: allen
          password: 123456789
          default-label: dev #配置文件分支,不配置默认master
          search-paths: resources  #配置文件所在根目录
    # bus相关配置
    bus:
      enabled: true
      trace:
        enabled: true
  rabbitmq:
    host: 192.168.2.100
    port: 5672
    username: admin
    password: 654321
    

eureka:
  client:
    serviceUrl:
      defaultZone: http://admin:admin123@192.168.2.252:8000/eureka
      registryFetchIntervalSeconds: 5
  instance:
    prefer-ip-address: true

# actuator相关配置,bus刷新
management:
  endpoints:
    web:
      exposure:
        include: bus-refresh

logging:
  config: classpath:config/spring-logback.xml

gitlab上yml文件放在resources文件夹下
在这里插入图片描述

pom依赖为

 		<!-- Spring Web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- spring cloud config 服务端包 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>

        <!-- Spring OpenFeign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

		<!-- Spring Cloud bus依赖 ,若引入bus可忽略 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>

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

启动类加上注解@EnableConfigServer

@SpringBootApplication
@EnableDiscoveryClient
@EnableConfigServer
public class GreenWeskitConfigApplication {

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

项目启动后在地址栏输入 http://localhost:12900/green-weskit-assistant/dev

在这里插入图片描述

在地址栏输入要看的文件名/分支就可以看到我们在gitlab中的green-weskit-assistant-dev 的文件内容,此时config-server就可以实时读取到gitlab文件中的内容,如果我们修改了git仓库中的内容,此时再次请求也可以看到更新后的内容。

三、config-client(我们正常的服务端)

和一般的springboot项目相比,集成SpringCloudConfig的服务结构上有轻微的差别,此时项目中

在这里插入图片描述

项目中bootstrap配置文件。

bootstrap.yml中必须有springCloudConfig的配置和eureka注册信息。

spring:
  # 配置中心相关配置
  # 使用配置中心
  cloud:
    bootstrap:
      enabled: true # Spring Cloud 版本为2020.0.0时必须有此配置项。之前版本可能不需要,详细可以查看springcloud官网
    config:
      fail-fast: true
      discovery:
        enabled: true
        service-id: green-weskit-config    # 配置中心服务id
      name: green-weskit-assistant  # 与远程仓库中的配置文件的application和profile保持一致,{application}-{profile}.yml
      profile: dev
      label: dev   # 远程仓库中的分支保持一致
#      uri: http://192.168.2.252:12900

eureka:
  client:
    serviceUrl:
      defaultZone: http://admin:admin123@192.168.2.252:8000/eureka
      registryFetchIntervalSeconds: 5
  instance:
    prefer-ip-address: true

pom.xml配置如下:

<!-- Spring Web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

        <!-- Spring OpenFeign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!-- spring cloud config 客户端包 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</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-bus-amqp</artifactId>
        </dependency>

bootstarp文件在application之前启动,项目一启动第一步就是去拉取git中的配置文件

在这里插入图片描述

如果项目中没有application配置文件,此时就会拉取git仓库中的配置文件启动服务。

疑问:如果我们的配置文件中还有application配置文件,且application的配置和git仓库中的配置冲突时会怎样了?

为了解决这个问题,我做了一个实验,将application的server.port修改和仓库中不一样

application.yml如下:

server:
  port: 12403

而git仓库里面的配置如下: port=12400

在这里插入图片描述

项目启动后结果为

在这里插入图片描述

所以两个冲突时,以git仓库中配置优先。

虽然client读取了最新的配置文件,但是必须重启才能加载读取的最新配置,要使项目读到最新的配置

必须post请求:http://localhost:12400/actuator/refresh

四、spring-cloud-bus

上文中,当服务越来越多时,不可能每个服务都去调用一次,这时我们用到了bus

我们可以在config-server服务中集成springcloudbus

配置在上文中已经写出,

此时只要POST调用http://localhost:12900/actuator/busrefresh即可把所有的连到config-server 的客户端刷新

如果调用http://localhost:12900/actuator/busrefresh/green-weskit-assistant 则会只刷新green-weskit-assistant

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值