自建配置中心加持需求及解决思路
2017-12-26 15:10
309 查看
摘要: 配置中心
接上篇:https://my.oschina.net/u/3345762/blog/913605
上周自建的配置中心已推广至7个项目组中,其中已有2个项目应用至其生产环境,迎来了第一批内部客户,在使用的过程中还是出现了很多我们设计时没有预期到的问题或需求,下面进行简单梳理并给出解决问题的思路。说明:下文中的diamond(呆萌)为配置中心的简称,profile为应用机器环境,module为平行于profile的应用模块,直观点可以理解为各配置文件。
1、工程引入Java版diamond client后,将应用配置交由配置中心进行统一管理,工程在启动后发现spring mvc中的配置存在未被引入的情况,于是便将问题丢给了我们。
原因:排查了解后发现,这是由于spring及spring mvc之间的伪共享造成,spring mvc并不能直接使用spring容器中的properties,spring及spring mvc之前存在类似继承的关系,spring mvc可以使用spring中定义的bean,相反则不行。
解决方案:基于上述思路,我们可以将Properties在spring定义为一个Bean,然后在spring mvc文件中进行引用。给出client端中的该部分的使用文档。
创建spring bean:
spring mvc中引入:
2、client端同时兼容多种获取基础配置方式。
原则:client端暴露出现的基本使用配置不能太多,同时需支持properties文件形式、支持系统环境中设置配置变量形式,支持xml文件配置形式。
该需求相对容易解决,最终确定用户至少配置diamond.env(配置中心环境)和profile(机器环境),同时支持用户在client端配置ip和profile的映射关系,各配置方式的优先级分别为xml > properties > server端配置。
3、公共基础配置的抽离。
分为项目之间公共配置(主要是各中间件的配置),项目内部的公共配置抽离(不依赖项目的profile)
解决方案:针对第一种,将中间件的配置单独抽离,并以project的维度进行管理,每一个中间件可作为一个project,外部的项目可以引用中间件项目(为确保安全,需要中间件项目的所有者授权),具体执行方式为,在用户创建应用级别的project时,将diamond中已有的中间件peoject陈列出,用户可以选择引用,若用户选择引用某一中间件配置则需另外维护本项目中的peofile和被引用的中间件project的profile对应关系(不然diamond server无法判断client需要哪一环境的配置)。中间件项目被引用后,并不能立即生效,需要该中间件project的admin或者授权用户进行授权后方可使用。
针对第二种需求,可以给module(可以理解为不同的配置文件)进行归类,分为公共使用类别、一般类别,diamond server端在获取某一工程的配置时根据module的类别进行相应的逻辑判断、处理,最终获取到client端所需的配置。
4、开关类的控制配置
将不同工程的开关配置进行统一抽出管理单独授权,具体的使用方式和应用配置相同。
在机场候机写的,有点水~
接上篇:https://my.oschina.net/u/3345762/blog/913605
上周自建的配置中心已推广至7个项目组中,其中已有2个项目应用至其生产环境,迎来了第一批内部客户,在使用的过程中还是出现了很多我们设计时没有预期到的问题或需求,下面进行简单梳理并给出解决问题的思路。说明:下文中的diamond(呆萌)为配置中心的简称,profile为应用机器环境,module为平行于profile的应用模块,直观点可以理解为各配置文件。
1、工程引入Java版diamond client后,将应用配置交由配置中心进行统一管理,工程在启动后发现spring mvc中的配置存在未被引入的情况,于是便将问题丢给了我们。
原因:排查了解后发现,这是由于spring及spring mvc之间的伪共享造成,spring mvc并不能直接使用spring容器中的properties,spring及spring mvc之前存在类似继承的关系,spring mvc可以使用spring中定义的bean,相反则不行。
解决方案:基于上述思路,我们可以将Properties在spring定义为一个Bean,然后在spring mvc文件中进行引用。给出client端中的该部分的使用文档。
创建spring bean:
<bean id="propertyConfigurer" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> <property name="properties" ref="properties"/> </bean> <bean id="properties" class="java.util.Properties"> <constructor-arg ref="propertiesConfiguration"/> </bean> <bean id="propertiesConfiguration" class="com.best.diamond.client.PropertiesConfigurationFactoryBean"> <property name="configurationListener" ref="defaultConfigurationListener"/> </bean> <bean id="defaultConfigurationListener" class="com.best.diamond.client.event.listener.DefaultConfigurationListener"/>
spring mvc中引入:
<bean id="propertyConfigurer" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> <property name="properties" ref="properties"/> </bean>
2、client端同时兼容多种获取基础配置方式。
原则:client端暴露出现的基本使用配置不能太多,同时需支持properties文件形式、支持系统环境中设置配置变量形式,支持xml文件配置形式。
该需求相对容易解决,最终确定用户至少配置diamond.env(配置中心环境)和profile(机器环境),同时支持用户在client端配置ip和profile的映射关系,各配置方式的优先级分别为xml > properties > server端配置。
3、公共基础配置的抽离。
分为项目之间公共配置(主要是各中间件的配置),项目内部的公共配置抽离(不依赖项目的profile)
解决方案:针对第一种,将中间件的配置单独抽离,并以project的维度进行管理,每一个中间件可作为一个project,外部的项目可以引用中间件项目(为确保安全,需要中间件项目的所有者授权),具体执行方式为,在用户创建应用级别的project时,将diamond中已有的中间件peoject陈列出,用户可以选择引用,若用户选择引用某一中间件配置则需另外维护本项目中的peofile和被引用的中间件project的profile对应关系(不然diamond server无法判断client需要哪一环境的配置)。中间件项目被引用后,并不能立即生效,需要该中间件project的admin或者授权用户进行授权后方可使用。
针对第二种需求,可以给module(可以理解为不同的配置文件)进行归类,分为公共使用类别、一般类别,diamond server端在获取某一工程的配置时根据module的类别进行相应的逻辑判断、处理,最终获取到client端所需的配置。
4、开关类的控制配置
将不同工程的开关配置进行统一抽出管理单独授权,具体的使用方式和应用配置相同。
在机场候机写的,有点水~
相关文章推荐
- 自建配置中心现状及架构调整(二)
- rsync客户端以及服务器端配置,推送、数据拉取、定时备份以及常见错误解决思路
- 关于SSH框架整合中,数据库配置文件加密解决思路记载
- Oracle10g安装时检查网络配置需求未通过问题的解决方法
- Android Studio 开启配置混淆功能可能遇到的问题以及解决思路
- 自建配置中心现状及架构调整(一)
- Silverlight+IIS配置时遇到的几个错误及解决思路!
- oracle 10g 检查网络配置需求未通过问题的解决
- 携程Apollo(阿波罗)配置中心Spring Boot迁移日志组件,使用配置中心进行管理的思路
- 解决ArcGIS中因SDE或数据库配置问题而导致服务宕掉的一种思路
- 关于一个需求引发的事务操作和锁-记录解决过程和思路
- windows下安装oracle 10g 出现检查网络配置需求未通过问题的解决
- 产品和产品规格(产品变量)自动生成SKU的需求解决思路
- [Weblogic]startWebLogic.cmd配置JAVA_OPTIONS无效的解决思路与方案
- 在安装oracle 10g时,检查网络配置需求未执行的解决方法
- dubbo配置文件报错解决思路
- Jenkins配置git进行构建失败:Error cloning remote repo 'origin'的解决思路
- 另一种思路linux虚拟机非配置原因解决无法PING通网关
- spring cloud config 配置自建git服务器报错解决
- 生产者-消费者模型的解决思路——自建队列