分布式系统中处理参数配置的 4 种方案

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 一个系统中包含有各种各样的配置信息,如一个日志文件需要配置以下几个信息。日志文件生成主目录日志文件名称,不同的日志级别对应不同的文件当前日志级别还有其他各种业务参数、系统参数等,大多单一系统是直接把这些配置写死在配置文件中,当部署到测试、生产环境就再修改下配置文件,这样很容易出错,也不能灵活修改。

一个系统中包含有各种各样的配置信息,如一个日志文件需要配置以下几个信息。

日志文件生成主目录

日志文件名称,不同的日志级别对应不同的文件

当前日志级别

还有其他各种业务参数、系统参数等,大多单一系统是直接把这些配置写死在配置文件中,当部署到测试、生产环境就再修改下配置文件,这样很容易出错,也不能灵活修改。还有就是系统变成分布式系统后,子系统越来越多,你要维护这些配置就变得越来越困难。

我觉得至少要能解决以下几个问题才能算优秀!

1)能在线灵活修改配置

2)能在线动态刷新配置

3)能根据不同环境配置

4)能统一管理维护配置

那么如何灵活维护这些配置呢?我给大家总结了一下几类方法,根据不同的应用场大家参考一下。

1、数据库法

把所有参数存储到数据库,系统启动的时候加载到内存。

这种实现方式比较简单,但需要占用数据库资源,系统简单压力较小时可以选用此种方式。

2、打包处理法

利用 Maven 的 maven-resources-plugin 插件,然后根据不同的环境(Profile)提供不同环境的配置文件,这样,不同环境的配置信息在打包阶段就决定好了。

这样只能解决了不同操作系统上面的配置,不能灵活动态修改,每次更新只能重新打包或者在线修改配置文件,而且信息也难于同步,如果项目少还好,项目多起来,配置还要经常变动,这样变得异常烦琐。

3、环境变量法

可以把属性值设置到环境变量中,然后读取后设置到 Java 系统属性中。这种可以实现区分不同环境的目的,但仍然不能动态更新配置,而且配置和维护环境变量相当麻烦,并且在分布式系统中更是个十分头疼的问题。

// 读取环境变量

java.lang.System#getenv(java.lang.String)

// 设置系统属性

java.lang.System#setProperty

这种方法,一些全局的系统配置,如日志、缓存、临时目录等可以参考,主流日志系统都支持从 system properties 中读取配置。其他一些配置,不建议存储在环境变量中。

4、配置中心法

1)目前大多数分布式配置中心都是基于 Zookeeper 来实现的,Spring Cloud 有自己的配置中心组件,它们都支持在线动态更新和刷新配置。

2)直接把配置存放在数据库,如果系统并发小的或者管理类系统的话可以参考,对于高并发应用不建议用数据库做配置中心,毕竟它会带来访问压力,而且实现动态更新配置也比较复杂。

总结

这是我们目前应用的 4 种配置方法,很显然,配置中心是最佳的解决方案,也解决了以上的几个问题,但需要依赖中间件及其高可用性,如果你有其他更好的方式,欢迎留言。

欢迎工作一到五年的Java工程师朋友们加入Java填坑之路:860113481

群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
14天前
|
消息中间件 SQL 中间件
大厂都在用的分布式事务方案,Seata+RocketMQ带你打破10万QPS瓶颈
分布式事务涉及跨多个数据库或服务的操作,确保数据一致性。本地事务通过数据库直接支持ACID特性,而分布式事务则需解决跨服务协调难、高并发压力及性能与一致性权衡等问题。常见的解决方案包括两阶段提交(2PC)、Seata提供的AT和TCC模式、以及基于消息队列的最终一致性方案。这些方法各有优劣,适用于不同业务场景,选择合适的方案需综合考虑业务需求、系统规模和技术团队能力。
103 7
|
20天前
|
缓存 NoSQL Java
Spring Boot中的分布式缓存方案
Spring Boot提供了简便的方式来集成和使用分布式缓存。通过Redis和Memcached等缓存方案,可以显著提升应用的性能和扩展性。合理配置和优化缓存策略,可以有效避免常见的缓存问题,保证系统的稳定性和高效运行。
37 3
|
18天前
|
消息中间件 架构师 数据库
本地消息表事务:10Wqps 高并发分布式事务的 终极方案,大厂架构师的 必备方案
45岁资深架构师尼恩分享了一篇关于分布式事务的文章,详细解析了如何在10Wqps高并发场景下实现分布式事务。文章从传统单体架构到微服务架构下分布式事务的需求背景出发,介绍了Seata这一开源分布式事务解决方案及其AT和TCC两种模式。随后,文章深入探讨了经典ebay本地消息表方案,以及如何使用RocketMQ消息队列替代数据库表来提高性能和可靠性。尼恩还分享了如何结合延迟消息进行事务数据的定时对账,确保最终一致性。最后,尼恩强调了高端面试中需要准备“高大上”的答案,并提供了多个技术领域的深度学习资料,帮助读者提升技术水平,顺利通过面试。
本地消息表事务:10Wqps 高并发分布式事务的 终极方案,大厂架构师的 必备方案
|
25天前
|
NoSQL 安全 PHP
hyperf-wise-locksmith,一个高效的PHP分布式锁方案
`hyperf-wise-locksmith` 是 Hyperf 框架下的互斥锁库,支持文件锁、分布式锁、红锁及协程锁,有效防止分布式环境下的竞争条件。本文介绍了其安装、特性和应用场景,如在线支付系统的余额扣减,确保操作的原子性。
26 4
|
26天前
|
数据库
如何在Seata框架中配置分布式事务的隔离级别?
总的来说,配置分布式事务的隔离级别是实现分布式事务管理的重要环节之一,需要认真对待和仔细调整,以满足业务的需求和性能要求。你还可以进一步深入研究和实践 Seata 框架的配置和使用,以更好地应对各种分布式事务场景的挑战。
28 6
|
1月前
|
NoSQL 算法 关系型数据库
分布式 ID 详解 ( 5大分布式 ID 生成方案 )
本文详解分布式全局唯一ID及其5种实现方案,关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
分布式 ID 详解 ( 5大分布式 ID 生成方案 )
|
2月前
|
存储 缓存 NoSQL
分布式架构下 Session 共享的方案
【10月更文挑战第15天】在实际应用中,需要根据具体的业务需求、系统架构和性能要求等因素,选择合适的 Session 共享方案。同时,还需要不断地进行优化和调整,以确保系统的稳定性和可靠性。
|
2月前
|
分布式计算 Hadoop
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
52 1
|
2月前
|
SQL NoSQL 安全
分布式环境的分布式锁 - Redlock方案
【10月更文挑战第2天】Redlock方案是一种分布式锁实现,通过在多个独立的Redis实例上加锁来提高容错性和可靠性。客户端需从大多数节点成功加锁且总耗时小于锁的过期时间,才能视为加锁成功。然而,该方案受到分布式专家Martin的质疑,指出其在特定异常情况下(如网络延迟、进程暂停、时钟偏移)可能导致锁失效,影响系统的正确性。Martin建议采用fencing token方案,以确保分布式锁的正确性和安全性。
56 0
|
2月前
|
存储 SQL 消息中间件
Hadoop-26 ZooKeeper集群 3台云服务器 基础概念简介与环境的配置使用 架构组成 分布式协调框架 Leader Follower Observer
Hadoop-26 ZooKeeper集群 3台云服务器 基础概念简介与环境的配置使用 架构组成 分布式协调框架 Leader Follower Observer
53 0