SpringCloud Config 配置中心

Posted 橘子味儿的猫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloud Config 配置中心相关的知识,希望对你有一定的参考价值。

 

 

 

Config 简介

分布式系统中,由于服务数量非常多,配置文件分散在不同微服务项目中,管理极其不方便。为了方便配置文件集中管理,需要分布式配置中心组件。在Spring Cloud中,提供了Spring Cloud Config,它支持配置文件放在配置服务的本地,也支持配置文件放在远程仓库Git(GitHub、码云)。配置中心本质上是一个微服务,同样需要注册到Eureka服务中心!

一句话概括:统一管理所有微服务配置文件的一个微服务

配置中心,也是一个微服务,需要注册到注册中心

【配置中心的架构图】

 

配置中心整合步骤

  1. 配置文件集中放在码云

  2. 配置中心获取码云配置文件

  3. 用户服务获取配置中心文件

 

Git配置管理

远程Git仓库

  • 知名的Git远程仓库有国外的GitHub和国内的码云(gitee);

  • GitHub主服务在外网,访问经常不稳定,如果希望服务稳定,可以使用码云;

  • 码云访问地址:http://gitee.com

 

创建远程仓库

  1. 首先使用码云上的git仓库需要先注册账户

  2. 账户注册完成,然后使用账户登录码云控制台并创建公开仓库

  3. 配置仓库 名称和路径

 

创建配置文件

1. 在新建的仓库中创建需要被统一配置管理的配置文件

 

  • 配置文件的命名方式:{application}-{profile}.yml或{application}-{profile}.properties

  • application为应用名称

  • profile用于区分开发环境dev,测试环境test,生产环境pro等

    • 开发环境 user-dev.yml

    • 测试环境 user-test.yml

    • 生产环境 user-pro.yml

 

2. 将user-service工程里的配置文件application.yml内容复制作为user-dev.yml文件内容

 

3. 创建完user-dev.yml配置文件之后,gitee中的仓库如下:

搭建配置中心微服务

实现步骤:

  1. 创建配置中心SpringBoot项目config-server

  2. 勾选Starter:配置中心,Eureka客户端

  3. 在启动引导类上加 @EnableConfigServer 注解

  4. 修改配置文件:端口,应用名称,注册中心地址,码云仓库地址

  5. 启动测试,测试配置文件实时同步

实现过程:

 

1. 创建配置中心SpringBoot项目config-server

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.1.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.zyu</groupId>
    <artifactId>config-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>config-service</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <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-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <!--SpringCloud所有依赖管理的坐标-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

 

3. 启动类:创建配置中心工程config-server的启动类ConfigServerApplication

@SpringBootApplication
@EnableDiscoveryClient//开启Eureka客户端发现功能
@EnableConfigServer //开启配置服务支持
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class,args);
    }
}

 

4. 配置文件:创建配置中心工程config-server的配置文件application.yml

server:
  port: 12000

spring:
  # 应用名称
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/zyulike/zyu-spring-cloud-config.git

# 注册中心地址
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
  • 注意:上述spring.cloud.config.server.git.uri是在码云创建的仓库地址

5. 启动测试:启动eureka注册中心和配置中心;

  • 访问http://localhost:12000/user-dev.yml查看能否输出码云存储管理的user-dev.yml文件
  • 并且可以在gitee上修改user-dev.yml,然后刷新上述测试地址也能及时更新数据

 

服务去获取配置中心配置

关于application.yml和bootstrap.yml文件的说明:
  • bootstrap.yml文件是SpringBoot的默认配置文件,而且其加载时间相比于application.yml更早。
  • bootstrap.yml和application.yml都是默认配置文件,但定位不同
    • bootstrap.yml相当于项目启动的引导文件
    • application.yml文件是微服务的常规配置参数,变化比较频繁
  • 搭配spring-cloud-config使application.yml的配置可以动态替换。

目标:改造user-service工程,配置文件不再由微服务项目提供,而是从配置中心获取。

实现步骤:

  1. 在user-service服务中,添加Config的starter依赖

  2. 删除application.yml配置文件,新增bootstrap.yml配置文件

  3. 配置bootstrap.yml配置文件:

    • 配置中心相关配置(配置文件前缀、后缀,仓库分支,是否开启配置中心)

    • 注册中心地址

  4. 启动服务,测试效果

实现过程:

 

1. 添加依赖

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

2. 修改配置

  • 删除user-service工程的application.yml文件

  • 创建user-service工程bootstrap.yml配置文件,配置内容如下

# 注册中心地址
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
# 配置中心相关配置
# 使用配置中心
spring:
  cloud:
    config:
      discovery:
        enabled: true
        service-id: config-server    # 配置中心服务id
      name: user  # 与远程仓库中的配置文件的application和profile保持一致,{application}-{profile}.yml
      profile: dev
      label: master   # 远程仓库中的分支保持一致

启动测试:

  • 依次启动:注册中心、配置中心、用户中心user-service

 

  • 如果启动没报错,其实已经使用上配置中心内容了

  • 可以在服务中心查看也可以检验user-service的服务

 

配置中心存在的问题

复现问题步骤:

1. 修改远程Git配置

  • 修改在码云上的user-dev.yml文件,添加一个属性test.name

 

 2. 修改UserController

@RestController
@RequestMapping("/user")
public class UserController {

    @Value("${server.port}")
    private String port;

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

    @Autowired
    UserService userService;

    //根据id查询
    @RequestMapping("/findById")
    public User findById(Integer id) {
        System.out.println("服务【"+port+"】被调用");
        User user = userService.findById(id);
        user.setNote("服务【"+port+"】被调用");
        user.setName(name);
        return user;
    }
}

测试:

  • 依次启动Eureka,配置中心,用户微服务;

  • 访问用户微服务,查看输出内容。我们修改的user-dev.yml并没有发生立即发生变化。但是配置中心的配置文件内容发生了变化。

 

 结论:通过浏览器输出结果发现,我们对于Git仓库中的配置文件的修改,并没有及时更新到user-service微服务,只有重启用户微服务才能生效。

==SpringCloud Bus,解决上述问题,实现配置自动更新。==

 

以上是关于SpringCloud Config 配置中心的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud集成Config分布式配置中心

SpringCloud Config 配置中心

springcloud应用配置中心config的安全设置

springcloud-config配置中心初级篇

springcloud config配置中心

SpringCloud分布式配置中心Config