一、概述
1.1、spring cloud config介绍
1、 Spring Cloud Config项目是一个解决分布式系统的配置管理方案。它包含了Client和Server两个部分,server提供配置文件的存储、以接口的形式将配置文件的内容提供出去,client通过接口获取数据、并依据此数据初始化自己的应用。
2、 为什么要使用spring cloud config :
- 传统的配置不方便统一维护:比如两个程序员都更改了工程配置,都上传到Git,这样我们就看不到他们的提交记录了并且这样做配置冲突严重、不利于后期的维护
- 配置内容的安全和权限性决定我们必须统一管理我们的配置
- 解决传统更新配置需要重启的问题
3、 作用:Spring Cloud Config具有中心化、版本控制、支持动态更新和语言独立等特性
- 提供服务端和客户端支持(Spring Cloud Config Server和Spring Cloud Config Client);
- 集中式管理分布式环境下的应用配置;
- 基于Spring环境,实现了与Spring应用无缝集成;
- 可用于任何语言开发的程序;
- 默认实现基于Git仓库(也支持SVN),从而可以进行配置的版本管理;
1.2、以上一节的项目为基础:创建一个config的微服务子模块
1.3、config配置管理结构图
1.4、config-server pom文件
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>
1.5、config-server配置
server:
port: 8083
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
spring:
application:
name: config-server
二、实战操作
2.1、config server使用
1、在config-server启动类上配置@EnableConfigServer标签
@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
2、在远程仓库创建文件存放config-server的配置
3、修改config-server的配置
4、先启动注册中心,再启动config-server微服务
- 也可以json格式访问,即后缀名是:XXX.json;后缀名是什么格式就以什么格式的数据返回
5、远程Git仓库新建一个test.yml配置文件
6、通过config-server微服务访问test.yml配置文件
- 但是我们发现:http://localhost:8080/test-b.yml 或者是 http://localhost:8080/test-{任意路径值}.yml 的格式可以访问
7、配置文件访问路径的两种方式
- 访问远程Git仓库主要有两种:{name}-{profiles}.后缀名 和 {label}/{name}-{profiles}.后缀名;当文件名没有profiles时,访问时我们需要给它指定一个,比如:http://localhost:8080/test-b.yml
- name:服务名
- profiles:环境
- label:仓库分支
- 主要作用:分环境远程存储与应用配置文件、按分支远程存储与应用配置文件
8、配置文件测试
- 测试profiles:
- 测试label:
9、config server常用配置项
- spring.cloud.config.server.git.uri:配置git仓库地址
- spring.cloud.config.server.git.searchPaths:配置仓库路径 –这里写成’{profile}’是为了能让后面的服务在不同环境下动态的去获得相对应的目录下的配置环境
- spring.cloud.config.label:配置仓库的分支
- spring.cloud.config.server.git.username:访问git仓库的用户名
- spring.cloud.config.server.git.password:访问git仓库的用户密码
- spring.cloud.config.server.git.basedir:这里是配置文件存放的本地Git仓库地址
10、config server的主要作用
- 拉取配置时更新Git仓库副本,保证是配置为最新;
- 支持从yml、json、properties等文件加载配置;
- 配合Eureke可实现服务发现,配合Cloud Bus(这个后面我们在详细说明)可实现配置推送更新;
- 默认配置存储基于Git仓库(可以切换为SVN),从而支持配置的版本管理.
2.2、config client使用
1、Config Client从Config Server中获取配置数据的流程:
- Config Client 启动时,根据 bootstrap.properties 中配置的应用名称(application)、环境名(profile)和分支名(label),向 Config Server 请求获取配置数据;
- Config Server 根据 Config Client 的请求及配置,从Git仓库(这里以Git为例)中查找符合的配置文件;
- Config Server 将匹配到的Git仓库拉取到本地,并建立本地缓存;
- Config Server 创建Spring的 ApplicationContext 实例,并根据拉取的配置文件,填充配置信息,然后将该配置信息返回给 Config Client ;
- Config Client 获取到 Config Server 返回的配置数据后,将这些配置数据加载到自己的上下文中。同时,因为这些配置数据的优先级高于本地Jar包中的配置,因此将不再加载本地的配置。
2、将以下两个项目的配置内容写到GitHub仓库中去
3、远程仓库:商品模块配置文件
- 注意:serverName是我自定义的一个配置属性,用于后续的配置文件的获取测试
4、远程仓库:订单模块配置文件
5、config server 配置
server:
port: 8083
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
spring:
cloud:
config:
server:
git:
uri: https://github.com/achuanxiang/firstCloud-config.git 远程仓库的地址
username: GitHub账号
password: GitHub密码
basedir: E:\study_project\cloud_projects\cloud-communication\config-server\basedir 配置存放的本地git仓库地址
application:
name: config-server
6、以商品模块获取远程仓库地址为例
-
先引入config client的依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-client</artifactId> </dependency>
-
配置内容:
server: port: 8081 spring: application: name: ProductServer 注意:应用名称一定要与远程仓库中的{name}相同 cloud: config: discovery: enabled: true 开启cloud client service-id: CONFIG-SERVER config server 在注册中心的名字 profile: dev 读取配置文件的环境{profiles}
7、测试配置文件获取是否成功
@RestController
public class ConfigController {
@Value("serverName")
private String serverName;
@GetMapping("/serverName")
public String serverName(){
return serverName;
}
}
- 启动工程报错:
8、将工程目录下的application.yml改为bootstrap.yml即可
- 成功获取到远程仓库中的配置信息了
9、bootstrap.yml与application.yml的区别
1、加载顺序:
- bootstrap.yml(bootstrap.properties)先加载
- application.yml(application.properties)后加载
2、配置区别:
- bootstrap.yml 可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。
- application.yml 可以用来定义应用级别的,如果搭配 spring-cloud-config 使用 application.yml 里面定义的文件可以实现动态替换。
3、使用Spring Cloud Config Server时,应在 bootstrap.yml 中指定:
- spring.application.name
- spring.cloud.config.server.git.uri
- 一些加密/解密信息
4、为什么使用application.yml不行:
- 因为boostrap用于应用程序上下文的引导阶段,通常用于引导上下文从外部资源获取配置属性,比如Spring Cloud Config Server,或者 解密外部配置文件的属性等。 默认的Config Server地址是localhost:8888. 所以我们只能在bootstrap.yml或者bootstrap.properties中修改。
- 订单模块获取配置与商品模块的步骤一样。
- 本次样例的配置中心GitHub地址
5、配置中心的高可用: