SpringCloud Config 分布式配置中心
SpringCloud Config 分布式配置中心
分布式系统面临的配置问题:微服务意味着将单体应用拆分成一个个自服务,这些服务都是要相应的配置信息才能运行,
随着系统内微服务数量越来越多,配置信息也不断地增多,所以一套集中式的、动态的配置管理设施是必不可少的。
概述:
- SpringCloud Config是一个提供外部集中式配置管理的设施,配置服务器为各种不同的额微服务应用提供了一个中心化的 外部配置
- SpringCloud Config分为客户端和服务端两部分
SpringCloud Config解决的问题:
1. 集中管理配置文件
2. 不同环境不同配置,动态化的配置更新,分环境部署比如:dev/test/prod/beta/release
3. 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,让服务中心统一为服务拉取配置文件
4. 当配置发生变动时,服务不需要重启即可感知配置变化并应用
5. 将配置信息以REST接口形式暴露
客户端:
通过指定的配置中心获取配置资源,cloud推荐用git来存储配置信息。
【SpringCloud Config架构图】:
SpringCloud Config服务端与Github通讯实现:
目标:将配置文件部署在github,Config服务端从github获取配置。
实现步骤:
1. 新建Config Server模块(服务端 )并配置pom.xml;
<dependencies>
<!-- springCloud Config -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!-- 图形化监控 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 熔断 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</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-jetty</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-test</artifactId>
</dependency>
<!-- 热部署插件 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
2. 建立远程仓库,并上传配置文件。(配置文件必须是utf-8编码)如下例子【application.yml】;
spring:
profiles:
active:
- dev
---
spring:
profiles: dev
application:
name: springcloud-config-server-dev
---
spring:
profiles: test
application:
name: springcloud-config-server-test
3. 在application.yml文件中配置github地址;
server: port: 6002 spring: application: name: springcloud-config-server cloud: config: server: git: uri: https://github.com/xxxyyyzzz09/repo_1.git #GitHub上面的git仓库名字
4. 编写主启动类,加入@EnableConfigServer注解;
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@EnableConfigServer
public class Config_Server_6002_App
{
public static void main(String[] args)
{
SpringApplication.run(Config_Server_6002_App.class, args);
}
}
5. 启动服务并尝试访问配置文件,有以下五种访问配置规则;
- {application}:配置文件的文件名
- {profile}:读取的环境
- {lable}:分支
1. /{application}/{profile}[/{lable}]
2. /{application}-{profile}.yml
3. /{lable}/{application}-{profile}.yml
4. /{application}-{profile}.properties
5. /{lable}/{application}-{profile}.properties
6.根据上面的规则,可访问链接:http://localhost:6002/application-dev.yml即可获得配置文件中的【dev】配置;
测试配置中心服务端是否能获取到GitHub上的配置信息:
bootstrap.yml介绍:
- bootstrap.yml比application.yml具有更高的优先级。
- bootstrap.yml是系统级的资源配置项,application.yml是用户级的资源配置项。
- SpringCloud会创建"BootStrap Context"作为"ApplicationContext"的【父上下文】。初始化的时候BootStrap Context 负责从外部源加载配置属性并解析。这两个上下文共享一个"Environment",BootStrap 具有更高优先级,他们不会被本地配置覆盖。
SpringCloud Config客户端的配置实现与测试:
介绍:客户端主要是在【加载时】通过config server服务端获得github配置仓库的地址,进而通过目标配置文件的文件名获取相应的配置,最后将取得的配置对自身资源进行赋值并提供访问;
实现过程如下:
1.创建远程配置yml文件并上传到github上。如下测试案例因为需要进行测试,所以配置了两个profiles【dev与test】方便切换并观察;
spring:
profiles:
active:
- dev
---
server:
port: 8201
spring:
profiles: dev
application:
name: springclouddemo-provider-dept-config-client-dev
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
---
server:
port: 8202
spring:
profiles: test
application:
name: springclouddemo-provider-dept-config-client-test
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
2. 本地创建【springclouddemo-config-client-6003】模块,并配置好pom.xml,【spring-cloud-starter-config】是必选依赖;
<dependencies>
<!-- SpringCloud Config客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!--其他依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</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-jetty</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-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
3.编写bootstrap.yml配置文件,这个步骤比较关键,主要是根据此处的配置信息去寻找config server以获得github仓库地址和配置中的目标配置文件文件名;
spring:
cloud:
config:
name: application #需要从github上读取的资源文件名称,注意没有yml后缀名
profile: test #本次访问的配置项(dev或test)
label: master #git分支名称
uri: http://127.0.0.1:6002 #通过之前创建的Config服务端获取GitHub的服务地址
4.application.yml文件在本module中其实是可写可不写的,因为配置会从配置中心中获取。为了习惯需要,还是给他写了个名字
spring:
application:
name: springcloud-config-client
5.编写主启动类;
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class ConfigClient_6003_App
{
public static void main(String[] args) {
SpringApplication.run(ConfigClient_6003_App.class, args);
}
}
6.编写controller,此步骤也比较关键,主要是利用@Value注解赋值,若写错了bootstrap.yml中的配置文件名称而没有获取到配置,启动时这里会抛出异常。@Value中注解的参数即是目标配置文件中的参数值,使用El表达式获取;
@RestController
public class ConfigClientController
{
@Value("${spring.application.name}")
private String applicationName;
@Value("${eureka.client.service-url.defaultZone}")
private String eurekaServers;
@Value("${server.port}")
private String port;
@RequestMapping("/config")
public String getConfig(){
String str = "applicationName: " + applicationName + "\t eurekaServers:" + eurekaServers + "\t port: " + port;
System.out.println("******str: " + str);
return "applicationName: " + applicationName + "\t eurekaServers:" + eurekaServers + "\t port: " + port;
}
7. 先启动config server服务,然后再启用本client服务,根据profiles的值访问对应的端口即可。
如本例选择的是test,则访问端口为:http://localhost:8202/config。(test配置的port为8202)
就会得到controller的结果了。
上一篇: Mac安装Homebrew 及 pip
下一篇: Mac安装brew软件、包管理工具
推荐阅读
-
spring cloud config 配置中心快速实现过程解析
-
跟我学SpringCloud | 第六篇:Spring Cloud Config Github配置中心
-
springcloud学习之路: (五) springcloud集成SpringCloudConfig分布式配置中心
-
Spring Cloud Config实现分布式配置中心
-
Nacos(四):SpringCloud项目中接入Nacos作为配置中心
-
SpringCloud之分布式配置中心Spring Cloud Config高可用配置实例代码
-
Spring Cloud Config 配置中心实践过程中,你需要了解这些细节!
-
Springcloud 2.x 版本 分布式配置中心
-
跟我学SpringCloud | 第七篇:Spring Cloud Config 配置中心高可用和refresh
-
SpringCloud微服务(06):Config组件,实现配置统一管理