Config
SpringCloud Config是微服务架构中的微服务提供的集中化外部配置支持,配置服务器为各个不同的微服务的所有环境提供一个中心化的外部配置。Config分为客户端和服务端两部分,服务端是分布式配置中心,是一个独立的微服务,用来连接配置服务器并为客户端提供获取配置信息,加密解密信息等访问接口。客户端则通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载信息配置服务默认采用git来存储配置信息。
作用
1,集中管理配置文件
2,不同的环境不同的配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release
3,运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息。
4,当配置发生变动的时候,服务不再需要重启来感知自身配置的变化并且及时地应用新的配置。
5,将配置信息以Rest接口的形式暴露。
基本使用
1,创建Config服务端。添加依赖。
<dependencies>
<!--config server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!--common模块-->
<dependency>
<groupId>cn.izzer</groupId>
<artifactId>cloud-api-common</artifactId>
<version>1.0</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>
<!--eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</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>
接下来是yml的配置,Config会默认加载github上的配置文件,可是目前在国内上GitHub的话还是挺慢的,所以这里最好用码云,就不会受网络的限制。
2,创建配置仓库。
3,将仓库通过git clone到本地,将配置文件上传到码云。
4,在yml里面使用HTTPS或者SSH的方式引入仓库地址,这里我使用的是HTTPS。
server:
port: 3344
spring:
application:
name: cloud-config-center
cloud:
config:
server:
git:
uri: https://gitee.com/Yintianhao/SpringCloudConfigCenter.git
search-paths:
- SpringCloudConfigCenter
username: Yintianhao(账号)
password: XXXXX(账号密码)
force-pull: true
label: master
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
5,创建启动类。主要是需要注意加上@EnableConfigServer的注解。
6,测试是否能够通过localhost:3344正常访问git上的配置文件。
http://localhost:3344/master/config-dev.yml
master是分支,config-dev表示文件名,这里是指开发环境的配置文件,一般还有生产环境等等。
bootstrap.yml
与application不同的是bootstrap一般用来表示系统级的配置项,优先级比application高。SpringCloud会创建一个BootstrapContext,作为Spring应用的ApplicationContext的父上下文,初始化的时候,BootstrapContext负责从外部资源加载配置属性并且解析配置,这两个上下文共享一个从外部获取的Environment。Bootstrap的属性具有高优先级,默认情况下他们都不会被本地配置覆盖,Bootstrap context和Application Context有着不同的约定,所以新增一个Bootstrap.yml文件,保证BootstrapContext和application Context配置的分离。
搭建Config客户端来获取服务端的配置
依赖跟服务端不同的地方主要是这里引用的是客户端的依赖。其余都和服务端差不多。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>cn.izzer</groupId>
<artifactId>cloud-api-common</artifactId>
<version>1.0</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>
<!--eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</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>
在这之后新建Bootstrap.yml文件。
# bootstrap.yml
server:
port: 3355
spring:
application:
name: config-client
cloud:
config:
label: master
name: config #配置文件名称
profile: dev #读取后缀名称
uri: http://localhost:3344 #配置中心地址
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
management:
endpoints:
web:
exposure:
include: "*"
启动类就不写了,在这之后,通过Controller层调用服务端的接口来获得配置信息。
@RestController
@RefreshScope
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/configinfo")
public String getConfigInfo(){
return configInfo;
}
}
进行简单的测试:
动态刷新的问题
这里带来的问题就是客户端无法和同步更新服务端检测到的git上的配置信息的改变,所以需要配置动态刷新。这里就需要用到actuator的监控功能了,从而可以避免每次都需要重启客户端来同步服务端的配置信息。需要的配置信息就是上面yml文件中的最后的management节点中的内容。除此之外就是需要在controller层加入@RefreshScope的注解来开启刷新。但是这里我个人觉得还是有一点不方便,尽管这不需要重启客户端,但是与此同时又需要利用curl来发送post请求来激活刷新,如果客户端数量不多那还好,但如果在生产环境中有需要个客户端服务,那么这里的工作量也是不小的。我想应该后面会有相应的技术解决方案,之后学到了再把这个坑填上。
curl测试很简单。
在执行完这个命令之后就可以使用动态刷新了。