最近一致在更新Spring Cloud Config的相关内容,主要也是为这篇埋个伏笔,相信不少调研过Spring Cloud Config的用户都会吐槽它的管理能力太弱。因此,就有了下面为讲推荐的这个开源项目,希望对已经入坑Spring Cloud Config的童鞋们有所帮助!

简介

在Spring Cloud的微服务架构方案中虽然提供了Spring Cloud Config来担任配置中心的角色,但是该项目的功能在配置的管理层面还是非常欠缺的。初期我们可以依赖选取的配置存储系统(比如:Gitlab、Github)给我们提供的配置管理界面来操作所有的配置信息,但是这样的管理还是非常粗粒度的,因此这个项目的目的就是解决这个问题,通过此项目,我们将提供一套基于Spring Cloud Config配置中心的可视化管理系统。

在该项目中,我们对于服务治理、配置存储、可视化操作都做了抽象,只要目的就是为了尽可能的兼容所有Spring Cloud Config的用户。任何Spring Cloud Config仅需要通过一些简单的配置,或者迁移工具就能将原来正在使用的配置中心统一的管理起来。

项目地址

如果您觉得该项目对您有用,欢迎Star、Follow支持我们!

架构概览

本项目采用了前后端分离的架构,通过core模块抽象了前端需要的操作,再通过persistence和discovery模块隔离不同的配置仓库和不同的服务注册中心,从而达到前端程序不需要关心到底使用了什么存储配置以及使用了什么注册中心,这样用户可以根据自己的需要自由的组合不同的配置存储和服务治理机制,尽可能的匹配大部分Spring Cloud用户的需求。

部署方式

由于SCCA的架构对各个功能模块做了比较细致的拆分,所以它存在多种不同模式的部署方式,所以它既可以为已经在使用Spring Cloud Config提供服务,也可以为从零开始使用Spring Cloud Config的用户。

在SCCA中我们的可部署内容自底向上分为三个部分:

  • Spring Cloud 配置中心:基于Spring Cloud Config构建的配置中心服务端。
  • SCCA REST 服务端:SCCA的核心模块,实现了SCCA配置管理的持久化内容以及所有的管理操作API。
  • SCCA UI 服务端:SCCA的前端模块,实现了可视化的配置管理操作界面。

下面我们来看看SCCA支持哪些多样的部署方式。

全分离模式

全分离模式就是将上述三个部分都以独立的进程进行部署,每一个部分都可以做高可用,具体部署结构可以如下图所示:

这种模式既可以适用于已经在使用Spring Cloud Config的用户,也适用于正准备开始适用的用户。其中,位于最底层的Spring Cloud配置中心就是一个最原始的Spring Cloud Config Server。所以,对于已经在使用Spring Cloud Config的用户只需要再部署一套SCCA REST 服务端SCCA UI 服务端,并做一些配置就可以使用SCCA来管理所有的配置信息了。

案例

半分离模式

所谓的半分离模式就是将上述的三个模块中的两个进行组合部署,以降低复杂度的部署方式。

SCCA UI模块与SCCA REST模块合并

如下图所示,我们可以将SCCA UI服务端SCCA REST服务端组合在一个程序中来部署,这样可以有效的降低全分离模式的部署复杂度,同时对于已经在使用Spring Cloud Config的用户来说非常友好,已经部署的配置中心可以继续沿用。

案例

注意:对接不同存储配置中心的配置参考分离部署中两个SCCA REST服务端的不同配置内容进行调整。

All-In-One模式

最后介绍一种比较暴力的使用模式,SCCA支持将所有三个模块整合在一起使用和部署,在一个Spring Boot应用中同时包含:Spring Cloud 配置中心SCCA REST 服务端以及SCCA UI 服务端,具体如下所示:

案例

配置详解

本章节分别对三个核心模块的构建方式以及核心的配置内容。下面所有的构建都是基于Spring Boot构建的,所以您需要对Spring Boot项目的构建有基本的认识,这里不做介绍。

Spring Cloud配置中心的构建与配置

在SCCA的架构中,配置中心的核心完全采用Spring Cloud Config,所以如何构建一个配置中心完全遵循Spring Cloud Config的使用方法。由于目前SCCA的REST模块主要实现了对Git存储和DB存储的综合管理,所以对于Spring Cloud Config的使用也只能支持这两种模式。下面分别介绍两种配置中心的搭建与配置。

