文章目录
- 分布式系统面临的配置问题
- SpringCloud Config 能干嘛
- SpringCloud Config 是什么
- SpringCloud Config 怎么用
- Config 服务端搭建(配置总控中心搭建)
- Config 客户端搭建(客户端自己在 Config 服务端上获取,服务端获取的 github 上的配置属性)
- SpringCloud Config 客户端开启动态刷新(避免每次更新配置都要重启所有的客户端微服务)
分布式系统面临的配置问题
微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。
SpringCloud 提供了 ConfigServer 来解决这个问题,我们每个微服务自 己带着一个 application.ymI,上百个配置文件的管理及其繁杂… .
SpringCloud Config 能干嘛
- 集中管理配置文件
- 不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release
- 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息
- 当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置
- 将配置信息以REST接口的形式暴露
SpringCloud Config 是什么
SpringCloud Config 是一个分布式配置中心。
SpringCloud Config 为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。
SpringCloud Config 分为服务端和客户端两部分。
服务端也称为分布式配置中心,它是一个独立的微服务应用,来连接配置服务器并为客户端提供获取配置信息、加密/解密信息等访问接口。
客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息配置服务器默认采用 git 来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过 git 客户端工具来方便的管理和访问配置内容。
SpringCloud Config 怎么用
由于 SpringCloud Config 默认使用 Git 来存储配置文件(也有其它方式,比如支持 svn 和本地文件,但最推荐的还是 Git,而且使用的是 http/https 访问的形式),所以这里默认是使用 github 来做配置文件的存放地址
Config 服务端搭建(配置总控中心搭建)
- 用你自己的账号在 Github 上新建一个名为 sprincloud-config 的新 Repository
- 获得新建的地址如:git@github.com:chenJiongH/springcloud-config.git
- 克隆 github 仓库到本地添加多环境下的配置文件信息并提交,或者直接在 github 上添加配置文件
- 新建服务端工程,假设工程端口为 3344,该工程是Config的服务端工程,用来从 github 上获取配置内容
- 服务端工程的 POM 文件依赖:
<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>com.atguigu.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<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>
</project>
- 填写 yml 文件
server:
port: 3344
spring:
application:
name: cloud-config-center
cloud:
config:
server:
git:
uri: 填写你自己的github路径
search-paths:
- springcloud-config
label: master # 表示默认拉取 master 分支
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
- 写主启动类,在主启动类上添加注解:@EnableConfigServer
- 测试通过 Config 微服务是否可以从 GitHub 上获取配置内容:
http://localhost:3344/master/config-dev.yml
Config 客户端搭建(客户端自己在 Config 服务端上获取,服务端获取的 github 上的配置属性)
- 新建 Config 客户端工程,假设端口号为 3355
- POM 文件
<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>com.atguigu.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<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>
</project>
- 使用 bootstra.yml 配置文件。(bootstrap.yml 配置文件有更高的优先级)
server:
port: 3355
spring:
application:
name: config-client
cloud:
# Config 客户端配置
config:
label: master # 指定分支名称
name: config # 读取 github 上的配置文件的文件名称
profile: dev # 读取 github 上的配置文件的后缀名称 上述3个综合:master 分支上 config-dev.yml 的配置文件被读取 http://localhost:3344/master/config
uri: http://localhost:3344
# Eureaka 注册中心
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
- 业务类(直接获取 github 上配置文件的配置)
@RestController
public class ConfigClientController {
@Value("${config.info}") // 这个配置并不在本工程的 bootstrap.yml 配置文件中,它存在于 github 上的配置文件中。而 Config 的服务端能够获取到这个配置信息,所以 Config 的客户端可以从 Config 的服务端获取到该配置
private String configInfo;
@GetMapping("/configInfo") // 浏览器发送这个请求,如果能够返回 configInfo 的信息,证明客户端也能够获取到 github 上的配置信息。
public String getConfigInfo(){
return configInfo;
}
}
- 测试
- 启动 Config 服务端获取配置文件信息:http://localhost:3344/master/config-dev.yml
- 启动 Config 客户端获取配置文件信息:http://localhost:3355/configInfo
此时客户端请求 http://localhost:3355/configInfo 也能返回 github 上的配置信息,说明客户端成功从服务端拿到了github上的配置。
当前的缺陷:分布式配置的动态刷新。即如果 Linux 运维修改对 GitHub 上的配置文件内容做了调整。刷新 3344 工程,发现 ConfigServer 配置中心立刻响应,获取到了新值。刷新3355,发现 ConfigServer 客户端没有任何响应。3355没有变化除非自己重启或者重新加载,这样仍然是每修改一个配置,都需要重启所有的服务。
SpringCloud Config 客户端开启动态刷新(避免每次更新配置都要重启所有的客户端微服务)
使用消息总线 SpringCloud Bus 可以开启广播,一次通知,处处生效。