Spring-cloud-Config 配置管理(配置文件自动刷新简单案例)

目录

1.Spring Cloud Config 简介

2. Spring Cloud Config 实践 (入门简单级)

2.1 配置中心服务端 (JDK11 ,IDEA)

2.1.1 创建项目 (Eureka基础之上)

2.1.2 依赖管理 (pom.xml文件)

2.1.3 启动器

 2.1.4 配置文件

 2.1.5 配置仓库

 2.1.6 启动并测试

3. 配置中⼼客户端

3.1 添加依赖(在⽀付微服务⼯程中)

3.2 配置⽂件

3.3 git仓库下文件覆盖

3.4 改造PaymentController

3.5 启动并测试

4.配置⾃动刷新(重点)

4.1 启动Rabbitmq

4.2 配置中心服务端

4.2.1 添加依赖

4.2.2 配置⽂件  

4.3 配置中心客户端 

4.3.1 添加依赖

4.3.2 配置文件

4.3.3 PaymentController

 4.3.4  启动器

 4.4 启动并测试(工具Postman)


1.Spring Cloud Config 简介

  配置⽂件想必⼤家都不陌⽣。在Spring Boot项⽬中,默认会提供⼀个application.properties或者
application.yml⽂件,我们可以把⼀些全局性的配置或者需要动态维护的配置写⼊改⽂件,不如数据库连接,功能开关,限流阈值,服务地址等。为了解决不同环境下服务连接配置等信息的差异,Spring  Boot还提供了基于spring.profiles.active={profile}的机制来实现不同的环境的切换。
  随着单体架构向微服务架构的演进,各个应⽤⾃⼰独⽴维护本地配置⽂件的⽅式开始显露出它的不 ⾜之处。主要有下⾯⼏点。
配置的动态更新:在实际应⽤会有动态更新位置的需求,⽐如修改服务连接地址、限流配置等。在
传统模式下,需要⼿动修改配置⽂件并且重启应⽤才能⽣效,这种⽅式效率太低,重启也会导致服
务暂时不可⽤。
配置多节点维护:在微服务架构中某些核⼼服务为了保证⾼性能会部署上百个节点,如果在每个节
点中都维护⼀个配置⽂件,⼀旦配置⽂件中的某个属性需要修改,可想⽽知,⼯作量是巨⼤的。
不同部署环境下配置的管理:前⾯提到通过profile机制来管理不同环境下的配置,这种⽅式对于⽇常维护来说也⽐较繁琐。
  统⼀配置管理就是弥补上述不⾜的⽅法,简单说,最近本的⽅法是把各个应⽤系统中的某些配置放 在⼀个第三⽅中间件上进⾏统⼀维护。然后,对于统⼀配置中⼼上的数据的变更需要推送到相应的服务 节点实现动态跟新,所以微服务架构中,配置中⼼也是⼀个核⼼组件,⽽Spring Cloud Config就是⼀ 个配置中⼼组件,并且可以Git,SVN,本地⽂件等作为存储。

架构图如下所示:

2. Spring Cloud Config 实践 (入门简单级)

实现最简单的配置中⼼,创建cloud_config微服务⼯程,作为配置中⼼的Config Server,同时
使⽤git作为配置存储⽅式,改造之前⽀付微服务⼯程,作为客户端从Config Server获取配置。具体实 现如下:
项目基础配置: 参考该文   点击访问

2.1 配置中心服务端 (JDK11 ,IDEA)

2.1.1 创建项目 (Eureka基础之上)

File -> new -> Module

2.1.2 依赖管理 (pom.xml文件)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.12</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.csh</groupId>
    <artifactId>Config-Bill-cloud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Config-Bill-cloud</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>11</java.version>
        <spring-cloud.version>2020.0.4</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.0.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.4.12</version>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

2.1.3 启动器

@SpringBootApplication
@EnableConfigServer
public class CloudCongfigApplication {

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

}

 2.1.4 配置文件

