Spring Cloud 学习(26) --- Spring

2019-04-22  本文已影响0人  laiyy0728

Spring Cloud Config 是 Spring Cloud 微服务体系中的配置中心,是微服务中不可或缺的一部分,其能够很好的将程序中配置日益增多的各种功能的开关、参数的配置、服务器的地址等配置修改后实时生效、灰度发布,分环境、分集群管理配置等进行全面的集中化管理,有利于系统的配置管理、维护。

Spring Cloud Config 配置中心

配置中心对比

对比方面 重要性 SpringCloud Config Netflix archaius 携程 Apollo disconf
静态配置管理 基于 file 支持 支持
动态配置管理 支持 支持 支持 支持
统一管理 无,需要 git、数据库等 支持 支持
多维度管理 无,需要 git、数据库等 支持 支持
变更管理 无,需要 git、数据库等
本地配置缓存 支持 支持
配置更新策略
配置锁 支持 不支持 不支持 不支持
配置校验
配置生效时间 重启生效、手动刷新 手动刷新失效 实时 实时
配置更新推送 需要手动触发 需要手动触发 支持 支持
配置定时拉取 支持 配置更新目前依赖事件驱动,client 重启或者 server 推送操作
用户权限管理 无,需要 git、数据库等 支持 支持
授权、审核、审计 无,需要 git、数据库等 界面直接提供发布历史、回滚按钮 操作记录存在数据库中,但是无查询接口
配置版本管理 git 支持 操作记录存在数据库中,但是无查询接口
配置合规检测 不支持 不支持 支持(不完整)
实例配置监控 需要结合 spring admin 不支持 支持 支持,可以查看每个配置再哪台机器上加载
灰度发布 不支持 不支持 支持 不支持部分更新
告警通知 不支持 不支持 支持邮件方式告警 支持邮件方式告警
统计报表 不支持 不支持 不支持 不支持
依赖关系 不支持 不支持 不支持 不支持
支持 SpringBoot 原生支持 支持 与 SpringBoot 无关
支持 Spring Config 原生支持 支持 与 SpringBoot 无关
客户端支持 java java java、.net java
业务系统入侵 入侵性弱 入侵性弱 入侵性弱 入侵性弱、支持注解和 xml
单点故障 支持 HA 部署 支持 HA 部署 支持 HA 部署 支持 HA 部署、高可用由 zk 提供
多数据中心部署 支持 支持 支持 支持
配置界面 无,需要 git、数据库等 统一界面 统一界面

配置中心具备的功能

spring cloud 配置中心功能图

配置中心流转

配置中心各流程流转如图:


Spring cloud 配置中心流转图

配置中心支撑体系

配置中心的支撑体系大致有两类


Spring Cloud Config

Spring Cloud Config 概述

Spring Cloud Config 是一个集中化、外部配置的分布式系统,由服务端、客户端组成,它不依赖于注册中心,是一个独立的配置中心。Spring Cloud Config 支持多种存储配置信息的形式,目前主要有 jdbc、vault、Navicat、svn、git 等形式,默认为 git。

git 版工作原理

配置客户端启动时,会向服务端发起请求,服务端接收到客户端的请求后,根据配置的仓库地址,将 git 上的文件克隆到本地的一个临时目录中,这个目录是一个 git 的本地仓库,然后服务端再读取本地文件,返回给客户端。这样做的好处是:当 git 服务故障或网络请求异常时,保证服务端依然能正常工作。

Spring Cloud Config git 版工作原理

入门案例

config repo

使用 git 做配置中心的配置文件存储,需要一个 git 仓库,用于保存配置文件。 本例仓库地址: https://gitee.com/laiyy0728/config-repo

在仓库中,新建一个文件夹:config-simple,在文件夹内新建 3 个文件:config-simple-dev.ymlconfig-simple-test.ymlconfig-simple-prod.yml

Spring Cloud Simple Config

源码:https://gitee.com/laiyy0728/spring-cloud/tree/master/spring-cloud-config/spring-cloud-config-simple

config server

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>
spring:
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/laiyy0728/config-repo # git 仓库地址
          search-paths: config-simple # 从哪个文件夹下拉取配置
  application:
    name: spring-cloud-config-simple-server
server:
  port: 9090
@SpringBootApplication
@EnableConfigServer
public class SpringCloudConfigSimpleServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudConfigSimpleServerApplication.class, args);
    }
}

验证 config server

启动 config server,查看 endpoints mappings


Spring Cloud Config Endpoints

从 mappings 中,可以看出,访问获取一个配置的信息,有多种方式,尝试获取 /config-simple/config-simple.dev.yml 配置信息:

由接口获取配置详细信息

http://localhost:9090/config-simple/dev/masterhttp://localhost:9090/config-simple/dev

{
    "name": "config-simple",
    "profiles": [
        "dev"
    ],
    "label": "master",
    "version": "520b379e9c7f2e39bb56e599f914b6c08fe13c06",
    "state": null,
    "propertySources": [{
        "name": "https://gitee.com/laiyy0728/config-repo/config-simple/config-simple-dev.yml",
        "source": {
            "com.laiyy.gitee.config": "dev 环境,git 版 spring cloud config"
        }
    }]
}

由绝对文件路径获取配置文件内容

http://localhost:9090/master/config-simple-dev.ymlhttp://localhost:9090/config-simple-dev.yml

com:
  laiyy:
    gitee:
      config: dev 环境,git 版 spring cloud config

config client

在 config server 中获取配置文件以及成功,接下来需要在 config client 中,通过 config server 获取对应的配置文件

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

application.yml

spring:
  cloud:
    config:
      label: master
      uri: http://localhost:9090
      name: config-simple
      profile: dev
  application:
    name: spring-cloud-config-simple-client
server:
  port: 9091
// 用于从远程 config server 获取配置文件内容
@Component
@ConfigurationProperties(prefix = "com.laiyy.gitee")
public class ConfigInfoProperties {
    private String config;

    public String getConfig() {
        return config;
    }

    public void setConfig(String config) {
        this.config = config;
    }
}


// 用于打印获取到的配置文件内容
@RestController
public class ConfigController {

    private final ConfigInfoProperties configInfoProperties;

    @Autowired
    public ConfigController(ConfigInfoProperties configInfoProperties) {
        this.configInfoProperties = configInfoProperties;
    }

    @GetMapping(value = "/get-config-info")
    public String getConfigInfo(){
        return configInfoProperties.getConfig();
    }

}


// 启动类
@SpringBootApplication
public class SpringCloudConfigSimpleClientApplication {

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

}

验证 config client

启动 config client,观察控制台,发现 config client 拉取配置的路径是:http://localhost:8888 ,而不是在 yml 中配置的 localhost:9090。这是因为 boot 启动时加载配置文件的顺序导致的。boot 默认先加载 bootstrap.yml 配置,再加载 application.yml 配置。所以需要将 config server 配置移到 bootstrap.yml 中

Config client default fetch server

bootstrap.yml

spring:
  cloud:
    config:
      label: master  # 代表请求 git 哪个分支,默认 master
      uri: http://localhost:9090 # config server 地址
      name: config-simple # 获取哪个名称的远程文件,可以有多个,英文逗号隔开
      profile: dev # 代表哪个分支

application.yml

spring:
  application:
    name: spring-cloud-config-simple-client
server:
  port: 9091
config client remote server

访问 http://localhost:9091/get-config-info

get config info
上一篇下一篇

猜你喜欢

热点阅读