分布式配置中心SpringCloud Config
快速入门
构建配置中心
构建 config-server 9012 项目
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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zk.springcloud.config</groupId>
<artifactId>springcloud-config</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springcloud-config</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</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-starter-test</artifactId>
<scope>test</scope>
</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>
</plugin>
</plugins>
</build>
</project>
启动类
@SpringBootApplication
@EnableConfigServer
public class SpringcloudConfigApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudConfigApplication.class, args);
}
}
配置文件
spring.application.name=config-server
server.port=9012
spring.cloud.config.server.git.uri=http://www.github.com/LJaer/zkTest.git
spring.cloud.config.server.git.search-paths=spring_cloud_in_action/config-repo
spring.cloud.config.server.git.username=username
spring.cloud.config.server.git.password=123456
配置规则详解
spring_cloud_in_action/config-repo 目录下创建四个文件
didispace.properties
didispace-dev.properties
didispace-test.properties
didispace-prod.properties
文件内容分别为
from=git-default-1.0
from=git-dev-1.0
from=git-test-1.0
from=git-prod-1.0
访问:http://localhost:9012/didispace/prod/master 返回
{"name":"didispace","profiles":["prod"],"label":"master","version":"921fa4b99b5b35d7aa48a4a1ab420895463c6e58","state":null,"propertySources":[{"name":"http://hcgit.hengchang6.com/zhangkai170308/zkTest.git/spring_cloud_in_action/config-repo/didispace-prod.properties","source":{"from":"git-prod-1.0"}},{"name":"http://hcgit.hengchang6.com/zhangkai170308/zkTest.git/spring_cloud_in_action/config-repo/didispace.properties","source":{"from":"git-default-1.0"}}]}
访问:http://localhost:9012/didispace-prod.properties 返回
from: git-prod-1.0
访问: http://localhost:9012/master/didispace-prod.properties 返回
from: git-prod-1.0
客户端配置映射
创建 config-client 9013 项目
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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zk.springcloud.config</groupId>
<artifactId>springcloud-config-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springcloud-config-client</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</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>
</plugin>
</plugins>
</build>
</project>
启动类
@SpringBootApplication
public class SpringcloudConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudConfigClientApplication.class, args);
}
}
配置文件需要命名为:bootstrap.properties
spring.application.name=didispace
server.port=9013
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.uri=http://localhost:9012/
访问:http://localhost:9013/from 获得 git-dev-1.0
Git 配置仓库
使用本地仓库,脱离 Git 服务端
spring.cloud.config.server.git.uri=file://${user.home}/config-repo
${user.home} 代表当前用户的所属目录
本地仓库
指定一个固定的位置存储
spring.cloud.config.server.git.basedir=
spring.cloud.config.server.svn.basedir=
属性覆盖
加载 config 9012 项目里
spring.cloud.config.server.overrides.name=didi
spring.cloud.config.server.overrides.from=shanghai
访问 http://localhost:9013/from 返回 shanghai
安全保护
config 9012 项目里添加 Spring Security 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
启动后打印,生成随机秘密吗
2018-10-10 10:59:52.727 INFO 53668 --- [ main] .s.s.UserDetailsServiceAutoConfiguration :
Using generated security password: e1815bf6-2207-4b48-8dcc-219a81c6c2aa
使用自定义密码
spring.security.user.name=user
spring.security.user.password=123456
客户端 config-client 配置如下
spring.cloud.config.username=user
spring.cloud.config.password=123456
服务化配置中心
config-server 9012 项目改造
添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
配置文件
eureka.client.service-url.defaultZone=http://localhost:9001/eureka/,http://localhost:9004/eureka/
启动类添加注解 @EnableDiscoveryClient
访问 http://localhost:9001/ 查看到 CONFIG-SERVER 已注册到 Eureka
config-client 9013 项目改造
添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
配置文件,在 bootstrap.properties
eureka.client.service-url.defaultZone=http://localhost:9001/eureka/,http://localhost:9004/eureka/
#直接访问配置中心
#spring.cloud.config.profile=dev
#spring.cloud.config.label=master
#spring.cloud.config.uri=http://localhost:9012/
eureka.client.service-url.defaultZone=http://localhost:9001/eureka/,http://localhost:9004/eureka/
#通过注册中心访问配置中心
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.service-id=CONFIG-SERVER
启动类添加注解 @EnableDiscoveryClient
访问 http://localhost:9001/ 查看到 DIDISPACE 已注册到 Eureka
访问 http://localhost:9013/from 可以获得 shanghai
失败快速响应与重试
当 config-server 9012 服务关闭下,config-client 失败快速响应
在 config-client 9013 配置文件 bootstrap.properties 添加如下配置
spring.cloud.config.fail-fast=true
在未配置该属性之前,不启动 config-server 9012 ,直接启动 config-client 9013 打印一堆其他加载内容和报错
2018-10-10 15:32:25.796 ERROR 52624 --- [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.testController': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'from' in value "${from}"
加上该属性后,重试,加载内容变少,快速响应失败
2018-10-10 15:34:39.677 ERROR 35584 --- [ main] o.s.boot.SpringApplication : Application run failed
java.lang.IllegalStateException: Could not locate PropertySource and the fail fast property is set, failing
重试
spring.cloud.config.fail-fast=true
该配置开启的前提下,客户端 config-client 9013 添加如下依赖
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
重启 config-client 9013 连接 config-server 失败后,会进行重试
可以自定义
#重试间隔时间,默认为 1000 毫秒
spring.cloud.config.retry.multiplier=
#下一次间隔的乘数,默认1.1
spring.cloud.config.retry.initial-interval=
#最大间隔时间,默认 2000 毫秒
spring.cloud.config.retry.max-interval=
#最大尝试次数,默认6
spring.cloud.config.retry.max-attempts=
动态刷新配置
Spring Cloud系列(二) 应用监控与管理Actuator
config-server 9012 配置文件注释,并且开启 actuator 下其他路径
#spring.cloud.config.server.overrides.name=didi
#spring.cloud.config.server.overrides.from=shanghai
management.endpoints.web.exposure.include=*
添加 pom 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
添加 @RefreshScope 注解
@RestController
@RefreshScope
public class TestController {
@Value("${from}")
private String from;
@GetMapping("/from")
public String from(){
return this.from;
}
}
访问 http://localhost:9013/from 获得 git-default-1.0
修改 git 上 git-default-1.0 为 git-default-2.0 ,再访问 http://localhost:9013/from 获得 git-default-1.0
POST 方式访问 http://localhost:9013/actuator/refresh 会返回 [“config.client.version”,“from”]
访问 http://localhost:9013/from 获得 git-default-2.0