目录

Life in Flow

知不知,尚矣;不知知,病矣。
不知不知,殆矣。

X

Config

配置中心的由来

 分布式系统中往往部署在 N 服务器上,逐一管理维护成本很高,所以配置中心应运而生。配置中心被用作集中管理不同环境(Dev、Test、Stage、Prod)和不同集群配置,以及在修改配置后将实时动态推送到应用上进行刷新。

#配置中心应具备的功能
流转图

  • OpenAPI
  • 业务无关性
  • 配置生效监控
  • 一致性 K-V 存储
  • 统一配置实时推送
  • 配合灰度与更新
  • 配置全局恢复、备份与历史
  • 高可用集群

Spring Cloud Config

 Spring Cloud Config 是一个集中化外部配置的分布式系统,由服务端和客户端组成。它不依赖于注册中心,是一个独立的配置中心。 支持多种存储配置信息的形式:JDBC、Vault、Native、SVN、Git。

Git 版工作原理

配置中心工作原理

  1. 客户端启动时候向 ConfigServer 发起请求
  2. ConfigServer 接收服务端请求后,根据配置的仓库地址,将 Git 上的文件克隆到本地的一个临时目录中(此目录是一个 Git 的本地仓库目录)。
  3. 然后 ConfigServer 再读取本地文件返回给客户端(优点:Git 服务器网络故障,依然可以使用 ConfigServer 的本地 Git 仓库目录作为缓存继续为客户端提供服务)。

Git 服务器结合 Config Server 搭建分布式配置中心

 使用 Git 服务器,可以自己搭建 GitLab 服务器;又或者可以使用 GitHub、开源中国 Git、阿里云 Git。
添加依赖

<!-- config-server依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <!-- 后续config-server做HA需要用到eureka-client -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

添加注解@EnableConfigServer

@SpringBootApplication
@EnableConfigServer

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

配置服务

#服务名称
spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/zzz/git_learning.git
          username: xxx
          password: yyy
          timeout: 5  #超时时间
          default-label: master #分支

#服务的端口号
server:
  port: 9100

#指定注册中心地址
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

Git 仓库中创建 product-service-test.yaml

server:
  port: 8772

# #服务的名称
# spring:
#   application:
#     name: product-service
#   cloud:
#     client:
#       ipAddress: 192.168.31.230
#   zipkin:
#     base-url: http://192.168.31.210:9411/
#   sleuth:
#     sampler:
#       probability: 1

# #指定注册中心地址
# eureka:
#   client:
#     serviceUrl:
#       defaultZone: http://localhost:8761/eureka/
#   instance:
#     preferIpAddress: true
#     instance-id: ${spring.cloud.client.ipAddress}:${server.port}:${spring.application.name}
env: test3
branch: master

访问配置中心如下: http://localhost:9100/product-service-test.yaml
配置中心访问规则

配置中心访问规则

/{label}/{application.name}-{profiles}.yml

  • name:服务器名称
  • profile:环境名称,开发、测试、生产
  • lable:仓库分支、默认 master 分支

支持多种格式的自动转换,只需更改文件的访问后缀即可。

  • /{application.name}-{profiles}.properties
  • /{application.name}-{profiles}.yml
  • /{application.name}-{profiles}.json

config 客户端使用

添加依赖

<!--config客户端依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-client</artifactId>
        </dependency>

配置服务:修改将 application.yaml 改为 bootstrap.yml

#server: #Provider服务监听的端口,service-id: CONFIG-SERVER
解析是需要用到注册中心
#  port: 8771

eureka: #指定注册中心地址
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true #调试Eureka管控台实例的显示格式
    instance-id: ${spring.cloud.client.ipAddress}:${server.port}:${spring.application.name}

spring: #服务的名称
  application:
      name: product-service
 #相当于访问路径中的application.name
  cloud:
    client:
      ipAddress: 192.168.31.230
    config:
      discovery:
        service-id: CONFIG-SERVER
        enabled: true
      profile: test
	#相当于访问路径中的profiles	用于 product-service-dev | product-service-test 
      #label: test   #建议用lable去区分环境,默认是lable是master分支

访问 Eureka 注册中心发现 product-service 端口已改变
配置生效

config 客户端原理分析

  1. 首先会取读取本地 bootstrap.yml,根器其中内容定位到注册中心
  2. 从注册中心获取 CONFIG-SERVER 的通信地址
  3. 客户端如果没有明确配置 label 属性,则以默认值为 master,以此值替代访问路径中的{label}部分
  4. 以客户端的服务名称作为访问路径中的{application.name}部分。
  5. 以 profile 属性设置的值为访问路径中的{profiles}部分。

作者:Soulboy