将SpringCloud ConfigServer持久化存储改为MySQL

原文发布于:http://www.gufeng.tech/

1.背景

SpringCloud的ConfigServer默认是持久化使用的是git。git有它天然的优势,比如多版本管理、分支管理、提交审核策略等等,但是如果相对其中存储的数据做细粒度的权限控制,就力不从心了。当然,也可以改变使用方式以适应这种特点,但是今天我们要做的是将持久化从git迁移到MySQL上。

2.查询配置信息

ConfigServer有个接口:org.springframework.cloud.config.server.environment.EnvironmentRepository,这个接口的实现类就是ConfigServer的用来查询配置信息的,方法签名如下:

Environment findOne(String application, String profile, String label);

我们可以实现这个接口,在方法实现中查询MySQL,由此看来,我们已经成功一半了,另一半就是解决如何把数据存到MySQL中。我们还是先解决查询的问题,我们实现该方法内容如下:

public class DatabasesEnvironmentRepository implements EnvironmentRepository {

    @Autowired private ConfigService configService;

    @Override    public Environment findOne(String application, String profile, String label) {        if (StringUtils.isEmpty(application) || StringUtils.isEmpty(profile))            return null;
        ConfigItem configItem = configService.findConfig(application, profile, label);        if (configItem != null) {
            Environment environment = new Environment(application, StringUtils.commaDelimitedListToStringArray(profile),
                    label, configItem.getVersion());

            Map map = new HashMap<>();            for (ConfigProperty configProperty : configItem.getConfigProperties()) {
                map.put(configProperty.getKey(), configProperty.getValue());
            }

            environment.add(new PropertySource(application + "_" + profile + "_" + label, map));            return environment;
        }        return new Environment(application, StringUtils.commaDelimitedListToStringArray(profile));
    }

}

接下来我们看一下ConfigService类的内容:

@Servicepublic class ConfigService {

    @Autowired private ConfigDAO configDAO;    public ConfigItem findConfig(String application, String profile, String label) {
        ConfigItem configItem = configDAO.findConfig(application, profile, label);        if (null == configItem) {            return null;
        }
    List configProperties = configDAO.findConfigProperties(configItem.getId());
        configItem.setConfigProperties(configProperties);        return configItem;
    }

}

最后我们看一下ConfigDAO的实现:

@Mapperpublic interface ConfigDAO {

    @Select("select * from config_item where application = #{application} and profile = #{profile} and label = #{label}")
    List findConfigProperties(@Param("application") String application, @Param("profile") String profile, @Param("label") String label);

}

这里我们使用的是MyBatis的注解方式,关于MyBatis的注解使用详细内容请查阅相关文档。

3.数据库相关功能

我们首先看下数据源的配置:

@Configurationpublic class DataSourceConfiguration {

    @Value("${jdbc.driver}")    private String driver;
    @Value("${jdbc.url}")    private String url;
    @Value("${jdbc.username}")    private String username;
    @Value("${jdbc.password}")    private String password;
    @Value("${jdbc.maxActive}")    private int maxActive;
    @Value("${jdbc.maxIdel}")    private int maxIdel;
    @Value("${jdbc.maxWait}")    private long maxWait;

    @Bean    public BasicDataSource dataSource(){
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setMaxTotal(maxActive);
        dataSource.setMaxIdle(maxIdel);
        dataSource.setMaxWaitMillis(maxWait);
        dataSource.setValidationQuery("SELECT 1");
        dataSource.setTestOnBorrow(true);        return dataSource;
    }

}

接下来看一下MyBatis的配置信息(当然,也可以使用SpringJDBC来实现):

@Configuration
@EnableTransactionManagement//支持事务
public class MyBatisConfig implements TransactionManagementConfigurer {

    @Autowired private DataSource dataSource;

    @Override    public PlatformTransactionManager annotationDrivenTransactionManager() {        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "sqlSessionFactory")    public SqlSessionFactory sqlSessionFactoryBean() {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);        try {            return bean.getObject();
        } catch (Exception e) {
            e.printStackTrace();            throw new RuntimeException(e);
        }
    }

    @Bean    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

最后看一下ConfigProperty中都有哪些内容呢?至少包括以下内容:application, profile, label, key, value,其它内容可以根据实际需要增减。

这里提供两种思路供参考:

一:在ConfigPropertity对应的表里存储当前使用的配置及历史配置,通过版本(或者状态位)加以区分,使用状态位的好处是整体存储数量会少一下,使用版本的好处是一下就能够查到某个历史版本的数据而不需要经过分析;

二:分两张表,一掌存储当前生效正在使用的配置信息,另一张表用来存储历史配置信息,每次有变化时都同时写入两张表,历史表采用追加的方式,当前表采用更新的方式。

以上就是把ConfigServer的持久化存储从git改到MySQL的一种做法。

时间: 2024-10-26 12:46:59

将SpringCloud ConfigServer持久化存储改为MySQL的相关文章

Apache Stratos Mock架构及持久化存储卷的映射

