springcloud ----配置中心--Config

概述

1、解决了什么问题

微服务以为者要将单体应用中的业务才分成一个个的子服务,每个服务的粒度相对较小, 因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以需要一套集中式的动态的 配置管理设施是必不可少的。

Spring Cloud 提供了 ConfigServer 来解决这个问题,我们的每一个微服务自己带着一个application.yml. 如果上百个服务那么必然面临着的问题就是一个信息“爆炸” 的问题(配置文件过多且凌乱)。

2、是什么

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

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

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

3、能干什么
  1. 集中管理配置文件
  2. 不同环境的不同配置,动态化配置更新,分环境部署比如:/dev/test/prod/beta/release
  3. 运行期间动态调整配置,不再需要在每个服务器部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息
  4. 当配置发生变动,服务不需重启即可感知配置的并发并应用新的配置
  5. 将配置信息以REST接口的形式暴露
4、能与GitHub 、码云等进行整合

config官网: https://spring.io/projects/spring-cloud-config#learn

简单案例(采用码云,GitHub同理)

  1. 新建仓库 cloud2020-config
  2. 如果需要下载: https://gitee.com/aqiang9/cloud2020-config.git
  3. 配置多环境: config-dev.yml 、config-test.yml 、 config-prod.yml 等
  4. 对于配置文件的修改 一般是由运维人员负责修改

搭建配置中心

1、模块名 cloud-config-center-3344
2、pml.xml (注册中心 、web、actuator 等)
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>
3、yml 配置文件
server:
  port: 3344
spring:
  application:
    name: cloud-config-center
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/aqiang9/cloud2020-config.git   // 配置文件地址
          search-paths:
            - cloud2020-config    // 路径

      # 读取的分支
      label: master
#  注册中心的配置  (可以自行替换)
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka
  instance:
    instance-id: config-center
    prefer-ip-address: true
4、主启动
@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer
public class ConfigCenterMain3344 {
   public static void main(String[] args){
       SpringApplication.run(ConfigCenterMain3344.class,args) ;
   }
}
5、测试

http://127.0.0.1:3344/master/config-dev.yml

配置规则

/{lable}/{name}-{profiles}.yml  		# 
/{name}-{profile}.yml           # 默认为master
/{name}/{profile}[/{lable}]      #  http://127.0.0.1:3344/config/dev/master
  • lable:分支{branch} 如果不配置 默认为master
  • name: 服务名
  • profiles : 环境名 {dev/test/prod}

整合client端

1、模块名 cloud-config-client3355
2、pml.xml
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
3、yml 配置文件

bootstrap.yml

server:
  port: 3355
spring:
  application:
    name: config-client
  cloud:
    config:
      label: master  # 分支名称
      name: config   # 配置文件名
      profile: dev   # 读取后缀名称
      uri: http://config-3344.com:3344  #配置中心地址
      # 完整地址 {uri}/{label}/{name}-{profile}.yml
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka
  instance:
    instance-id: ${spring.application.name}
    prefer-ip-address: true
4、主启动
@SpringBootApplication
@EnableEurekaClient
public class ConfigClientMain3355 {
    public static void main(String[] args){
        SpringApplication.run(ConfigClientMain3355.class,args) ;
    }
}
@RestController
public class ConfigClientController {
    @Value("${server.port}")
    private String serverPort;

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

    @GetMapping("/configInfo")
    public String info(){
        return configInfo ;
    }
}
5、测试

localhost:3355/configInfo


问题随之而来,分布式分配至的动态刷新问题

  • 当远程修改配置文件,configserver 能立刻生效 , configclient并未作出响应
  • 重启后生效

yml的说明
1、bootstrap.yml 与application.yml 区别
application.yml 用户级的资源配置文件
bootstrap.yml 系统级的配置文件
springcloud 会创建一个Bootstrap Context 作为spring应用的ApplicationContext的父上下文初始化时,BootstrapContext负责从外部源加载配置文件并解析配置。这两个上下文共享一个从外部获取的Environment

Bootstrap 属性有高优先级 默认情况下 不会被本地配置覆盖 两个上下文有着不同的约定 ,所以新增一个bootstrap 保证配置分离

要将Client模块下的application.yml 改为bootstrap.yml


刷新配置文件(手动)

修改 configclient端
  • pom.xml 中引入
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  • 修改yml
# 为了动态刷新 配置文件  暴露监控端点
management:
  endpoints:
    web:
      exposure:
        include: "*"
  • 修改需要动态配置的业务类: 添加 @RefeshScope 注解 表示需要动态更新
@RestController
@RefreshScope
public class ConfigClientController {
  • 测试

  • 配置没有刷新 ?

    • 需要发送一条刷新请求 curl -X POST "localhost:3355/actuator/refresh , 触发配置刷新

思考还有什么问题

  • 如果有多个微服务客户端 config-client1、config-client2、config-client3 , 每个微服务都要执行一次 post 请求,手动刷新?
  • 是否可以官博,一处通知,处处生效?
  • 能否定制化通知

引入消息总线 , 优化配置服务

发布了119 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/getchar97/article/details/105111560