application.yml代码如下。

server:
  #端口号9006
  port: 9006
spring:
  application:
    #名字
    name: cloud-config
  cloud:
    config:
      server:
        #访问git
        git:
          # 配置⽂件所在的git仓库
          uri: https://gitee.com/chan163/bill-cloud-config.git
          #repo 目录
          search-paths: repo
          #master分支
          default-label: master    
#配置 eureka
eureka:
  client:
    service-url: 
       defaultZone: http://127.0.0.1:9004/eureka

 2.1.5 配置仓库

在git仓库 CHan/BIllCloudConfig 中,创建repo⽬录,在repo⽬录中创建
cloud-Bill-default.yml 配置⽂件,代码如下。
key1 : v1
key2 : v2
key3 : v3

 2.1.6 启动并测试

首先启动 EurekaServerApplication

然后再启动  CloudCongfigApplication

若出现  下图状况,证明 项目已经初步配置成功

3. 配置中⼼客户端

  改造⽀付微服务⼯程,作为配置中⼼客户端,从上述cloud_Congfig 中 获取application.yml的配
置。

3.1 添加依赖(在⽀付微服务⼯程中

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

3.2 配置⽂件

⽀付微服务项⽬中application.yml代码如下所示。
server:
  port: 9000
spring:
    application:
      name: cloud-payment
    cloud:
        config:
          uri: http://localhost:9006
          profile: default
          label: master
    config:
        import: optional:configserver:http://localhost:9006
eureka:
  client:
     service-url:
      defaultZone: http://127.0.0.1:9004/eureka/
     register-with-eureka: true
     fetch-registry: true

说明:

  • spring.config.import=optional:configserver:http://localhost:9006,指定Spring Boot项⽬从
  • Config Server导⼊配置
  • spring.cloud.config.url:Config Server地址,默认localhost:8888
  • spring.cloud.config.profile:为git配置⽂件的后缀
  • spring.cloud.config.label:为访问git的分⽀。

3.3 git仓库下文件覆盖

案例中的配置服务名为cloud-Bill(spring.application.name = cloud-payment ),那么我们访问的就这个git仓库下repo⽬录  https://gitee.com/chan163/bill-cloud-config.git
下的application.yml(所有服务重⽤)、cloud-payment .yml、cloud-payment - default.yml,这三个配置⽂件的内容,在这三个⽂件具有相同配置的情况下,后⾯的配置会覆盖前⾯的
配置,git仓库中配置⽂件结构如图下图所示。

application.yml

key1: 1

key2: 2

key3: 3

 cloud-payment-default.yml

key3: 666

 cloud-payment

 内容为空

 3.4 改造PaymentController

@RestController
@RequestMapping("/payment")
@Slf4j
public class PaymentController {
    @Value("${key1}")     //从配置文件中读取key1 key2 key 3
    private String key1;
    @Value("${key2}")
    private String key2;
    @Value("${key3}")
    private String key3;
    @GetMapping("/{id}")
    public ResponseEntity<Payment> payment(@PathVariable("id") Integer id) {
        log.info("key1 : {}, key2 : {}, key3 : {}", key1, key2 , key3);   //打印到控制台
        Payment payment = new Payment(id, "⽀付成功");
        return ResponseEntity.ok(payment);
    }
}

 3.5 启动并测试

依次启动

EurekaServerApplication [devtools] :9004/

CloudCongfigApplication [devtools] :9006/

CloudPaymentApplication [devtools] :9000/

然后访问   http://localhost:9000/payment/123  观察控制台 如果如下图所示

证明成功配置成功

反思:当我们在git 仓库修改值时 值仍为原来的值  , 仍为旧的配置.这时候继续要我们下面所学的内容了

4.配置⾃动刷新(重点)

  Spring Cloud Config在项⽬启动时⾃动加载配置内容这⼀机制,导致了他的⼀个缺陷,配置不能⾃ 动刷新,在上述案例中,修改git仓库中的key1的值"key1=v11",发现⽀付服务得到的配置项key1的值还是旧的配置内容,新的内容不会⾃动刷新过来,在微服务架构中,动辄上百个节点如果都需要重启,这 个问题⾮常麻烦。
  我们可以使⽤Spring Cloud Bus和Spring Boot Actuator实现⾃动刷新,实现原理如下图所示。

 

4.1 启动Rabbitmq

这个软件需要我们事先安装,具体如下链接

    点击此处访问

4.2 配置中心服务端

4.2.1 添加依赖

<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>

4.2.2 配置⽂件  

在application.yml中配置连接RabbitMQ,同时配置暴露/actuator/busrefresh端点,代码如下。
server:
  #端口号8888
  port: 8888
spring:
  rabbitmq:
    #虚拟机地址
    host: 192.168.43.133
    #默认端口号
    port: 5672
    #rabbitmq账号
    username: admin
    #rabbitmq密码
    password: 123456

  application:
    #名字
    name: cloud-config
  cloud:
    config:
      server:
        #访问git
        git:
          uri: https://gitee.com/chan163/bill-cloud-config.git
          #repo 目录
          search-paths: repo
          #master分支
          default-label: master
#配置 eureka
eureka:
  client:
    service-url:
       defaultZone: http://127.0.0.1:9004/eureka

management:
  endpoints:
    web:
      exposure:
        include: bus-refresh
  endpoint:
    busrefresh:
      enabled: true

4.3 配置中心客户端 

4.3.1 添加依赖

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

4.3.2 配置文件

server:
  port: 9000
spring:

    application:
      name: cloud-payment
    rabbitmq:
      #虚拟机地址
      host: 192.168.43.133
      #默认端口号
      port: 5672
      #rabbitmq账号
      username: admin
      #rabbitmq密码
      password: 123456
    cloud:
        config:
          uri: http://localhost:8888
          profile: default
          label: master
    config:
        import: optional:configserver:http://localhost:8888
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:9004/eureka/
      register-with-eureka: true
      fetch-registry: true

4.3.3 PaymentController

使⽤@RefreshScope注解刷新更改的配置,代码如下。
@RestController
@RequestMapping("/payment")
@Slf4j
@RefreshScope
public class PaymentController {
    @Value("${key1}")     //从配置文件中读取key1 key2 key 3
    private String key1;
    @Value("${key2}")
    private String key2;
    @Value("${key3}")
    private String key3;
    @GetMapping("/{id}")
    public ResponseEntity<Payment> payment(@PathVariable("id") Integer id) {
        log.info("key1 : {}, key2 : {}, key3 : {}", key1, key2 , key3);   //打印到控制台
        Payment payment = new Payment(id, "⽀付成功");
        return ResponseEntity.ok(payment);
    }
}

 4.3.4  启动器

config启动器

@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer
public class CloudCongfigApplication {

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

}

 cloud-payment启动器

@SpringBootApplication
@EnableDiscoveryClient
public class CloudPaymentApplication {

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

}

 4.4 启动并测试(工具Postman)

  启动Eureka、Config Server、⽀付微服务(Config Client),修改git仓库中的配置项内容后,使⽤
Postman发送POST请求给/ actuator/busrefresh(注意是是POST类型),再次访问⽀付服务,发现配置项已经⾃动刷新,

依次启动

EurekaServerApplication [devtools] :9004/

CloudCongfigApplication [devtools] :8888/

CloudPaymentApplication [devtools] :9000/

原配置文件

调用支付微服务  观察控制台

访问  localhost:9000/payment/12355

 修改一下配置文件

 发送POST请求  

localhost:9006/actuator/busrefresh

 然后再次调用支付微服务

访问  localhost:9000/payment/12355

 配置文件成功刷新说明我们的项目配置完毕.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值