参考了尚硅谷的spring cloud课程,做了一些笔记,完整代码:https://github.com/yao09605/mscloud
文章目录
Config解决的问题
- 将配置独立于程序包,作为单独的库,可以随时更新,而不是打包整个程序包到生产上。(在企业里面打包程序上生产是要走很多流程的)
- 可以管理多个版本的配置文件,比如prod生产环境,dev开发环境,test测试环境等等
- 应用不需要重启,通过暴露接口的方式实现配置的实时刷新
准备工作
准备一个github仓库作为存放配置文件的地方
Config的约定
远程的config文件使用官网约定的命名方式
有以下几种约定的文件格式:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
其中:
application
对应spring.config.name
(应用名)
profile
对应环境名spring.config.profile
(环境名)
label
对应spring.config.label
(github分支)
举个例子:
我们上传一个config-dev.yml
到github上的master
分支上
读取这个配置的应用应该有如下配置:
spring:
application:
name: config-client
cloud:
config:
label: master
name: config
profile: dev
uri: http://localhost:3344
Config Server端配置
新建一个module
修改pom
添加如下依赖
<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>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
修改application.yml
server:
port: 3344
spring:
application:
name: cloud-config-center
cloud:
config:
server:
git:
uri: https://github.com/yao09605/springcloud-config.git #库地址
search-paths:
- springcloud-config
label: master #分支
eureka: #服务注册中心
client:
service-url:
defaultZone: http://localhost:7001/eureka
添加启动类
@SpringBootApplication
@EnableConfigServer
public class ConfigCenterMain3344 {
public static void main(String[] args) {
SpringApplication.run(ConfigCenterMain3344.class,args);
}
}
启动3344应用
测试:http://localhost:3344/master/config-dev.yml
Config Client端配置
pom依赖
<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>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
bootstrap.yml
bootstrap.yml优先级高于application.yml,所以这里用bootstrap,因为真正的配置在配置中心
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://eureka7001.com:7001/eureka
management: #暴露端口用于实时刷新
endpoints:
web:
exposure:
include: "*"
主启动
@SpringBootApplication
public class ConfigClientMain3355 {
public static void main(String[] args) {
SpringApplication.run(ConfigClientMain3355.class,args);
}
}
测试类
@RefreshScope //用于刷新配置
@RestController
public class ConfigClientController {
@Value("${config.info}") //注入远程配置文件中的字段,配置文件中没有这个字段的话就启动不起来了
private String configInfo;
@GetMapping("/configInfo")
public String getConfigInfo(){
return configInfo;
}
}
测试
访问:http://localhost:3355/configInfo
实时更新
- 修改配置文件上传git
- curl -X POST “http://localhost:3355/actuator/refresh” 注意必须使用post方式刷新
- 访问:http://localhost:3355/configInfo 不需要重启服务