Apache Stratos Mock IaaS 简介 Apache Stratos 支持许多基础设施作为服务 (IaaS) 的平台:EC2,OpenStack,vCloud,CloudStack,Docker等.然而,设立IaaS 或购买公共 IaaS 服务对于尝试Stratos来说是额外的开销.此外,设置本地 IaaS 需要大量的硬件资源和购买公有云上的IaaS账户所涉及的成本.这些对尝试Stratos带来了障碍 Stratos. 通过引入Docker/Kubernetes来支持Linux容

使用Merge存储引擎实现MySQL分表

一.使用场景 Merge表有点类似于视图.使用Merge存储引擎实现MySQL分表,这种方法比较适合那些没有事先考虑分表,随着数据的增多,已经出现了数据查询慢的情况. 这个时候如果要把已有的大数据量表分开比较痛苦,最痛苦的事就是改代码.所以使用Merge存储引擎实现MySQL分表可以避免改代码. Merge引擎下每一张表只有一个MRG文件.MRG里面存放着分表的关系,以及插入数据的方式.它就像是一个外壳,或者是连接池,数据存放在分表里面. 对于增删改查,直接操作总表即可. 二.建表 1.用户1表

iOS开发之数据持久化存储

概论 数据持久化存储:所谓持久化存储就是将数据保存到硬盘中,使得应用程序或者机器在重启后可以访问之前保存的数据. 常见方式: plist文件(属性列表) preference(偏好设置) NSKeyedArchiver(归档) SQLite3(数据库) CoreData(苹果基于数据库封装的持久化存储工具,这种方式效率不高,因为会帮我们动态生成很多重复的代码,我只有写XMPP的时候会用一下,因为XMPP里面的存储用的就是CoreData) 沙盒 说到持久化存储就不得不说一下苹果的沙盒机制,苹果的

持久化存储 --- SQLite3 的使用

一.为什么要使用SQLite3,什么是SQLite3,常见的数据库可以用于移动端嘛? 1.持久化存储的方式有以下几种: 1.plist 只能存储NSDictionary 和NSArray的数据. 2.Preference 偏好设置NSUserDefaults,存取方便,但只能存储小数据. 3.NSCoding (NSKeyedArchiver\NSkeyedUnarchiver)归档可以存储大数据,但是不方便存取,每次存储都会覆盖上一次的内容. 4.SQLite3 重点,存储速度快,而且可以存储

数据持久化存储

概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) preference(偏好设置) NSKeyedArchiver(归档) SQLite 3 CoreData 沙盒 在介绍各种存储方法之前,有必要说明以下沙盒机制.iOS程序默认情况下只能访问程序自己的目录,这个目录被称为“沙盒”. 1.结构 既然沙盒就是一个文件夹,那就看看里面有什么吧.沙盒的目

日志缓冲必须被刷新持久化存储

日志缓冲必须被刷新持久化存储,以确保提交的事务完全被持久化了,如果和持久化相比更在乎性能,可以修改innodb_flush_log_at_trx_commit变量来控制日志缓冲拴心的频繁程度,可能的设置如下: 0  把日志缓冲写到日志文件,并且每秒钟刷新一次,但是事务提交时不做任何事. 1 将日志缓冲写到日志文件,并且每次提交事务都刷新到持久化存储,这是默认的(并且是最安全的)设置,该设置能保证不会丢失任何已经提交的事务,除非磁盘或操作系统是“伪”刷新的. 2 每次提交时把日志缓冲写到日志文件,

架构设计:系统存储(16)——Redis事件订阅和持久化存储

接上文<架构设计:系统存储(15)--Redis基本概念和安装使用> 3-4.事件功能和配置项 Redis从2.X版本开始,就支持一种基于非持久化消息的.使用发布/订阅模式实现的事件通知机制.所谓基于非连接保持,是因为一旦消息订阅者由于各种异常情况而被迫断开连接,在其重新连接后,其离线期间的事件是无法被重新通知的(一些Redis资料中也称为即发即弃).而其使用的发布/订阅模式,意味着其机制并不是由订阅者周期性的从Redis服务拉取事件通知,而是由Redis服务主动推送事件通知到符合条件的若干订

Android数据持久化存储

Android数据持久化存储共有四种方式,分别是文件存储.SharedPreferences.Sqlite数据库和ContentProvider.在本篇幅中只介绍前面三种存储方式,因为ContentProvider属于android四大组件之一,所以它的数据存储方式在介绍四大组件的时候说明. 1.文件存储 文件存储不对存储的内容进行任何的格式化处理,所有数据都是原封不动地保存到文件当中的,因而它比较适合用于存储一些简单的文本数据或二进制数据. 文件存储有两种方式,一是存储到手机内存中(memor

redis的数据持久化存储

redis的数据持久化存储 Redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到硬盘来保证持久化.Redis支持两种持久化方式: 一.snapshotting(快照)方式快照是默认的持久化方式.这种方式是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb.我们可以配置redis在n秒内如果超过若干个key被修改就自动做快照持久保存. 在约87行,有默认的快照策略(指定在多长时间内,有多少次更新操作,就将数据同步到数据快照文件,可以多个条件