Git存储模式

这里主要介绍几种主要的并且SCCA能够比较好支持的配置模式:

第一种:多个项目使用多个不同Git仓库存储的模式

spring.cloud.config.server.git.uri=https://github.com/dyc87112/{application}.git
spring.cloud.config.server.git.username=
spring.cloud.config.server.git.password=

这种模式下不同的项目会对应的不同的Git仓库,如果项目中spring.application.name=user-service,那么它的配置仓库会定位到https://github.com/dyc87112/user-service.git仓库下的配置。配置文件按application-{profile}.properties的格式存储,{profile}代表环境名。

第二种:多个项目公用一个Git仓库不同目录的存储模式

spring.cloud.config.server.git.uri=https://github.com/dyc87112/config-repo.git
spring.cloud.config.server.git.search-paths=/{application}
spring.cloud.config.server.git.username=
spring.cloud.config.server.git.password=

这种模式下不同的项目会对应到https://github.com/dyc87112/config-repo.git仓库下的不同目录,如果项目中spring.application.name=user-service,那么它的配置仓库会定位到https://github.com/dyc87112/config-repo.git仓库下的/user-service目录。配置文件按application-{profile}.properties的格式存储,{profile}代表环境名。

案例:Spring Cloud 配置中心(Git存储)

Db存储模式

在使用Db存储模式的时候,必须使用Spring Cloud的Edgware版本以上。比如,可以采用下面的配置:

# config server with jdbc
spring.profiles.active=jdbc
spring.cloud.config.server.jdbc.sql=SELECT `p_key`, `p_value` FROM property a, project b, env c, label d where a.project_id=b.id and a.env_id=c.id and a.label_id=d.id and b.name=? and c.name=? and d.name=? # Datasource, share with scca-rest-server
spring.datasource.url=jdbc:mysql://localhost:3306/config-db
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

主要分为两个部分:

  • 激活采用DB存储的模式:将spring.profiles.active设置为jdbc,同时指定获取配置的SQL,用户直接复制采用一样的配置即可。
  • 指定存储配置的DB连接信息,除了mysql之外也可以使用其他主流关系型数据库。

这里需要注意的,使用的DB要与后续介绍的SCCA REST模块采用同一个DB

案例:Spring Cloud 配置中心(DB存储)

SCCA REST服务端的构建与配置

在构建SCCA REST服务端的时候针对对接不同的配置存储有一些不同的配置要求,所以下面按目前支持的存储模式做不同的介绍。

Git存储模式

当对接的配置中心采用Git存储的时候,需要引入以下核心依赖:

<dependency>
<groupId>com.didispace</groupId>
<artifactId>scca-rest</artifactId>
<version>1.0.0-RELEASE</version>
</dependency> <!-- scca persistence dependency -->
<dependency>
<groupId>com.didispace</groupId>
<artifactId>scca-persistence-git</artifactId>
<version>1.0.0-RELEASE</version>
</dependency>

需要按如下配置:

# if config server use git, need config these properties
scca.git.username=
scca.git.password=
scca.git.repo-uri=https://github.com/dyc87112/{application}.git
scca.git.base-path=
scca.git.file-pattern=application-{profile}.properties # Datasource
spring.datasource.url=jdbc:mysql://localhost:3306/config-db
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

主要两部分:

  • 对接的git存储的配置:

    • scca.git.username:访问git的用户名
    • scca.git.password:访问git的密码
    • scca.git.repo-uri:配置git仓库的地址,与配置中心的spring.cloud.config.server.git.uri配置一致
    • scca.git.base-path:配置文件存储的相对路径,与配置中心的spring.cloud.config.server.git.search-paths配置一致
    • scca.git.file-pattern:配置文件的命名规则
  • SCCA内部逻辑的存储库数据源信息

案例:SCCA REST 服务端(对接Git存储的配置中心)

Db存储模式

当对接的配置中心采用Git存储的时候,需要引入以下核心依赖:

