概念:
Spring Cloud Config项目是一个解决分布式系统的配置管理方案。
它包含了Client和Server两个部分,server提供配置文件的存储、以接口的形式将配置文件的内容提供出去,client通过接口获取数据、并依据此数据初始化自己的应用。
作用:
1.集中统一管理配置文件
2.不同环境不同配置,动态化的配置更新,分环境部署。
3.运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息
4.当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置
5.将配置信息以REST接口的形式暴露
与github整合配置:
由于SpringCloud Config默认使用Git来存储配置文件(也有其它方式,比如支持svn和本地文件,但最推荐的还是Git,而且使用的是http/https访问的形式)
1.在github上新建一个Repository:demo-springcloud-config
2.获取新建仓库地址:[email protected]:chenyolo/demo-springcloud-config.git
3.本地磁盘新建git仓库并clone
mkdir demo2020-cloud-config
git clone [email protected]:chenyolo/demo-springcloud-config.git
在/d/iview_demo/demo2020-cloud-config目录下
本地磁盘D:\iview_demo\demo2020-cloud-config\demo-springcloud-config下有三份.yml文件
(保存格式必须为UTF-8)
碰到的问题:
[email protected]: Permission denied (publickey).
执行
ssh-keygen -t rsa -C "[email protected]" 一直下一步即可
ssh -v [email protected]
出现
debug1: No more authentication methods to try.
[email protected]: Permission denied (publickey).
执行
ssh-agent -s
ssh-add ~/.ssh/id_rsa (我自己执行无效)
Identity added: …这是ssh key文件路径的信息
打开你刚刚生成的id_rsa.pub,
(执行ssh -v [email protected]是可以看到默认目录。 id_rsa.pub在C:\Users\Administrator.ssh底下)
将里面的内容复制,进入你的github账号,
在settings下,SSH and GPG keys下new SSH key,
然后将id_rsa.pub里的内容复制到Key中,完成后Add SSH Key
验证key
ssh -T [email protected]
提示:Hi xxx! You’ve successfully authenticated, but GitHub does not provide shell access.
解决。
服务端:配置中心模块cloudConfig Center
1.新建Module模块:config-center3344
2.pom
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>demo2020artifactId>
<groupId>cn.chen.demogroupId>
<version>1.0-SNAPSHOTversion>
parent>
<modelVersion>4.0.0modelVersion>
<artifactId>config-center3344artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-config-serverartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
<dependency>
<groupId>cn.chen.demogroupId>
<artifactId>api-commonartifactId>
<version>${project.version}version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<scope>runtimescope>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
project>
3.yml
server:
port: 3344
spring:
application:
name: config-center
cloud:
config:
server:
git:
#uri: [email protected]:chenyolo/demo-springcloud-config.git #github上面的仓库名称
uri: https://github.com/chenyolo/demo-springcloud-config.git #github上面的仓库名称
search-paths:
- demo-springcloud-config
label: master
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka
注意:
yml中 uri: [email protected]:chenyolo/demo-springcloud-config.git
配置远程仓库访问时会报错
Cannot clone or checkout repository: [email protected]:chenyolo/demo-springcloud-config.git
修改成 https://github.com/chenyolo/demo-springcloud-config.git 即可
4.主启动
@SpringBootApplication
@EnableConfigServer
public class ConfigCenterApplication3344 {
public static void main(String[] args) {
SpringApplication.run(ConfigCenterApplication3344.class, args);
}
}
5.业务类:无
6.windows下修改hosts文件,增加映射
127.0.0.1 config-3344.com
7.测试通过Config微服务是否可以从Github上获取配置内容
1)启动7001
2)启动3344
3)访问:http://config-3344.com:3344/master/config-dev.yml
4)成功实现了用SpringCloud Config 通过GitHub获取配置信息
8.配置读取规则
1)/{label}/{application}-{profile}.yml(最推荐使用这种方式)
2)/{application}-{profile}.yml
3)/{application}-{profile}[/{label}]
总结:label为分支(branch);name为服务名;profiles为环境(dev/test/prod等)
客户端模块
1.新建module: config-client3355
2.pom
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>demo2020artifactId>
<groupId>cn.chen.demogroupId>
<version>1.0-SNAPSHOTversion>
parent>
<modelVersion>4.0.0modelVersion>
<artifactId>config-client3355artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-configartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
<dependency>
<groupId>cn.chen.demogroupId>
<artifactId>api-commonartifactId>
<version>${project.version}version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<scope>runtimescope>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
project>
3.yml:bootstrap.yml
bootstrap.yml:系统级。用来在程序引导时执行,应用于更加早期配置信息读取,如可以使用来配置application.yml中使用到参数等
application.yml:用户级。应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。
bootstrap.yml先于application.yml加载
server:
port: 3355
spring:
application:
name: config-client
cloud:
config: # config客户端配置
label: master # 分支名称
name: config # 配置文件名称
profile: dev # 读取后缀名称
# 上述三个:master分支上的config-dev.yml的配置文件
uri: http://config-3344.com:3344 # 配置中心地址
#uri: http://localhost:3344 # 配置中心地址
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka
修改config-dev.yml配置并提交到GitHub中,比如加个变量age或者版本号version
4.主启动
@SpringBootApplication
public class ConfigClientApplication3355 {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication3355.class, args);
}
}
5.业务类
@RestController
@RequestMapping("/configClient")
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/info")
public String getConfigInfo(){
return configInfo;
}
}
6.测试
启动注册中心7001
启动配置中心3344
启动客户端3355
访问:http://localhost:3355/configClient/info
成功实现了客户端3355访问SpringCloud Config3344通过GitHub获取配置信息
7.问题:分布式配置的动态刷新
1)修改GitHub上的配置文件内容:
config:
info: “master branch,springcloud-config/config-dev.yml version=222222”
2)刷新3344,发现ConfigServer配置中心立刻响应
3)刷新3355,发现ConfigServer客户端没有任何响应
4)3355没有变化除非自己重启或者重新加载
8.解决:Config客户端之动态刷新
1)修改3355模块
POM引入actuator监控
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
修改yml,暴露端口
management:
endpoints:
web:
exposure:
include: "*"
@RefreshScope业务类Controller修改
需要运维人员发送Post请求刷新3355 (必须是post请求。打开命令行窗口执行一下命令)
curl -X POST "http://localhost:3355/actuator/refresh"
2)继续修改github配置文件,3344访问,3355访问,执行post刷新,完美解决了!
3)如果多个客户端该怎么解决?不可能每一个都去发送post请求刷新!(广播???)
–> springcloud bus消息总线
springcloud学习系列目录