概念: 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.获取新建仓库地址:git@github.com:chenyolo/demo-springcloud-config.git 3.本地磁盘新建git仓库并clone
mkdir demo2020-cloud-config git clone git@github.com:chenyolo/demo-springcloud-config.git在/d/iview_demo/demo2020-cloud-config目录下
本地磁盘D:\iview_demo\demo2020-cloud-config\demo-springcloud-config下有三份.yml文件 (保存格式必须为UTF-8)
碰到的问题:
git@github.com: Permission denied (publickey).执行
ssh-keygen -t rsa -C "XXX@qq.com" 一直下一步即可 ssh -v git@github.com出现
debug1: No more authentication methods to try. git@github.com: Permission denied (publickey).执行
ssh-agent -s ssh-add ~/.ssh/id_rsa (我自己执行无效)Identity added: …这是ssh key文件路径的信息 打开你刚刚生成的id_rsa.pub, (执行ssh -v git@github.com是可以看到默认目录。 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 git@github.com提示:Hi xxx! You’ve successfully authenticated, but GitHub does not provide shell access. 解决。
服务端:配置中心模块cloudConfig Center
1.新建Module模块:config-center3344
2.pom
<?xml version="1.0" encoding="UTF-8"?> <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>demo2020</artifactId> <groupId>cn.chen.demo</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>config-center3344</artifactId> <dependencies> <!-- config-server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <!-- eureka-client --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--公共模块--> <dependency> <groupId>cn.chen.demo</groupId> <artifactId>api-common</artifactId> <version>${project.version}</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> <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> </project>3.yml
server: port: 3344 spring: application: name: config-center cloud: config: server: git: #uri: git@github.com: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: git@github.com:chenyolo/demo-springcloud-config.git 配置远程仓库访问时会报错
Cannot clone or checkout repository: git@github.com: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.com7.测试通过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
<?xml version="1.0" encoding="UTF-8"?> <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>demo2020</artifactId> <groupId>cn.chen.demo</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>config-client3355</artifactId> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <!-- eureka-client --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--公共模块--> <dependency> <groupId>cn.chen.demo</groupId> <artifactId>api-common</artifactId> <version>${project.version}</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> <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> </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.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </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学习系列目录