<dependency>
<groupId>com.didispace</groupId>
<artifactId>scca-rest</artifactId>
<version>1.0.0-RELEASE</version>
</dependency> <!-- scca persistence dependency -->
<dependency>
<groupId>com.didispace</groupId>
<artifactId>scca-persistence-db</artifactId>
<version>1.0.0-RELEASE</version>
</dependency>

需要按如下配置:

# Datasource
spring.datasource.url=jdbc:mysql://localhost:3306/config-db
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

需要注意,当配置中心采用DB存储的时候,这里的数据源需要一致

案例:SCCA REST 服务端(对接DB存储的配置中心)

服务发现支持

如果SCCA REST模块在访问配置中心的时候基于服务发现的话还需要引入对应的支持依赖和配置

与Eureka的整合

如果使用eureak,那么需要引入如下依赖:

<!-- scca discovery dependency-->
<dependency>
<groupId>com.didispace</groupId>
<artifactId>scca-discovery-eureka</artifactId>
<version>1.0.0-RELEASE</version>
</dependency>

并且在配置中加入eureka的配置,比如:

eureka.client.serviceUrl.defaultZone=http://eureka.didispace.com/eureka/

更多相关配置请参与Spring Cloud Netflix Eureka的配置文档。

与Consul的整合

如果使用consul,那么需要引入如下依赖:

<!-- scca discovery dependency-->
<dependency>
<groupId>com.didispace</groupId>
<artifactId>scca-discovery-consul</artifactId>
<version>1.0.0-RELEASE</version>
</dependency>

并且在配置中加入consul的相关配置,比如:

spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500

更多相关配置请参与Spring Cloud Consul的配置文档。

公共配置

SCCA REST模块还有一个特别的配置scca.rest.context-path=/xhr,该配置主要用来配置所有SCCA REST模块接口的前缀,该接口主要用于与SCCA UI模块对接时候使用,两边必须对接一致才能顺利对接。

SCCA UI服务端的构建与配置

SCCA UI服务端需要引入以下核心依赖:

<dependency>
<groupId>com.didispace</groupId>
<artifactId>scca-ui</artifactId>
<version>1.0.0-RELEASE</version>
</dependency>

另外,还需要在配置中指定具体要访问的SCCA REST模块的位置,主要有两种模式:

  • 指定地址的配置:
scca.ui.rest-server-url=http://localhost:10130
  • 基于服务发现的配置:
scca.ui.rest-server-name=scca-rest-server

除了上面的配置之后,还需要引入eureka或consul的依赖以及做对应的配置

最后,还有一个scca.ui.rest-server-context-path=/xhr配置,用来描述要访问的SCCA REST模块接口的前缀,与SCCA REST服务端的scca.rest.context-path=/xhr配置相对应。

案例:SCCA UI 服务端

管理功能

通过之前介绍的任何一个部署方式搭建了配置中心和管理端之后,我们就可以打开浏览器访问我们的UI模块实现对配置中心的管理了。

访问地址为:http://localhost:10032/admin/,ip与端口根据实际部署UI模块的情况进行调整。

系统配置

在管理各个项目的配置之前,我们需要先做一些基础配置,比如:环境的配置、环境所属的参数配置,加密相关的配置等。

环境配置

环境配置主要用来维护要使用SCCA统一管理的环境以及对应的Spring Cloud Config服务端信息。

如上图所示,通过“新增环境”按钮可以添加一个部署环境。当我们使用了Eureka、Consul等注册中心时,只需要配置注册中心的访问地址和配置中心的服务名以及配置中心访问的前缀,后续就可以方便的使用这个环境的配置中心来进行加密解密、拉取配置等一系列的操作了。

如果不采用服务发现的机制取找到配置中心,也可以将注册中心地址留空,配置中心服务名一栏直接配置访问注册中心的URL即可。

环境参数配置

环境参数配置主要用来配置每个环境所属的一些特有配置信息,比如:redis的地址,eureka的地址等等。这些配置信息将用户后续为各项目在各个环境配置的时候给予参考和快捷的替换操作提供元数据。

加密管理

加密管理主要用来维护一些通常需要加密的Key,这样可以在后续编辑配置内容的时候,方便的进行批量加密操作。

配置中心

在完成了上面的系统配置之后,用户就可以进入配置中心模块,这里会提供具体的管理配置内容的功能。目前主要有两部分组成:项目管理和配置管理。

