springcloud学习-15 springcloud config【周阳springcloud2020学习笔记】

概念:
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学习系列目录

你可能感兴趣的:(springcloud学习笔记)