目录:
- 1.分布式架构面临的问题
- 2.Spring Cloud Config是什么
- 3.Spring Cloud Config能做什么
- 4.Spring Cloud Config服务端配置
- 5.Spring Cloud Config客户端配置
- 6.Spring Cloud Config客户端动态刷新
1.分布式架构面临的问题
微服务意味着要将单体应用中的业务拆分成一个个的子服务,每个服务的力度相对较小,因此一个系统中会出现大量的服务。而每个服务都必须要必要的配置信息才能运行,所以一套集中式的,动态配置管理设施是必不可少的。Springcloud提供了ConfigServer来解决这个问题。
2.Spring Cloud Config是什么
Spring Cloud Config 为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供一个中心化的外部配置。
它分为服务端和客户端两部分。
服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口。
客户端则通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。服务器存储后端的默认实现使用git,这样有助于对环境配置进行版本管理,可以通过git客户端工具来方便管理和访问配置内容。
3.Spring Cloud Config能做什么
- 集中管理配置文件
- 不同环境不同配置,动态化配置更新,分环境部署 如 dev,test,prod等
- 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息
- 配置变动,服务不需要重启
- 将配置信息以REST接口的形式暴漏
4.Spring Cloud Config服务端配置
Ⅰ.在父工程下,新建Module : cloud-config-center-3344
Ⅱ.引入相关依赖:
<dependencies>
<!--config-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--boot web actuator-->
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
Ⅲ.application.yml 配置文件
server:
port: 3344
spring:
application:
name: cloud-config-center
cloud:
config:
server:
git:
uri: https://gitee.com/chun4/springcloud-config.git #仓库名称
search-paths: #搜索目录
springcloud-config
label: master #读取分支
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka
Ⅳ.主启动类
@SpringBootApplication
@EnableConfigServer
public class ConfigCenterMain3344 {
public static void main(String[] args) {
SpringApplication.run(ConfigCenterMain3344.class,args);
}
}
码云里springcloud-config下有两个配置
启动,访问测试:
读取规则:
/ {application} / {profile} [/ {label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
label 分支 application服务名 profile环境
5.Spring Cloud Config客户端配置
Ⅰ.在父工程下,新建Module : cloud-config-client-3355
Ⅱ.引入相关依赖:
<dependencies>
<!-- Starter-Config 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--boot web actuator-->
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
Ⅲ.bootstrap.yml 配置文件(bootstrap.yml在应用上下文启动阶段加载,优先级高)
server:
port: 3355
spring:
application:
name: cloud-config-client
cloud:
config: #客户端配置
lable: master #分支名称
name: config #配置文件名称
profile: dev #读取后缀名称
uri: http://localhost:3344 #配置中心地址
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka
Ⅳ.主启动类
@SpringBootApplication
@EnableEurekaClient
public class ConfigClientMain3355 {
public static void main(String[] args) {
SpringApplication.run(ConfigClientMain3355.class,args);
}
}
Ⅴ.控制器
@RestController
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/getConfigInfo")
public String getConfigInfo(){
return configInfo;
}
}
启动访问测试:
6.Spring Cloud Config客户端动态刷新
前面的效果存在一些问题
我们改了配置之后,3344可以同步刷新,客户端3355不能同步,只能重启服务才会刷新,如何解决这个尼?
3355的yml增加如下配置,暴漏监控端口:
management:
endpoints:
web:
exposure:
include: "*"
控制层加@RefreshScope
@RestController
@RefreshScope
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/getConfigInfo")
public String getConfigInfo(){
return configInfo;
}
}
重启测试:
你会发现,白加那么多,卵用没有,甚至这个gif都是和上面一样!
其实这个时候需要使用 curl -X POST “http://localhost:3355/actuator/refresh” 手动刷新一下
虽然不能完全实现全自动刷新,但是现在起码不用重启服务了,想实现全自动刷新,需要借助Springcloud Bus消息总线,下编文章可能会讲到。