项目管理

项目管理主要用来维护需要在各个环境部署的应用的配置信息,这里可以维护这个项目需要部署在什么环境,有多少配置的版本。

这里的三个基本概念与Spring Cloud Config的几个概念的对应关系如下:

  • 项目名称:application
  • 部署环境:profile
  • 配置版本:label

这里配置版本(label),我们会默认采用master。需要同时存在多个配置版本,实现灰度配置的时候,用户也可以自己添加label。

配置管理

配置管理功能是SCCA的核心,在这里用户可以方便对各个应用、各个环境、各个版本的配置进行编辑、加密等操作。同时,也提供了一些快捷的操作,比如:根据环境参数配置一键替换、根据加密Key清单实现一键加密、通过配置中心可以加载到的配置信息等(更多便捷功能持续添加中...)

客户端接入

本页主要提供给没有使用过Spring Cloud Config的用户阅读。如果您已经使用过Spring Cloud Config,那么客户端如何通过Spring Cloud Config的配置中心加载配置相信已经掌握,在使用本项目的时候,无非就是搭建SCCA-REST模块和SCCA-UI模块来帮助管理您目前的配置内容。

客户端加载

通过前面几节内容,如果您已经完成了SCCA中几个要素的搭建,下面就来看看如何创建一个Spring Boot项目并通过配置中心来加载配置信息。

绝对地址接入

1. 创建一个基本的Spring Boot项目,并在pom.xml中引入依赖

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

2. 创建应用主类

@SpringBootApplication
public class Application { public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
} }

3. 创建bootstrap.properties配置文件(也可以使用yaml可以)

spring.application.name=config-client
server.port=12000 spring.cloud.config.uri=http://localhost:10032/scca-config-server
spring.cloud.config.profile=stage
spring.cloud.config.label=master

上述配置参数与scca中维护元素的对应关系如下:

  • spring.application.name:对应scca中的项目名
  • spring.cloud.config.profile:项目配置的环境名
  • spring.cloud.config.label:项目配置的版本名
  • spring.cloud.config.uri:配置中心的访问绝对地址

服务发现接入

1. 创建一个基本的Spring Boot项目,并在pom.xml中引入依赖

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

上面以通过eureka做注册中心的依赖,如果用consul,只需要将spring-cloud-starter-eureka换成spring-cloud-starter-consul-discovery即可。

2. 创建应用主类

@EnableDiscoveryClient
@SpringBootApplication
public class Application { public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
} }

3. 创建bootstrap.properties配置文件(也可以使用yaml可以)

spring.application.name=config-client
server.port=12000 spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.serviceId=config-server
spring.cloud.config.profile=stage
spring.cloud.config.label=master

上述配置参数与scca中维护元素的对应关系如下:

  • spring.application.name:对应scca中的项目名
  • spring.cloud.config.profile:项目配置的环境名
  • spring.cloud.config.label:项目配置的版本名
  • spring.cloud.config.discovery.enabled:开启服务发现功能
  • spring.cloud.config.discovery.serviceId:配置中心的服务名

读取配置

通过上面的两种方式从配置中心拉取配置之后,在Spring Boot项目中就可以轻松的使用所有配置内容了,比如:

@RefreshScope
@RestController
public class TestController { @Value("${a.b.c}")
private String abc; @RequestMapping("/abc")
public String abc() {
return this.abc;
} }

两个主要注解的说明:

  • @Value("${a.b.c}"):读取配置key为a.b.c的value值
  • @RefreshScope:下面的配置信息可以通过/refresh端点实现动态刷新

其他参考

如果您还不了解Spring Cloud Config,您也可以阅读下面的几篇了解一下最原始的Spring Cloud Config配置中心和客户端接入方式

