0.什么是SpringCloud Config
在微服务架构中,有一堆各种微服务,粒度很细,如果一个一个的进行配置application.yml,那么工程量是非常巨大的,springcloud config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个集中的外部配置
1.配置Config的服务端
①创建一个github仓库,并创建配置文件上传到仓库
首先创建三个yml文件,然后右键git bash here,打开git控制台,并输入以下指令上传到git仓库
1.git init #git进行管理文件夹
2.git add . #添加所有文件
3.git commit -m "提交注释" #提交
4.git remote add origin 这里带上你的仓库地址 #绑定远程仓库
5.git push -u origin master #上传到仓库
上传完成
②新建Config服务端项目,并进行配置
添加web,eureka,config服务端的相关依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</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>
</dependency>
<dependency>
<groupId>com.hht.cloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.4.RELEASE</version>
</dependency>
<!--config server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
<version>2.2.4.RELEASE</version>
</dependency>
然后配置项目的yml配置文件,需要指定git仓库相关配置。
spring:
application:
name: cloud-config-center
cloud:
config:
server:
git:
uri: https://github.com/houhaotong/springcloud-config #github的仓库地址
#搜索目录
search-paths:
- springcloud-config
username: 你的账号
password: 你的密码
#读取分支
label: master
eureka:
instance:
hostname: cloud-config-center
client:
service-url:
defaultZone: http://eureka7001.com:7001/,http://eureka7002.com:7002/
server:
port: 3344
接下来在主启动类上加入@EnableConfigServer
注解
@SpringBootApplication
@EnableConfigServer
public class CloudConfigCenter3344Application {
public static void main(String[] args) {
SpringApplication.run(CloudConfigCenter3344Application.class, args);
}
}
然后开启项目,尝试查看仓库中的配置文件,下面是在git仓库中的config-dev.yml的内容,测试访问项目路径能否查看到。
输入网址 项目地址+端口+分支名+需要访问的文件名
,如:http://localhost:3344/master/config-dev.yml,可以看到成功查看到了git仓库中的配置文件内容。
2.配置Config的客户端
①配置客户端项目,并进行测试
新建一个client项目,将服务端的依赖改为客户端的依赖。
<!--config-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
<version>2.2.4.RELEASE</version>
</dependency>
在客户端项目中,我们将application.yml改名为bootstrap.yml
什么是bootstrap.yml?
Spring Cloud会创建一个boostrap context
作为application.yml
的父级上下文,初始化时bootstrap.yml
负责从外部源加载配置属性并解析配置,用这个配置文件来获取远程配置。
bootstrap.yml
的优先级比application.yml优先级更高,会比application更先加载,bootstrap.yml相当于系统级。
下面是项目的bootstrap.yml配置内容。
spring:
application:
name: cloud-config-client
cloud:
config:
#读取分支
label: master
#文件名
name: config
#文件的后缀名字
profile: dev #这样配置就代表,从uri中调用master分支中的叫做config-dev的文件
#config服务端的地址
uri: http://localhost:3344
eureka:
instance:
hostname: cloud-config-client
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
server:
port: 3355
现在已经配置好了配置文件,会从git仓库中读取config-dev.yml
的内容,接下来新建一个controller,并写一个方法来读取从config-dev.yml
中读取的内容。下面是在git仓库中的config-dev.yml
文件内容。
下面是用于测试读取的controller。
@RestController
@RequestMapping("/config")
public class ConfigClientController {
@Value("${config.info}")
private String info;
@GetMapping("/info")
public String getInfo(){
return info;
}
}
接下来开启服务端和客户端进行测试。
可以看到能够从配置文件中获取到git仓库里的配置。
②配置动态刷新手动版
如果我们修改了git仓库上的配置文件内容,那么客户端和服务端获取到的内容会不会随着刷新?接下来进行测试一波,修改git仓库的文件version=2,然后在3344端口的服务端进行查看。
可以看到,在3344的Config服务端上,会获取到最新的。
接下来访问3355的客户端,发现没有刷新,依旧是version=1。
鉴于这种情况,我们不能每次都重新启动项目来刷新,所以接下来就需要配置动态刷新。
首先,需要导入actuator监控的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
接下来,在配置文件中配置暴露监控断点
#暴露监控端点
management:
endpoints:
web:
exposure:
include: "*"
然后在controller类上加入@RefreshScope
注解
然后开启项目之后,修改git中的文件内容为version=3,修改完之后,这时候访问仍然是老的,依旧没有刷新,这时候需要我们向http://localhost:3355/actuator/refresh
发送POST请求,来进行一波手动刷新。
接下来再次在客户端查看远程配置,发现已经更新了。