分布式配置中心——Config
概述
前言
- 由于微服务架构提倡将项目划分为很多细粒的小服务,每个小服务都有一个application.yml
- 对于一个具体的服务,应根据业务上下文,选择合适的语言,工具进行构建
- 综上,可以有一个非常 轻量级的集中式管理 来协调这些服务
是什么?
- 架构图
将配置文发布到github或者码云上,客户端从config server请求配置文件,config server从github或者码云获取配置文件 - SpringCLoud为微服务架构中的微服务提供集中化的外部配置支持,config server为 各个不同的微服务应用 提供一个 中心化的外部配置
Config的组成
- 分成服务端和客户端两部分
- 服务端也称为 分布式配置中心 ,是一个 独立的微服务应用 ,用来连接配置服务器并为客户端提供获取配置信息,加密/解密等访问接口
- 客户端通过指定的配置中心管理应用资源,以及与业务相关的配置内容,在启动的时候从配置中心获取配置信息
Config Server的配置
在github或者gitee上创建配置的Repository
-
新建 appication.yml ,注意文件的编码格式需要保存为 UTF-8 格式
spring: profiles: active: - dev --- spring: profiles: dev application: name: springcloud-config-abor-dev --- spring: profiles: test application: name: springcloud-config-abor-test
注意两种环境的服务名称不一样
构建ConfigServer项目(springcloud-config-3344)
POM.XML
<!-- springCloud Config -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
application.yml
server:
port: 3344
spring:
application:
name: springcloud-config
cloud:
config:
server:
git:
uri: https://gitee.com/Abor/SpringCloud_Study_Config.git
主启动类
@SpringBootApplication
@EnableConfigServer
public class Config_3344_App {
public static void main(String[] args) {
SpringApplication.run(Config_3344_App.class,args);
}
}
修改hosts
127.0.0.1 config-3344.com
测试
- 启动3344项目
- 分别访问 http://config-3344.com:3344/application-dev.yml 和 http://config-3344.com:3344/application-test.yml ,两者的name属性是不一样的
配置读取规则
- /{application}-{profile}.yml
- http://config-3344.com:3344/application-dev.yml
- http://config-3344.com:3344/application-test.yml
- http://config-3344.com:3344/application-xxx.yml(不存在的配置)
- /{application}/{profile}[/{label}]
- http://config-3344.com:3344/application/dev/master
- http://config-3344.com:3344/application/test/master
- http://config-3344.com:3344/application/xxx/master
- /{label}/{application}-{profile}.yml
- http://config-3344.com:3344/master/application-dev.yml
- http://config-3344.com:3344/master/application-test.yml
客户端的配置
在github上创建配置文件
- 注意不同的环境下(dev/test)端口号是不一样的,eureka server的地址也是不一样的
spring:
profiles:
active:
- dev
---
server:
port: 8201
spring:
profiles: dev
application:
name: springcloud-config-client
eureka:
client:
service-url:
defaultZone: http://eureka-dev.com:7001/eureka/
---
server:
port: 8202
spring:
profiles: test
application:
name: springcloud-config-client
eureka:
client:
service-url:
defaultZone: http://eureka-test.com:7001/eureka/
构建Client项目
POM.XML
<!-- springCloud Config -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config</artifactId>
</dependency>
application.yml
spring:
application:
name: springcloud-config-client
bootstrap.yml
- 是系统级的资源配置项,优先级更高
- application.yml是用户级的
- springcloud会创建Bootstrap Context作为Application上下文
spring:
cloud:
config:
name: springcloud-config-client
profile: dev
label: master
uri: http://config-3344.com:3344
- 注意 name属性就是文件的名称
修改hosts
127.0.0.1 client-config.com
添加一个controller便于测试
@RestController
public class ConfigClientRest {
@Value("${spring.application.name}")
private String applicationName;
@Value("${eureka.client.service-url.defaultZone}")
private String eurekaServers;
@Value("${server.port}")
private String port;
@GetMapping("/config")
public String config(){
String str="applicationName:"+applicationName+"\t eurekaSevers:"+eurekaServers+"\t port:"+port;
System.out.println(str);
return str;
}
}
测试
- 启动3344 Config Server
- 启动3355 Config Client,可以看到Client已经启动在了8201端口,说明成功的从Config Server获取到了配置信息
- 访问http://client-config.com:8201/config,可以获得Controller中获取到的信息