1.git准备工作
新建个git项目:https://gitee.com/xxx/spring-cloud.git
master分支下建三个文件:
config-dev.yml
config:
info: "config info for dev(master)"
config-prod.yml
config:
info: "config info for prod(master)"
config-test.yml
config:
info: "config info for test(master)"
dev分支下建三个文件:
config-dev.yml
config:
info: "config info for dev(dev)"
config-prod.yml
config:
info: "config info for prod(dev)"
config-test.yml
config:
info: "config info for test(dev)"
2.Config服务器
<properties>
<spring.cloud-version>Hoxton.SR8</spring.cloud-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-security</artifactId>
<version>2.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</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>
server:
port: 8901
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://gitee.com/xxx/spring-cloud.git
#username: aaa
#password: bbb
clone-on-start: true
#search-paths: 'config'
security:
user:
name: root
password: 123456
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:8761/eureka/
@EnableConfigServer
@SpringBootApplication
public class ConfigApp {
public static void main(String[] args) {
new SpringApplicationBuilder(ConfigApp.class).web(WebApplicationType.SERVLET).run(args);
}
}
为什么要添加spring-boot-starter-security并在yml里配置账户密码,因为作为配置中心,是针对服务内部的,一定要保证安全
启动之后访问:
http://localhost:8901/master/config-dev
输入账户密码
{"name":"master","profiles":["config-dev"],"label":null,"version":"09dca135f5a242bf0f7cbb46ba1872d1ea10488e","state":null,"propertySources":[]}
再访问http://localhost:8901/master/config-dev.yml就会发现配置文件出来了。
config:
info: "config info for dev(master)"
这个访问的路径的格式是什么?
# 获取配置信息
/{label}/{application}-{profile}
# 获取配置文件信息
/{label}/{application}-{profile}.yml
占位符相关解释
application:代表应用名称,默认为配置文件中的spring.application.name,如果配置了spring.cloud.config.name,则为该名称;
label:代表分支名称,对应配置文件中的spring.cloud.config.label;
profile:代表环境名称,对应配置文件中的spring.cloud.config.profile。
也可以访问http://localhost:8901/dev/config-prod.yml等
3.Config-client模块
3.1基本功能
<properties>
<spring.cloud-version>Hoxton.SR8</spring.cloud-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</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>
<version>2.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</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>
bootstrap.yml
server:
port: 9001
spring:
application:
name: config-client
cloud:
config:
label: master
profile: dev
name: config
#uri: http://localhost:8901
username: root
password: 123456
discovery:
enabled: true
service-id: config-server
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:8761/eureka/
@RestController
@SpringBootApplication
public class ConfigCliApp {
public static void main(String[] args) {
new SpringApplicationBuilder(ConfigCliApp.class).web(WebApplicationType.SERVLET).run(args);
}
@Value("${config.info}")
private String configInfo;
@GetMapping("/configInfo")
public String getConfigInfo() {
return configInfo;
}
}
注意:
- 客户端的启动yml不是application.yml,而是bootstrap.yml.bootstrap.yml是在引导的时候读取,而application.yml是之后参数赋值读取.这里需要在引导的时候启动config.
- spring.cloud.discovery代替了spring.cloud.uri.他比uri要好,虽然uri明确指定config服务器.但是config服务器肯定不能只启动一个,它必须启动多个来面对灾难.那么指定单一的uri是没有什么用处的.应当指定服务id进行负载均衡.
启动好之后我们访问:http://localhost:9001/configInfo 就可以master分支的config-dev.yml里的内容配置
3.2刷新配置
如果git文件更新了,那么客户端也同样需要做些刷新操作来更新.
要添加actuator的refresh模块.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
management:
endpoints:
web:
exposure:
include: 'refresh'
给@Value类里添加一个@RefreshScope注解
@RefreshScope
@RestController
@SpringBootApplication
public class ConfigCliApp {
public static void main(String[] args) {
new SpringApplicationBuilder(ConfigCliApp.class).web(WebApplicationType.SERVLET).run(args);
}
@Value("${config.info}")
private String configInfo;
@GetMapping("/configInfo")
public String getConfigInfo() {
return configInfo;
}
}
每当git文件改变时,使用post方法,访问client的http://localhost:9001/actuator/refresh 就可以执行刷新.注意,是post不是get
集群
更换端口启动多个即可