为Spring Cloud Config插上管理的翅膀的更多相关文章

  1. Spring Cloud官方文档中文版-Spring Cloud Config(上)

    官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#spring-cloud-feign 文中例子我做了一些测试在:http ...

  2. Spring Cloud官方文档中文版-Spring Cloud Config(上)-服务端(配置中心)

    官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#spring-cloud-feign 文中例子我做了一些测试在:http ...

  3. .NET Core微服务之基于Steeltoe使用Spring Cloud Config统一管理配置

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 =>  Steeltoe目录快速导航: 1. 基于Steeltoe使用Spring Cloud Eureka 2. 基于Steelt ...

  4. Spring Cloud Config 搭建Config 服务

    配置中心: open API 配置生效监控 一致性的K-V存储 统一配置的实时推送 配置全局恢复.备份.历史版本 高可用集群 通过config 获取配置,流程: 下面介绍,基于spring cloud ...

  5. 【Spring Cloud】Spring Cloud Config 实现分布式配置中心

    Spring Cloud Config 实现分布式配置中心 一.分布式配置中心 分布式系统中,往往拥有大量的服务应用,而每个应用程序都需要有对应的配置文件来协助完成服务环境初始化.运行.因此生产了大量 ...

  6. Spring Cloud Config整合Spring Cloud Kubernetes,在k8s上管理配置

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Kubernetes有专门的ConfigMap和Secret来管理配置,但它也有一些局限性,所以还是希望通过Spring C ...

  7. 史上最简单的SpringCloud教程 | 第六篇: 分布式配置中心(Spring Cloud Config)

    一.简介 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件. 在Spring Cloud中,有分布式配置中心组件spring cloud confi ...

  8. 【SpringCloud构建微服务系列】使用Spring Cloud Config统一管理服务配置

    一.为什么要统一管理微服务配置 对于传统的单体应用而言,常使用配置文件来管理所有配置,比如SpringBoot的application.yml文件,但是在微服务架构中全部手动修改的话很麻烦而且不易维护 ...

  9. 9.Spring Cloud Config统一管理微服务配置

    Spring Cloud Config统一管理微服务配置 9.1. 为什么要统一管理微服务配置 9.2. Spring Cloud Config简介 Spring Cloud Config为分布式系统 ...

随机推荐

  1. Object constraint language for code generation from activity models

    一.基本信息 标题:Object Constraint Language for Code Generation from Activity Models 时间:2018 出版源:Informatio ...

  2. jasperreports实现pdf文档的生成

    1.导入jar包(pom.xml构建) <dependencies> <dependency> <groupId>com.lowagie</groupId&g ...

  3. 使用django我的第一个简单项目流程

    项目概述:本项目实现的是员工提交需要审批的事情给老板(例如请假事件.某些具体事务需要老板确认事件等),老板确认或者拒绝该事件,员工登录员工自己的页面可以查询响应的状态信息. 代码实现概略:需要创建两个 ...

  4. jwt vs session 以rails 为例 (翻译部分)

    原文地址:https://pragmaticstudio.com/tutorials/rails-session-cookies-for-api-authentication 普通方式: 令牌为基础的 ...

  5. OC基础成员变量、属性变量、实例方法与类方法

    首先,为什么我们要定义一个新类呢?按照我的理解,就是为了抽象出来一个新的东西(也就是类),用来存储更多的数据变量和方法,一切类都直接或间接继承与NSObject. 在类的头文件里我们可以定义成员变量. ...

  6. 使用koa2+es6/7打造高质量Restful API

    前言 如今nodejs变得越来越火热,采用nodejs实现前后端分离架构已被多数大公司所采用. 在过去,使用nodejs大家首先想到的是TJ大神写的express.js,而发展到如今,更轻量,性能更好 ...

  7. 《python语言程序设计》_第5章_循环

    #5.1_引言 程序1: 结果: 程序2: 结果: sum is 45 ##注意整个循环语句都要内缩进循环内部 ##ctrl+c中止一个无限循环运行 程序清单5-1: 结果: #5.2.1_实例研究: ...

  8. 服务器windows2008系统登录报错:由于远程桌面服务当前正忙,因此无法完成您尝试的任务。请在...

    1.问题描述:windows server 2008服务器通过远程桌面登录时很慢,登录不进去,把远程桌面关掉后,再用远程桌面登录时,出现下图提示. 把服务器接上显示器键盘鼠标后,卡在系统登录的欢迎界面 ...

  9. java 的原码、补码、反码小总结

    先看一个代码吧: int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); 这个应该很熟悉吧,是 ja ...

  10. 用js实现贪吃蛇

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...