SpringCloud配置中心

Spring Cloud Config

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

配置中心的架构图

Git配置管理

远程Git仓库

  • 知名的Git远程仓库有国外的GitHub和国内的码云(gitee);
  • GitHub主服务在外网,访问经常不稳定,如果希望服务稳定,可以使用码云;
  • 码云访问地址:http://gitee.com

测试地址:

https://gitee.com/skllll/config.git

创建远程仓库

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

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

1563278785689

配置仓库 名称和路径

1563278922857

创建配置文件

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

1563278978078

文件命名有规则:

配置文件的命名方式:{application}-{profile}.yml或{application}-{profile}.properties
application为应用名称
profile用于区分开发环境dev,测试环境test,生产环境pro等
开发环境 user-dev.yml
测试环境 user-test.yml
生产环境 user-pro.yml

创建一个user-provider-dev.yml文件

将user-provider工程里的配置文件application.yml内容复制进去。

1563279131699

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

1563279208501

搭建配置中心微服务

实现步骤:

1. 创建配置中心SpringBoot项目config_server
2. 配置坐标依赖
3. 启动类添加开启配置中心服务注解
4. 配置服务中心application.yml文件
5. 启动测试

实现过程:

(1)创建工程

工程坐标

<artifactId>config-server</artifactId>
<groupId>com.jwang</groupId>
<version>1.0-SNAPSHOT</version>

(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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud-parent</artifactId>
<groupId>com.jwang</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>config-server</artifactId>

<dependencies>
<!-- Eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--配置中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>
</project>

(3)创建启动类

config-server工程中创建启动类com.jwang.ConfigServerApplication,代码如下:

@SpringBootApplication
@EnableDiscoveryClient//开启Eureka客户端发现功能
@EnableConfigServer//开启配置服务支持
public class ConfigServerApplication {

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

(4)application.yml配置文件

# 注释版本
server:
port: 18085 # 端口号
spring:
application:
name: config-server # 应用名
cloud:
config:
server:
git:
# 配置gitee的仓库地址
uri: https://gitee.com/skllll/config.git
# Eureka服务中心配置
eureka:
client:
service-url:
# 注册Eureka Server集群
defaultZone: http://127.0.0.1:7001/eureka
# com.jwang 包下的日志级别都为Debug
logging:
level:
com: debug

注意:上述spring.cloud.config.server.git.uri是在码云创建的仓库地址

(5)测试

启动config-server,访问<http://localhost:18085/user-provider-dev.yml>,效果如下:

1563276201436

可以查看到码云上的文件数据,并且可以在gitee上修改user-dev.yml,然后刷新上述测试地址也能及时更新数据

服务去获取配置中心配置

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

实现步骤:

1. 添加配置中心客户端启动依赖
2. 修改服务提供者的配置文件
3. 启动服务
4. 测试效果

实现过程:

(1)添加依赖

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

(2)修改配置

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

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

# 注释版本
spring:
cloud:
config:
name: user-provider # 与远程仓库中的配置文件的application保持一致,{application}-{profile}.yml
profile: dev # 远程仓库中的配置文件的profile保持一致
label: master # 远程仓库中的版本保持一致
discovery:
enabled: true # 使用配置中心
service-id: config-server # 配置中心服务id
#向Eureka服务中心集群注册服务
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:7001/eureka

关于application.yml和bootstrap.yml文件的说明:

- bootstrap.yml文件是SpringBoot的默认配置文件,而且其加载时间相比于application.yml更早。
- bootstrap.yml和application.yml都是默认配置文件,但定位不同
- bootstrap.yml可以理解成系统级别的一些参数配置,一般不会变动
- application.yml用来定义应用级别的参数
- 搭配spring-cloud-config使用application.yml的配置可以动态替换。
- bootstrap.yml相当于项目启动的引导文件,内容相对固定
- application.yml文件是微服务的常规配置参数,变化比较频繁

启动测试:

启动服务中心、配置中心、用户中心user_service1558275102243

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

可以在服务中心查看也可以检验user_service的服务1558275137843

配置中心存在的问题

(1)修改码云配置文件

修改在码云上的user-provider-dev.yml文件,添加一个属性test.message,如下操作:

1563276549136

(2)读取配置文件数据

user-provider工程中创建一个com.jwang.controller.LoadConfigController读取配置文件信息,代码如下:

@RestController
@RequestMapping(value = "/config")
public class LoadConfigController {

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

/***
* 响应配置文件中的数据
* @return
*/
@RequestMapping(value = "/load")
public String load(){
return msg;
}
}

启动运行user-provider,访问<http://localhost:18081/config/load>

1563276955927

修改码云上的配置后,发现项目中的数据仍然没有变化,只有项目重启后才会变化。

小结

  • 配置中心的作用:将各个微服务的配置文件集中到一起进行统一管理。

  • 能搭建配置中心

    需要在application.yml配置文件中指定需要远程更新的仓库地址。
  • 修改微服务,从配置中心获取修改的配置

    创建bootstrap.yml,并在bootstrap.yml中配置
    # 注释版本
    spring:
    cloud:
    config:
    name: user-provider # 与远程仓库中的配置文件的application保持一致,{application}-{profile}.yml
    profile: dev # 远程仓库中的配置文件的profile保持一致
    label: master # 远程仓库中的版本保持一致
    discovery:
    enabled: true # 使用配置中心
    service-id: config-server # 配置中心服务id
    #向Eureka服务中心集群注册服务
    eureka:
    client:
    service-url:
    defaultZone: http://127.0.0.1:7001/eureka