Spring Cloud Config
繁多的微服务配置:
- 硬编码(需要修改代码、繁琐、风险大)
- properties 或者 yml(集群环境下需要替换和重启)
- xml(重新打包和重启)
为此使用Spring Cloud Config集中式的配置管理中心,用来实现微服务系统中服务配置的统一管理。
spring cloud config 分为服务端和客户端两部分。
服务端也称为 分布式配置中心 ,是一个特殊的微服务,集中管理配置文件,提供配置文件的存储,用于连接配置服务器,并给客户端提供配置信息、加密、解密的访问接口。
客户端是各个微服务,在启动时通过服务端提供的接口从配置中心获取和加载数据(配置信息),并依据拉取的配置信息初始化自己的应用。
Spring Cloud Config 工作流程
工作流程:微服务即 各个微服务 到服务端(config Server )获取配置文件,服务端到远端仓库获取配置。
服务端(config Server )也是一个微服务,如果将配置全都放到服务端(config Server ),当放生版本改动时,整个小集群都要改。因此,可以将所有微服务的配置统一放到 git 远程仓储上进行版本管理。config Server 只需要配置 git 远程仓储地址,在 config Server 启动时候,config Server 会到 git 远程仓储上进行拉取配置到本地仓储,启动后如果远程仓储的配置有改动,则 config Server 会自动检测到远程仓储的配置改动,进行自
动拉取最新配置。其他微服务即config client 可以通过 config Server 获取所需配置信息。
服务端配置远程仓库规则:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
label代表分支,profile代表环境,application默认是应用程序,默认是application
案例
服务端:
1.pom依赖
<dependencies>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--config-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<!--eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
</dependencies>
2.application.yml配置文件
server:
port: 3344
spring:
application:
name: springcloud-config-server
# 连接码云远程仓库
cloud:
config:
server:
git:
# 注意是https的而不是ssh
uri: https://gitee.com/cao_shi_peng/springcloud-config.git
# 通过 config-server可以连接到git,访问其中的资源以及配置~
# 不加这个配置会报Cannot execute request on any known server 这个错:连接Eureka服务端地址不对
# 或者直接注释掉eureka依赖 这里暂时用不到eureka
eureka:
client:
register-with-eureka: false
fetch-registry: false
3.主启动类
@EnableConfigServer // 开启spring cloud config server服务
@SpringBootApplication
public class Config_server_3344 {
public static void main(String[] args) {
SpringApplication.run(Config_server_3344.class,args);
}
}
客户端:
pom依赖
<!--config-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-start -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
bootstrap.yml 是系统级别的配置
# 系统级别的配置
spring:
cloud:
config:
name: config-client # 需要从git上读取的资源名称,不要后缀
profile: dev
label: master
uri: http://localhost:3344
application.yml 是用户级别的配置
# 用户级别的配置
spring:
application:
name: springcloud-config-client
controller
@RestController
public class ConfigClientController {
@Value("${spring.application.name}")
private String applicationName; //获取微服务名称
@Value("${eureka.client.service-url.defaultZone}")
private String eurekaServer; //获取Eureka服务
@Value("${server.port}")
private String port; //获取服务端的端口号
@RequestMapping("/config")
public String getConfig(){
return "applicationName:"+applicationName +
"eurekaServer:"+eurekaServer +
"port:"+port;
}
}
主启动类
@SpringBootApplication
public class ConfigClient {
public static void main(String[] args) {
SpringApplication.run(ConfigClient.class,args);
}
}
测试:先启动服务端Config_server_3344 再启动客户端ConfigClient
访问:http://localhost:8201/config/