分布式配置中心Spring Cloud Config介绍

Spring Cloud Config介绍

用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持, 它分为服务端与客户端两个部分。其中服务端也称为分布式配置中心, 它是一个独立的微服务应用,用来连接配置仓库并为客户端提供获取配置信息、加密/解密信息等访问接口;而客户端则是微服务架构中的各个微服务应用或基础设施, 它们通过指定的配置中心来管理应用资源与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。

在这里插入图片描述

Config服务端配置中心搭建

新建配置中心模块

新建Module模块cloud-config-center-3344,它即为Cloud的配置中心模块CloudConfig Center

POM文件

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud-kernel</artifactId>
        <groupId>com.kernel.springcloud</groupId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-config-center-3344</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>

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

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

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

    </dependencies>

</project>

application.yml 初始配置

server:
  port: 3344

spring:
  application:
    name:  cloud-config-center # 注册进Eureka服务器的微服务名

# 服务注册到eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka

启动类

@SpringBootApplication
@EnableConfigServer
public class CloudConfigApplication {

    public static void main(String[] args) {

        SpringApplication.run(CloudConfigApplication.class,args);
        
    }
}

配置文件存放本地

application.yml 增加 spring cloud config 配置

server:
  port: 3344

spring:
  application:
    name:  cloud-config-center # 注册进Eureka服务器的微服务名
  profiles:
    active: native #配置文件在本地
  # 配置中心
  cloud:
    config:
      server:
        native:
          search-locations: classpath:/config/ #【重要参数】配置文件的存储位置路径

# 服务注册到eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka

在这里插入图片描述
file-path-dev.yml

#logo图片存放地址
logoPath: /data/dev/upload/logo

file-path-prod.yml

#logo图片存放地址
logoPath: /data/prod/upload/logo

kernel-system-dev.yml

person:
  userName: zhangsan-dev
  birth: 1996/01/01
  age: 18

kernel-system-prod.yml

person:
  userName: zhangsan-prod
  birth: 1996/01/01
  age: 19

配置文件存放git上

  • 需要事先在 github 或 gitee 等 git 工具上建立相应的的配置中心仓库。一个简单示例:https://gitee.com/shouanzh/spring-cloud-config
  • 其实就是把本地文件的 config 包及包下配置放在 git 仓库里;

application.yml 增加config的git配置

server:
  port: 3344

spring:
  application:
    name:  cloud-config-center # 注册进Eureka服务器的微服务名
  cloud:
    config:
      server:
        #使用 git 作为配置文件存储
        git:
          uri: https://gitee.com/shouanzh/spring-cloud-config #配置文件所在仓库
          username: git 账号
          password: git 密码
          default-label: master #配置文件分支
          search-paths: config  #配置文件所在根目录
          force-pull: true #本地仓库如果有脏数据,则会强制拉取(默认是false)

# 服务注册到eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka

Spring Cloud Config文件访问方式剖析

启动配置中心 和 Eureka注册中心

仓库中的配置文件会被转换成Web接口,访问请参照以下的规则

label:分支(branch)
profiles:环境(dev/test/prod)
application:服务名

1、/{application}-{profile}.yml

分支默认为yml配置的default-label 值
在这里插入图片描述
2、/{label}/{application}-{profile}.yml(推荐)
在这里插入图片描述
3、/{application}/{profile}[/{label}]
在这里插入图片描述

客户端获取服务端配置示例

引入 pom.xml 依赖

<!--配置中心-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

因为每个服务都会将相关配置放在配置中心服务里,因此该依赖可以添加到公共模块里。

bootstrap.yml

applicaiton.yml是用户级的资源配置项

bootstrap.yml是系统级的,优先级更加高

application.yml文件改为bootstrap.yml,这是很关键的,因为bootstrap.yml是比application.yml先加载的。bootstrap.yml优先级高于application.yml。

服务端使用本地存储的读取方式

spring:
  application:
    name: cloud-consumer-service
  cloud:
    config:
      fail-fast: true #是否启动快速失败功能,功能开启则优先判断config server是否正常
      name: kernel-system,file-path # 配置文件名 如果多个则逗号拼接 按优先级排序,如果key 相同 取 后者
      profile: ${spring.profiles.active} # dev环境 综上 读取kernel-system-dev.yml file-path-dev.yml
      discovery:
        enabled: true
        service-id: cloud-config-center # 配置中心服务名
  profiles:
    active: dev

测试

@RestController
@Api(tags = "配置中心测试")
public class GetCloudConfigContrller {

    @Value("${person.age}")
    private Integer age;

    @Value("${person.userName}")
    private String name;

    @ApiOperation(value="getConfigInfo")
    @PostMapping(value = "/getConfig/v1")
    public RestResult<UserTest> getConfig() {

        try {

            UserTest userTest = new UserTest();

            userTest.setName(name);
            userTest.setAge(age);

            return RestResult.success(userTest,ResultCode.SUCCESS);

        } catch (Exception e) {
            return RestResult.fail(ResultCode.DATA_ACCESS_ERROR);
        }

    }

}

成功读取到配置中心数据
在这里插入图片描述

服务端使用git存储的读取方式

spring:
  application:
    name: cloud-consumer-service
  cloud:
    #Config客户端配置
    config:
      label: master #分支名称
      name: kernel-system #配置文件名称
      profile: dev #读取后缀名称   上述3个综合:master分支上kernel-system-dev.yml的配置文件被读取http://localhost:3344/master/kernel-system-dev.yml
      uri: http://localhost:3344 #配置中心地址

测试

成功读取到git上的配置文件信息
在这里插入图片描述

动态刷新服务的配置(手动版)

Spring Boot Actuator 提供了一个 @RefreshScope 注解,允许开发团队访问 /refresh 端点,强制 Spring Boot 应用程序重新读取应用程序配置;

引入依赖

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

修改YML,添加暴露监控端口配置:

# 暴露监控端点
management:
  endpoints:
    web:
      exposure:
        include: "*"

Controller 添加 @RefreshScope 注解

@RestController
@Api(tags = "消费端")
@RefreshScope // 配置文件自动刷新
public class GetCloudConfigContrller {

    @Value("${person.age}")
    private Integer age;

    @Value("${person.userName}")
    private String name;

    @ApiOperation(value="getConfigInfo")
    @PostMapping(value = "/getConfig/v1")
    public RestResult<UserTest> getConfig() {

        try {

            UserTest userTest = new UserTest();

            userTest.setName(name);
            userTest.setAge(age);

            return RestResult.success(userTest,ResultCode.SUCCESS);

        } catch (Exception e) {
            return RestResult.fail(ResultCode.DATA_ACCESS_ERROR);
        }

    }

}

测试

启动项目后 修改 git上 的配置文件内容

发送Post请求刷新客户端才会生效

curl -X POST "http://localhost:80/actuator/refresh"

修改前
在这里插入图片描述
修改配置文件

在这里插入图片描述
修改后

并没有生效
在这里插入图片描述
执行post刷新

在这里插入图片描述
再次访问

值已经改变
在这里插入图片描述

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值