• 十、SpringCloud config分布式配置中心


    概述

    官网:spring-cloud-config官网

    • 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以—套集中式的、动态的配置管理设施是必不可少的。SpringCloud提供了ConfigServer来解决这个问题,我们每一个微服务自己带着一个application.yml,上百个配置文件的管理.…

    是什么
    SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。

    怎么玩
    SpringCloud Config分为服务端和客户端两部分。
    服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口

    客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容

    能干嘛

    • 不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release
    • 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息
    • 当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置
    • 将配置信息以REST接口的形式暴露
    • 由于SpringCloud Config默认使用Git来存储配置文件(也有其它方式,比如支持svn和本地文件,但最推荐的还是Git,而且使用的是http/https访问的形式)

    配置

    服务端配置

    pom

     <dependencies>
     		<!--注意这个是服务端的-->
            <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>com.atguigu.springcloud</groupId>
                <artifactId>cloud-api-commons</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>
    

    yml

    server:
      port: 3344
    spring:
      application:
        name: cloud-config-center
      cloud:
        config:
          server:
            git:
              uri:  https://github.com/996561465/sprincloud-config.git #填写你自己的github路径
              search-paths:   #搜索目录
                - springcloud-config
          label: master   #读取分支
    #服务注册到eureka
    eureka:
      client:
        service-url:
          defaultZone:  http://localhost:7001/eureka
    
    

    主启动类 @EnableConfigServer添加注解

    package com.atguigu.springcloud;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.config.server.EnableConfigServer;
    
    @SpringBootApplication
    @EnableConfigServer
    public class ConfigCenterMain3344 {
        public static void main(String[] args) {
                SpringApplication.run(ConfigCenterMain3344 .class,args);
            }
    }
    

    测试需要

    windows下修改hosts文件,增加映射

    127.0.0.1 config-3344.com
    

    配置读取规则

    /{label}/{application}-{profile}.yml(最推荐使用这种方式)

    label:分支
    application-profile 文件名 如	config-dev
    

    master分支

    http://config-3344.com:3344/master/config-dev.yml
    http://config-3344.com:3344/master/config-test.yml
    

    dev分支

    http://config-3344.com:3344/dev/config-dev.yml
    http://config-3344.com:3344/dev/config-test.yml
    

    /{application}-{profile}.yml

    http://config-3344.com:3344/config-dev.yml
    

    /{application}-{profile}[/{label}]

    http://config-3344.com:3344/config/dev/master
    

    总结

    /{name}-{profiles}.yml
    /{label}-{name}-{profiles}.yml
    label:分支(branch)
    name :服务名
    profiles:环境(dev/test/prod)
    

    注意:如果访问没有的配置文件读取的内容为{}

    客户端配置

    		<!--注意这个是客户端的-->
        	 <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>com.atguigu.springcloud</groupId>
                <artifactId>cloud-api-commons</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>
    
    

    bootstrap.yml介绍

    • applicaiton.yml是用户级的资源配置项
    • bootstrap.yml是系统级的,优先级更加高
    • Spring Cloud会创建一个Bootstrap Context,作为Spring应用的Application Context的父上下文。初始化的时候,BootstrapContext负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的Environment.
    • Bootstrap属性有高优先级,默认情况下,它们不会被本地配置覆盖。Bootstrap contextApplication Context有着不同的约定,所以新增了一个bootstrap.yml文件,保证Bootstrap Context和Application Context’`配置的分离。
    • 要将Client模块下的application.yml文件改为bootstrap.yml这是很关键的,
      因为bootstrap.yml是比application.yml先加载的。bootstrap.yml优先级高于application.yml

    bootstrap.yml

    server:
      port: 3355
    
    spring:
      application:
        name: config-client
      cloud:
        config:
          label: master  #分支名称
          name: config   #文件名
          profile: dev   #后缀名称
          uri: http://localhost:3344  #配置中心地址  最终:http://localhost:3344/master/config-dev
    eureka:
      client:
        service-url:
          defaultZone: http://eureka7001.com:7001/eureka
    

    java类

    //主启动类
    @SpringBootApplication
    @EnableDiscoveryClient //把当前服务注册到注册中心
    public class ConfigClientMain3355 {
        public static void main(String[] args) {
                SpringApplication.run( ConfigClientMain3355.class,args);
            }
    }
     //业务类
    @RestController
    public class ConfigClientController {
        @Value("${config.info}")
        private String configInfo;
    
        @GetMapping("/configInfo")
        public String getConfigInfo() {
            return configInfo;
        }
    }
    

    测试

    http://localhost:3355/configInfo
    

    成功获取到

    分布式配置的动态刷新

    问题1:gitHub修改了 服务端更新 客户端没有更新

    1. 修改GitHub上的配置文件内容做调整
    2. 刷新3344,发现ConfigServer配置中心立刻响应
    3. 刷新3355,发现ConfigServer客户端没有任何响应
    4. 3355没有变化除非自己重启或者重新加载
    5. 难道每次运维修改配置文件,客户端都需要重启??噩梦
    解决:手动版动态刷新

    引入图形化监控(一般情况除了网关不加 其余都加)

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    

    修改yml配置

    server:
      port: 3355
    spring:
      application:
        name: config-client
      cloud:
        config:
          label: master  #分支名称
          name: config   #文件名
          profile: dev   #后缀名称
          uri: http://localhost:3344  #配置中心地址  最终:http://localhost:3344/master/config-dev
    eureka:
      client:
        service-url:
          defaultZone: http://eureka7001.com:7001/eureka
      instance:
        prefer-ip-address: true #显示ip地址
    
    #监控配置
    management:
      endpoints:
        web:
          exposure:
            include: "*"
    

    修改controller

    @RefreshScope
    @RestController
    public class ConfigClientController {
    
        @Value("${config.info}")
        private String configInfo;
    
        @GetMapping("/configInfo")
        public String getConfigInfo(){
            return configInfo;
        }
    }
    

    进行测试

    http://127.0.0.1:3355/configInfo
    

    在这里插入图片描述
    还是没有生效

    为什么
    需要运维人员发送Post请求刷新3355

    curl -X POST "http://localhost:3355/actuator/refresh"
    

    在这里插入图片描述
    结果:
    在这里插入图片描述
    已经同步过来了 不再需要重启项目了

    问题2:假如有多个微服务客户端3355/3366/3377。。。。

    每个微服务都要执行一次post请求,手动刷新?
    可否广播,一次通知,处处生效?
    我们想大范围的自动刷新,求方法

  • 相关阅读:
    leetcode--Lowest Common Ancestor of a Binary Search Tree
    bzoj3675【APIO2014】序列切割
    计算机网络之面试常考
    <html>
    TCP相关面试题总结
    Java多线程之Lock的使用
    原来Java中有两个ArrayList
    Java编程规范
    一些面试基本知识(Android篇一)
    _PyUnicodeUCS4_AsDefaultEncodedString
  • 原文地址:https://www.cnblogs.com/idcode/p/14551374.html
Copyright © 2020-2023  润新知