Spring Cloud Config采用数据库存储配置内容

在之前的《Spring Cloud构建微服务架构:分布式配置中心》一文中,我们介绍的Spring Cloud Server配置中心采用了Git的方式进行配置信息存储。这一设计巧妙的利用Git自身机制以及其他具有丰富功能的Git服务端产品,让Spring Cloud Server在配置存储和管理的上避开了很多与管理相关的复杂实现,使其具备了配置中心存储配置和读取配置的基本能力;而更上层的管理机制,由于不具备普遍适用性,所以Spring Cloud Server并没有自己去实现这部分内容,而是通过Git服务端产品来提供一部分实现,如果还需要更复杂的功能也能自己实现与定义。即便如此,对于Spring Cloud Server默认使用Git来存储配置的方案一直以来还是饱受争议。所以,本文将介绍一下Spring Cloud Config从Edgware版本开始新增的一种配置方式:采用数据库存储配置信息。

构建配置中心服务端

第一步:创建一个基础的Spring Boot项目,在pom.xml中引入几个主要依赖:

  • spring-cloud-config-server:配置中心的基础依赖
  • spring-boot-starter-jdbc:由于需要访问数据库,所以需要加载jdbc的依赖
  • mysql-connector-java:MySQL数据库的连接包
  • flyway-core:该内容非强制,主要用来管理schema(如果您不了解可以看一下这篇文章
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.11.RELEASE</version>
    <relativePath/>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-core</artifactId>
        <version>5.0.3</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.21</version>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Edgware.SR3</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

第二步:准备schema创建文件。在resources下创建schema目录,并加入V1__Base_version.sql文件,具体内容如下:

CREATE TABLE `properties` (
  `id` int(11) NOT NULL,
  `key` varchar(50) NOT NULL,
  `value` varchar(500) NOT NULL,
  `application` varchar(50) NOT NULL,
  `profile` varchar(50) NOT NULL,
  `label` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

该脚本会在程序运行时由flyway自动执行

第三步:创建应用主类,具体如下:

@EnableConfigServer
@SpringBootApplication
public class ConfigServerBootstrap {

    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(ConfigServerBootstrap.class);

        // 测试用数据,仅用于本文测试使用
        JdbcTemplate jdbcTemplate = context.getBean(JdbcTemplate.class);
        jdbcTemplate.execute("delete from properties");
        jdbcTemplate.execute("INSERT INTO properties VALUES(1, ‘com.didispace.message‘, ‘test-stage-master‘, ‘config-client‘, ‘stage‘, ‘master‘)");
        jdbcTemplate.execute("INSERT INTO properties VALUES(2, ‘com.didispace.message‘, ‘test-online-master‘, ‘config-client‘, ‘online‘, ‘master‘)");
        jdbcTemplate.execute("INSERT INTO properties VALUES(3, ‘com.didispace.message‘, ‘test-online-develop‘, ‘config-client‘, ‘online‘, ‘develop‘)");
        jdbcTemplate.execute("INSERT INTO properties VALUES(4, ‘com.didispace.message‘, ‘hello-online-master‘, ‘hello-service‘, ‘online‘, ‘master‘)");
        jdbcTemplate.execute("INSERT INTO properties VALUES(5, ‘com.didispace.message‘, ‘hello-online-develop‘, ‘hello-service‘, ‘online‘, ‘develop‘)");
    }

}

这里增加了一些测试用数据,以便于后续的配置读取验证。

第四步:配置application.properties,具体内容如下:

spring.application.name=config-server-db
server.port=10020

spring.profiles.active=jdbc

spring.cloud.config.server.jdbc.sql=SELECT `KEY`, `VALUE` from PROPERTIES where APPLICATION=? and PROFILE=? and LABEL=?

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

flyway.locations=/schema

这里主要涉及几个配置:

  • spring.profiles.active=jdbc:必须设置,将配置中心的存储实现切换到jdbc的方式
  • spring.cloud.config.server.jdbc.sql:非必须,这里由于采用mysql数据源,keyvalue是保留关键词,原生的实现语句会报错,所以需要重写一下这句查询语句(如果存储的表结构设计不同于上面准备的内容,也可以通过这个属性的配置来修改配置的获取逻辑)
  • spring.datasource.*:存储配置信息的数据源配置,这里采用mysql,开发者根据自己实际情况修改
  • flyway.locations:flyway加载schema创建sql的位置

服务端配置验证

完成了上一节内容之后,我们就已经构建一个通过数据酷来存储配置内容的配置中心了,下面我们可以通过配置中心暴露的端点来尝试读取配置。

第一步:先将上面构建的配置中心启动起来。

第二步:验证配置信息获取:

  • curl http://localhost:10020/config-client/stage/,获取信息config-client服务stage环境的配置内容,根据上面的数据准备,我们会获得如下返回内容:
{
    "name": "config-client",
    "profiles": [
    "stage"
    ],
    "label": null,
    "version": null,
    "state": null,
    "propertySources": [
        {
            "name": "config-client-stage",
            "source": {
            "com.didispace.message": "test-stage-master"
            }
        }
    ]
}
  • curl http://localhost:10020/hello-service/stage/develop,获取信息hello-service服务,stage环境,develop标签的配置内容,根据上面的数据准备,我们会获得如下返回内容:
{
    "name": "hello-service",
    "profiles": [
        "online"
    ],
    "label": "develop",
    "version": null,
    "state": null,
    "propertySources": [
        {
            "name": "hello-service-online",
            "source": {
                "com.didispace.message": "hello-online-develop"
            }
        }
    ]
}

关于如何访问Spring Cloud Config构建配置中心获取配置信息的详细内容

,可以查看前文:《Spring Cloud构建微服务架构:分布式配置中心》,本文不做详细介绍。

总结

本文主要具体介绍了在Spring Cloud Config在Edgware版本开始新增的JDBC存储的使用思路,具体使用实际上还有很多可以优化的空间,比如:索引的优化、查询语句的优化;如果还需要进一步定制管理,对于表结构的优化也是很有必要的。

最后,安利一个基于Spring Cloud Config的配置管理项目:https://github.com/dyc87112/spring-cloud-config-admin,正在紧锣密鼓的开发中,尽情期待!

本文示例

读者可以根据喜好选择下面的两个仓库中查看config-server-dbconfig-client两个项目:

如果您对这些感兴趣,欢迎star、follow、收藏、转发给予支持!

原文地址:https://www.cnblogs.com/didispace/p/9188645.html

时间: 2024-09-30 05:24:15

Spring Cloud Config采用数据库存储配置内容的相关文章

SpringCloud(3-3)Spring Cloud Config 云端存储配置信息

Spring Cloud Config 云端存储配置信息 Spring Cloud Config 具有中心化,版本控制,支持动态更新,平台独立,语言独立等特性.我们的例子:1.真正的数据存在Git等repository中,2.ScConfigServer从git获取相应信息,3.ScConfigClient从ScConfigServer获取相互之间的通信基于HTTP,TCP,UDP等协议. 一.创建并运行一个ScConfigServer应用 1.pom.xml <project xmlns=&quo

Spring Cloud Config分布式配置中心的使用和遇到的坑

分布式配置中心 为什么要有用分布式配置中心这玩意儿?现在这微服务大军已经覆盖了各种大小型企业,每个服务的粒度相对较小,因此系统中会出现大量的服务,每个服务都要有自己都一些配置信息,或者相同的配置信息,可能不同环境每个服务也有单独的一套配置,这种情况配置文件数量比较庞大,维护起来相当费劲,举个栗子: 在开发的过程中,一般数据库是开发环境数据库,所有服务DB的IP配置为:92.168.0.1,突然老大说,开发环境换了,DB的IP要修改,这下可不好受了,所有模块挨个修改DB的配置,就问你难受不难受?

spring cloud 入门系列七:基于Git存储的分布式配置中心--Spring Cloud Config

我们前面接触到的spring cloud组件都是基于Netflix的组件进行实现的,这次我们来看下spring cloud 团队自己创建的一个全新项目:Spring Cloud Config.它用来为分布式系统中的基础设施和微服务提供集中化的外部配置支持,分为服务端和客户端两个部分. 其中服务端也称为分布式配置中心,他是独立的微服务应用,用来连接配置仓库并为客户端提供获取接口(这些接口返回配置信息.加密.解密信息等): 客户端是微服务架构中的各个微服务应用或基础设施,它们通过制定的配置中心来管理

第八章 分布式配置中心:Spring Cloud Config

Spring Cloud Config 是 Spring Cloud 团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持, 它分为服务端与客户端两个部分. 其中服务端也称为分布式配置中心, 它是一个独立的微服务应用, 用来连接配置仓库并为客户端提供获取配置信息. 加密/解密信息等访问接口:而客户端则是微服务架构中的各个微服务应用或基础设施, 它们通过指定的配置中心来管理应用资源与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息. Spring

跟我学SpringCloud | 第六篇:Spring Cloud Config Github配置中心

SpringCloud系列教程 | 第六篇:Spring Cloud Config Github配置中心 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如无特殊说明,本系列教程全采用以上版本 随着分布式项目越来越大,勤劳的程序猿们会开始面临一个挑战,配置文件会越来越繁杂,虽然spring提供了一个鸡肋版的解决方案,spring.profiles.active,在大型的分布式项目体系中,聊胜于无吧,手动维护配置文件的痛苦,生产,UAT,测

Spring cloud config综合整理

Spring Cloud Config为分布式系统中的外部化配置提供服务器和客户端支持.使用Config Server,您可以在所有环境中管理应用程序的外部属性.客户端和服务器上的概念映射与Spring Environment和PropertySource抽象相同,因此它们非常适合Spring应用程序,但可以与任何语言运行的任何应用程序一起使用.当应用程序通过部署管道从开发到测试并进入生产时,您可以管理这些环境之间的配置,并确保应用程序具有迁移时需要运行的所有内容.服务器存储后端的默认实现使用g

Spring cloud config 用SVN做配置仓库

很多企业还没使用Git仓库来管理代码,而是使用SVN.在Spring cloud 实现配置管理的时候,就需要另外配置,跟官方Sample 有点区别. 接下来操作步骤有: 1.创建SVN 配置repo 2.开发服务端 3.开发客户端 4.刷新客户端 话不多说,上干货. 1. 创建SVN 配置repo 目录结果如下: 文件名称,暂时不纠结,往后看(MARK). cloud-config-test.properties 内容: payment.username=test_update_Angus_zh

Spring Cloud Config 配置中心 自动加解密功能

使用  jasypt-spring-boot-starter  进行加解密功能. 整个流程说明: 配置一个 spring cloud config server ,将要使用的配置文件存放到github上,然后从这个配置源拿配置. 我们使用 jasypt 进行自动加解密,将需要加密的数据,通过jasypt进行加密,然后将该内容放入 github.如下图: 使用 ENC() 将加密后的原文包裹,这样spring cloud config client 客户端拿到这个串之后,会自动解密,拿到原文. 下

Spring Cloud Config - RSA简介以及使用RSA加密配置文件

简介 RSA非对称加密有着非常强大的安全性,HTTPS的SSL加密就是使用这种方法进行HTTPS请求加密传输的.因为RSA算法会涉及Private Key和Public Key分别用来加密和解密,所以称为非对称加密.Private Key和Public Key有互操作性,即用private key加密的可以用public key解密,用public key加密的可以用private key解密.传统的单向认证则只用public key进行加密,有private key的一方才可进行解密.例如,一