• Spring Cloud:Config基础知识


    背景

    微服务意味着要将单体应用拆分成一个个自服务,每个服务的力度相对较小,因此系统中会存在大量服务,每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。
    Spring Cloud Config为微服务架构中的微服务提供集中化外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置

    Spring Cloud Config分为服务端客户端两部分。
    服务端也成为分布式配置中心,他是一个独立的微服务应用,用来连接配置服务器并为客户端提供配置信息,加密/解密信息等访问接口。
    客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息配置服务器默认采用git来存储配置信息,这样有利于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容。

    服务端搭建

    在git上创建一个仓库,并且拉取到本地,git clone git@github.com:JGZY/springcloud-config.git,这里不再赘述详细过程。
    hosts文件增加映射

    127.0.0.1 config3344.com
    

    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>
    

    yml配置:

    server:
      port: 3344
    
    eureka:
      client:
        #是否将自己注册到Eureka Server 默认为true
        register-with-eureka: true
        #是否从EurekaServer抓取已有的注册信息,默认为true,单节点无所谓,集群必须设置true才能配合ribbon做负载均衡
        fetch-registry: true
        service-url:
          #设置eureka server交互的地址查询服务和注册服务都需要依赖这个地址
          defaultZone: http://localhost:7001/eureka
          #defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
      instance:
        instance-id: config3344
        #访问路径可以显示IP地址
        prefer-ip-address: true
    spring:
      application:
        name: cloud-config-center
      cloud:
        config:
          server:
            git:
              uri: git@github.com:JGZY/springcloud-config.git
              #搜索目录
              search-paths:
                - springcloud-config
          #读取分支
          label: master
    

    springboot主启动类,加上@EnableConfigServer注解

    @SpringBootApplication
    @EnableConfigServer
    public class ConfigMain3344 {
        public static void main(String[] args) {
            SpringApplication.run(ConfigMain3344.class,args);
        }
    }
    

    启动后,我们直接访问http://config3344.com:3344/master/config-dev.yml

    说明可以访问到我在git中的配置文件。
    配置文件有以下几种访问方式:(官网)

    /{application}/{profile}[/{label}]
    /{application}-{profile}.yml
    /{label}/{application}-{profile}.yml
    /{application}-{profile}.properties
    /{label}/{application}-{profile}.properties
    

    客户端配置

    部分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>
    

    创建bootstrap.yml
    说明:
    application.yml是用户级的资源配置项,bootstrap.yml是系统级的,优先级更高。
    Spring Cloud会创建一个 bootstrap context,作为Spring应用的Application context的上下文,初始化的时候,bootstrap context负责从外部源加载配置属性并解析配置,这两个上下文共享一个从外部获取的environment。
    bootstrap属性具有高优先级,默认情况下,他们不会被本地配置覆盖。bootstrap context和application context有着不同的约定,所以新增一个bootstrap.yml文件,保证bootstrap context和application context配置的分离。

    server:
      port: 3355
    
    spring:
      application:
        name: config-client
      cloud:
        config:
          label: master
          name: config
          profile: dev #上述三个综合,master分支上config-dev.yml的配置文件被读取  http://localhost:3344/master/config-dev.yml
          uri: http://localhost:3344
    
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:7001/eureka
    

    controller测试配置是否可以读取到:

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

    访问http://localhost:3355/config/client/info,发现git上的配置可以成功的读取到。

    config动态刷新

    当我们修改了git上的配置后,发现config配置中心端配置立马就能读取到改变,但是client端不能,读取的还是旧配置。
    下面介绍config动态刷新
    1.client端需要引入actuator依赖。

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

    2.client暴露监控端点(yml配置)

    management:
      endpoints:
        web:
          exposure:
            include: "*"
    

    3.在业务类上面加上@RefreshScope注解

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

    4.然后每一次修改git上的配置后,执行下面命令,手动刷新配置,然后客户端就能读取到最新配置了。这样就避免重启服务的麻烦了。

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

    但是又有了新的麻烦。现在只有一个config的客户端,假如又有一堆config客户端,每个微服务都执行一次post请求,手动刷新,也比较麻烦。由此引入Spring Cloud Bus消息总线。

  • 相关阅读:
    vue实现图片路径传送
    title中添加小图标
    张钊的第一份作业
    张钊的第二份作业
    在Windows Server 2008 R2环境下安装活动目录失败的一个解决方法
    如何把SubVersion的服务程序变为Window后台服务形式
    一个关于静态方法调用的问题。
    WCF配置中遇到的问题:如何把Hostname修改成IP
    删除Visual Studio最近的项目(转载)
    有时候用ifstream或ofstream打开带有中文路径的文件会失败
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/13623937.html
Copyright © 2020-2023  润新知