SpringCloud-配置中心(Config)

Config

https://docs.spring.io/spring-cloud-config/docs/current/reference/html/

概述

分布式系统面临的问题-配置问题

微服务 意味着 要将单体应用中的业务拆成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务;

由于每个微服务 都需要相应的配置 才能正常运行,所以 一套 集中式、动态的配置管理 必不可少;

SpringCloud提供了ConfigServer解决这个问题;

what


Spring Cloud Config 为 微服务架构中的微服务 提供 集中式的外部配置支持;
配置服务器 为各个不同的微服务应用 的所有环境提供一个中心化的外部配置;

Spring Cloud Config 由服务端、客户端组成;

  服务端:

    称为分布式配置中心;

    一个独立的微服务应用;

    用来连接配置服务器 并 为客户端提供 获取配置信息、加密/解密等访问接口;

    配置服务器默认采用Git存储配置信息;

      有利于对环境配置进行版本管理;

      可以通过Git客户端方便管理、访问配置内容;

  客户端:

    一个个微服务应用;

    通过指定的分布式配置中心 来管理应用资源 及 业务相关的配置内容;

    在启动的时候 从配置中心 获取/加载配置信息;

功能

集中管理配置文件;

不同环境不同配置、动态的配置更新、分环境部署(eg: dev/test/prod...);

运行期间动态调整配置,不需要在每个微服务编写配置文件,微服务会从配置中心统一拉取配置信息;

配置变化时,无需重启即可感知 并 使用新的配置;

将配置信息以REST接口形式暴露;    

How

ConfigServer

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>


server:
  port: 3344

spring:
  application:
    name: config
  cloud:
    config:
      server:
        git:
          uri:    #github地址
          search-paths: #搜索github的路径
            - sprin
      label: master #读取github分支

eureka:
  client:
    register-with-eureka: true #是否向注册中心注册自己
    fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为true
    service-url:
      defaultZone: http://localhost:7001/eureka/   #单机版


@EnableConfigServer // 开启ConfigServer
@SpringBootApplication
public class Config3344 {

    public static void main(String[] args) {
        SpringApplication.run(Config3344.class, args);
    }
}


http://localhost:3344/config/application-prod.yml

   

配置读取规则

/{label}/{application}-{profile}.yml

/{application}-{profile}.yml

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

  label:分支、application:应用名、profile:环境

 

仓库配置

1、Git仓库配置

2、SVN仓库配置

3、本地仓库

4、本地文件系统

   a,Spring Cloud Config提供一种不使用Git仓库、SVN仓库的存储方式,使用本地文件系统的存储方式来保存信息;

   b,实现方式:

      spring.profiles.active=native;

      Config Server  会  默认从应用的src/main/resource目录下搜索配置文件;

      如果需要明确指定路径,可以使用spring.cloud.config.server.native.searchLocations=“”指定;

ConfigClient  

bootstrap.yml

applcation.yml是用户级资源配置,bootstrap.yml是系统级(优先级高);

SpringCloud会创建一个"Bootstrap Context",作为Spring应用的"Application Context"的父上下文;

初始化的时候,Bootstrap Context负责从外部加载配置属性并解析配置;

Bootstrap Context 与 Application Context共享一个从外部获取的Environment;

Bootstrap Context有高优先级,默认情况下,不会被本地配置覆盖;

Bootstrap Context 与 Application Context有着不同的约定,所以新增一个bootstrap.yml,保证Bootstrap Context 与 Application Context配置分离;

要将ConfigClient的application.yml改为bootstrap.ym,很关键;

 

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>


server:
  port: 8001

spring:
  application:
    name: eureka-payment-service

  cloud:
    config:
#      label:  #分支
      name: application   #配置文件名称
      profile: dev    #环境
      uri: http://localhost:3344  #配置中心地址



@Slf4j
@RestController
public class PaymentController {

    @Value("${config.info}")
    private String config;

    @GetMapping(value = "/getFromConfigServer")
    public String getFromConfigServer(){
        return config;
    }
}


http://localhost:8001/getFromConfigServer

  

ConfigClient动态刷新配置  

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

2、
#暴露监控端点
management:
  endpoints:
    web:
      exposure:
        include: "*"


3、添加@RefreshScope
@RefreshScope        
@RestController
public class PaymentController {

    @Value("${config.info}")
    private String config;

    @GetMapping(value = "/getFromConfigServer")
    public String getFromConfigServer(){
        return config;
    }
}

4、手动刷新
curl -X POST "http://localhost:8001/actuator/refresh"

  

存在的问题

如果客户端很多,大量的客户端手动刷新,怎么处理?

想要有选择去手动刷新,该如何处理?

posted on 2022-08-11 11:32  anpeiyong  阅读(273)  评论(0编辑  收藏  举报

导航