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>
<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:
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
profiles:
active: native
cloud:
config:
server:
native:
search-locations: classpath:/config/
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
file-path-dev.yml
logoPath: /data/dev/upload/logo
file-path-prod.yml
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上
application.yml 增加config的git配置
server:
port: 3344
spring:
application:
name: cloud-config-center
cloud:
config:
server:
git:
uri: https://gitee.com/shouanzh/spring-cloud-config
username: git 账号
password: git 密码
default-label: master
search-paths: config
force-pull: true
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
name: kernel-system,file-path
profile: ${spring.profiles.active}
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:
label: master
name: kernel-system
profile: dev
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刷新
再次访问
值已经改变
|