简介
在Spring Cloud的微服务架构方案中虽然提供了Spring Cloud Config来担任配置中心的角色,但是该项目的功能在配置的管理层面还是非常欠缺的。初期我们可以依赖选取的配置存储系统(比如:Gitlab、Github)给我们提供的配置管理界面来操作所有的配置信息,但是这样的管理还是非常粗粒度的,因此这个项目的目的就是解决这个问题,通过此项目,我们将提供一套基于Spring Cloud Config配置中心的可视化管理系统。
在该项目中,我们对于服务治理、配置存储、可视化操作都做了抽象,只要目的就是为了尽可能的兼容所有Spring Cloud Config的用户。任何Spring Cloud Config仅需要通过一些简单的配置,或者迁移工具就能将原来正在使用的配置中心统一的管理起来。
- 当前版本:1.1.0-RELEASE
- 发布版本:点击查看
架构概览
本项目采用了前后端分离的架构,通过core模块抽象了前端需要的操作,再通过persistence和discovery模块隔离不同的配置仓库和不同的服务注册中心,从而达到前端程序不需要关心到底使用了什么存储配置以及使用了什么注册中心,这样用户可以根据自己的需要自由的组合不同的配置存储和服务治理机制,尽可能的匹配大部分Spring Cloud用户的需求。
核心模块
在SCCA中从部署角度主要分为以下三个部分:
SCCA-CONFIG模块
:基于Spring Cloud Config原声的配置中心服务端,配合SCCA中针对不同存储实现的扩展(增强对不同配置存储介质的控制能力)搭建。SCCA-REST模块
:SCCA的核心模块,实现了SCCA配置管理逻辑控制和对外操作接口。SCCA-UI模块
:SCCA的前端模块,实现了可视化的配置管理操作界面。
以上的每一个模块都可以通过构建一个简单的Spring Boot应用,然后通过加入SCCA的依赖和简单配置就可独立的部署运行。
部署指南
由于SCCA的架构对各个功能模块做了比较细致的拆分,所以它可以存在多种不同模式的部署方式,这样使得SCCA可以很方便为已经在使用Spring Cloud Config的用户进行整合增强,也可以为从零开始使用Spring Cloud Config的用户提供服务。
全分离与半分离模式
首先介绍两种对Spring Cloud Config的既有用户非常友好的部署模式:全分离模式和半分离模式。由于这两种模式的部署有一个共同特点:Spring Cloud Config的配置中心是独立部署的,就跟我们使用原生的Spring Cloud Config Server一样。所以,用户需要对已经部署的配置中心简单的加入一些依赖和配置,让原生的Spring Cloud Config Server具备一些额外的能力,以提供SCCA的管理端调用就能完美的整合SCCA实现更多的管理能力了。
全分离部署
全分离模式就是将SCCA中的三个核心模块都以独立的进程进行部署,每一个部分都可以独立运行和升级,各自实现高可用,达到业务应用与管理实现的隔离,具体部署结构如下图所示:
其中,位于最底层的Spring Cloud配置中心
就是一个最原始的Spring Cloud Config Server,通过整合scca提供的插件,让其提供更多控制能力。另外,用户还需要再部署一套SCCA-REST模块
和SCCA-UI模块
即可。
-
案例
根据采用的不是存储模式,可以在scca项目下的以下目录中查看构建示例
- DB存储模式:
scca-use-case-client-db/full-separation
- Git存储模式:
scca-use-case-client-git/full-separation
- DB存储模式:
半分离部署
所谓的半分离模式就是将全分离部署中的SCCA-UI模块
与SCCA-REST模块
实现组合部署,以降低复杂度的部署方式。具体部署结构如下图所示:
案例
根据采用的不是存储模式,可以在scca项目下的以下目录中查看构建示例:
- DB存储模式:
scca-use-case-client-db/half-separation
- Git存储模式:
scca-use-case-client-git/half-separation
由于在全分离模式和半分离模式中配置中心的构建是一样的,所以在上述案例中,完全可以使用全分离模式的配置中心
All-In-One模式
最后介绍一种比较暴力的使用模式,SCCA支持将所有三个模块整合在一起使用和部署,即:在一个Spring Boot应用中同时包含:配置中心
、SCCA-REST模块
以及SCCA-UI模块
,具体如下所示:
案例
根据采用的不是存储模式,可以在scca项目下的以下目录中查看构建示例
- DB存储模式:
scca-use-case-client-db/all-in-one
- Git存储模式:
scca-use-case-client-git/all-in-one
配置详解
本章节分别对三个核心模块的构建方式以及核心的配置内容。下面所有的构建都是基于Spring Boot构建的,所以您需要对Spring Boot项目的构建有基本的认识,这里不做介绍。
SCCA-CONFIG模块的构建
在SCCA的架构中,配置中心的核心完全采用Spring Cloud Config,所以如何构建一个配置中心完全遵循Spring Cloud Config的使用方法,另外要做的就是引入SCCA提供的插件依赖。由于目前SCCA的REST模块主要实现了对Git存储和DB存储的综合管理,所以对于Spring Cloud Config的使用也只能支持这两种模式。下面分别介绍两种配置中心的搭建与配置。
Git存储模式
增强插件引入
需要在配置中心加入scca对Git存储的控制增强插件:
<dependency>
<groupId>com.didispace</groupId>
<artifactId>scca-plugin-git</artifactId>
<version>1.1.0-RELEASE</version>
</dependency>
仓库配置建议
这里主要介绍几种主要的并且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}
代表环境名。
Db存储模式
在使用Db存储模式的时候,必须使用Spring Cloud的Edgware版本以上。
增强插件引入
<dependency>
<groupId>com.didispace</groupId>
<artifactId>scca-plugin-db</artifactId>
<version>1.1.0-RELEASE</version>
</dependency>
数据源配置
比如,可以采用下面的配置:
# 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
注意还需要在pom.xml中引入相关数据库的驱动依赖
SCCA-REST模块的构建
在构建SCCA REST服务端的时候针对对接不同的配置存储有一些不同的配置要求,所以下面按目前支持的存储模式做不同的介绍。
Git存储模式
当对接的配置中心采用Git存储的时候,需要引入以下核心依赖:
<dependency>
<groupId>com.didispace</groupId>
<artifactId>scca-rest</artifactId>
<version>1.1.0-RELEASE</version>
</dependency>
<!-- scca persistence dependency -->
<dependency>
<groupId>com.didispace</groupId>
<artifactId>scca-persistence-git</artifactId>
<version>1.1.0-RELEASE</version>
</dependency>
Db存储模式
当对接的配置中心采用Git存储的时候,需要引入以下核心依赖:
<dependency>
<groupId>com.didispace</groupId>
<artifactId>scca-rest</artifactId>
<version>1.1.0-RELEASE</version>
</dependency>
<!-- scca persistence dependency -->
<dependency>
<groupId>com.didispace</groupId>
<artifactId>scca-persistence-db</artifactId>
<version>1.1.0-RELEASE</version>
</dependency>
配置数据源
SCCA-REST模块依赖数据库,所以它还需要皮质数据源,该数据源不会存储具体的业务应用配置内容,只存储SCCA所有管理数据。
# 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
服务发现支持
如果SCCA REST模块在访问配置中心的时候基于服务发现的话还需要引入对应的支持依赖和配置
与Eureka的整合
如果使用eureak,那么需要引入如下依赖:
<!-- scca discovery dependency-->
<dependency>
<groupId>com.didispace</groupId>
<artifactId>scca-discovery-eureka</artifactId>
<version>1.1.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.1.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.1.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
配置相对应。
管理功能
通过之前介绍的任何一个部署方式搭建了配置中心和管理端之后,我们就可以打开浏览器访问我们的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配置中心和客户端接入方式