项目参数外部配置化_第1页
项目参数外部配置化_第2页
项目参数外部配置化_第3页
已阅读5页,还剩9页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、项目参数外部配置化开发一个项目, 参数是必不可少的, 规模越大参数越多。 在不同的测试环境中部署,或者是依赖项目的信息发生了变 化,你有没有想跳楼的感觉?如果有,恭喜你,你至少已经 不是在开发玩具系统了。本文试图列举一些配置参数的方法,希望对你的项目有所帮 助。一、可用性模式 -外部配置 引用自图书 Java 应用架构设计:模块化模式与 OSGi10.2 “模块应该可以在外部进行配置” 当把模块部署到运行时环境中时,在使用它之前通常要进行 初始化。例如,为了让模块能够访问数据库中的数据,要用 必要的用户 ID 和密码来初始化模块。但是,我们也希望避 免将配置信息与模块紧密耦合。如果这样做,将会

2、使模块与 单一的上下文环境耦合,这样就限制了模块在其他可选的上 下文中进行重用。 外部配置使得模块可以跨环境上下文配置。下图展现了外部 配置,在这里 Client 类使用一个 XML 配置文件配置 client.jar 模块。要注意的是,用来初始化 client.jar 的配置信息与表示 模块行为的 Client 类分开了。能够配置模块到环境上下文中 会增强跨环境重用模块的能力。配置文件的位置,有三种处理方式:1、配置信息包含在模块中,优势是在模块的默认上下文中 很易于使用,不足在于在其他的上下文中不能正常工作。2、配置信息不在模块中,但是在初始化的时候由外部提供 给模块。优势是能跨环境重用,

3、不足是每个环境都要配置所 有参数。3、更灵活的方案是在模块中提供默认配置文件,但是允许 模块外部提供替代的配置文件。下图是图书中的一个例子。这三种方案中,最后一种看起来最有诱惑,能够实现比较灵 活的配置方式。后续我们用这种方案进行设计。二、默认 +替代的配置方案 考虑一个企业开发中一个相对简单的项目,同时提供 WEB 界面和 API 接口。为了方便其他系统调用 API ,同时提供一 个 client jar 供调用。1、系统设计各个模块的简单介绍:base-util.jar : 通用的基础包,实现基本工具类。我们自定 义的读取配置文件工具类( PropsUtil )就在这个包中。 busine

4、ss-core.jar : 业务系统的基础包,如 model 定义等 business-web.war : 业务系统的 WEB 项目,实现基本的业务 逻辑,并提供 API 实现。business-client.jar : 业务系统的 client 包,供其它系统调用。图中的箭头代表依赖关系。题外话,在设计 module 时,尤 其要注意的是不能出现循环依赖。2、配置参数的约定 本文不考虑数据库连接信息等特殊需求的配置,重点放在能 够通过配置工具类 PropsUtil 读取的那一类参数。 如线程池的 大小、 client 调用 api 的是服务器地址和 uri 等。在每个 module 中都放置

5、一个配置文件 perties ,将配 置信息写在这个配置文件中。相同名称的参数加载, module 中的参数会覆盖所依赖 module 中的参数。读取配置参数,必须使用PropsUtil.getString()/getInt()/getBoolean() 的函数来读取。3、PropsUtil 的实现 工具类的实现,核心是需要解决两个问题:如何将各个 jar 中的 perties 都加载 如何处理各个 perties 的加载顺序 使用 SpringFrameworks 的 ResourcePatternResolver,可以将 多个 jar 包、

6、war 包中的特定文件读取成 Resource 对象,然 后加载到 apache 的 commons configuration Configuration 中。 下面用代码解释一下实现。3.1 加载 Resource ListString filePattern = "classpath*:perties"/ 根据文件名读取 Resource 列表,并做必要的排序 public static List<Resource> getResources(String filePattern) List<Resource&

7、amp;gt; resultResources = new ArrayList<Resource>();try ResourcePatternResolver resolver =new PathMatchingResourcePatternResolver();Resource resources = (Resource) resolver.getResources(filePattern);List<Resource> jarResources = new ArrayList<Resource>();Lis

8、t<Resource> webResources = new ArrayList<Resource>();/ 将各个 jar 包中发现的 perties 文件按顺序放到 jarResources/ 将 war 包中发现的 perties 文件按顺序放到 webResources/ 这部分代码自行脑补/ 最终合并到 resultResourcesfor (Resource oneResource : jarResources) resultResources.add(oneResource);for (Res

9、ource oneResource : webResources) resultResources.add(oneResource); catch (IOException e1) logger.error("getResources", e1);return resultResources;3.2 将内容加载到 Configuration private volatile static Configuration configs = null; private static void initConfigArray() configs = new Configuratio

10、n ;try int index = 0;List<Resource> resourceList =ResourceFileUtil.getResources(propFile);for (Resource resource : resourceList) InputStream inputStream = resource.getInputStream();if (inputStream != null) FileConfiguration oneFileConfig = newPropertiesConfiguration();oneFileConfig.set

11、Encoding(StringPool.UTF8);oneFileConfig.load(inputStream);index+;configs = ArrayUtil.append(configs, oneFileConfig);inputStream.close(); catch (IOException e1) 3.3 读取配置参数public static String getString(String key, String defaultValue) String stringValue = null;for (Configuration oneConfig : configs)

12、if (oneConfig.containsKey(key) String tempValue = oneConfig.getString(key);if (Validator.isNotNull(tempValue) stringValue = tempValue;if (Validator.isNull(stringValue) && Validator.isNotNull(defaultValue) stringValue = defaultValue; else if (stringValue = null) stringValue = StringPo

13、ol.BLANK;return stringValue; 这儿只写了读取字符串类型的配置,如果是其他数据格式, 自行从 String 做必要的转换即可。至此,在需要读取配置参数的时候,只需要调用 PropsUtil.getString() ,就可以取到相应的参数值。 这种方法已 经实现了 “默认 +替代”的方案, 在基础模块的 perties 中提供缺省设置,在依赖模块的 perties 中使用新的 参数值替换。当不同的 WEB 项目调用同一个基础模块时,因参数不同, 只需要在 web 的 perties 中重新设置新的参数值即可。三、利用 Ma

14、ven Profile 解决多环境部署问题 perties 是项目的源码。 如果一套系统需要在多个环境 中进行部署,并且在不同的环境中参数值还不同。如果直接 修改 perties 文件,那会给打包部署带来繁琐的手工 工作量。如果项目使用 Maven 进行管理,则可以方便的利用 maven profile 对参数进行管理。1、修改 perties 中的参数值 以下用两个参数为例,# 数据处理线程数 # 向门户推送消息的尝试次数 修改后的参数值为# 数据处理线程数 # 向门户推送消息的尝试次数注意,参数值中的变量名称,不能跟前面的参数名相同,否 则

15、maven 会抛异常。最简单的处理方式,就是在变量名前面 加上 param.2、pom.xml 中增加 profiles 假设系统的部署有四套环,分别是dev: 开发环境testa: 第一轮测试testb: 第二轮测试product: 生产环境那么,修改 pom.xml 文件,相关部分代码为:<profiles><profile><id>dev</id><activation><activeByDefault>true&

16、lt;/activeByDefault></activation><properties> y.times></properties><build><filters><filter>src/main/resources/perties</filter> </filters></build>&lt

17、;/profile><profile><id>testa</id><activation><activeByDefault>false</activeByDefault> </activation><properties> y.times></properties><build>&l

18、t;filters><filter>src/main/resources/perties</filter></filters></build></profile><profile><id>testb</id><activation><activeByDefault>false&lt

19、;/activeByDefault> </activation><properties> y.times></properties><build><filters><filter>src/main/resources/perties</filter> </filters></build><

20、/profile><profile><id>product</id><activation><activeByDefault>false</activeByDefault></activation><properties> y.times></properties><build>&l

21、t;filters><filter>src/main/resources/perties</filter> </filters></build></profile></profiles>其中, activeByDefault 表示是否为缺省 profile 。设置完参数 后,就是在不同的环境中应用不同 profile 的方法问题。3、Maven 启动 WEB 项目时应用 profile这种方式,需要

22、在 pom.xml 中增加 tomcat7-maven-plugin 这 个 plugin 。如果是在命令行使用 Maven 启动 Tomcat,可使用如下命令: mvn tomcat7:run -P testa其中, -P testa , 代表的是使用 testa这个 profile 。如果使用 Eclipse 中的 Run 进行启用,方法类似,配置界面 为:使用 maven 进行项目打包,也是相同的方法, 在 profile 处选择 testa 即可。4、在 Eclipse 中使用 Server 启动在 Eclipse 中添加 Server Runtime Environments 后,

23、将项目部 署到 Server 中。在项目上右键,选择“属性” ,在弹出的窗 口中选择“ Maven ”,即可输入相应额 Profile 。四、实现参数实时更新之前的实现,已经很好的解决了多环境部署的问题。考虑到生产环境的特殊性,不能随便重启应用。如果某一个关键参数需要修改,按照之前的方案,需要重新打包并部署到生产 环境,应用将会重新启动。如果项目是关键业务,客户要求不能停机,必须实现参数的 实时修改,怎么办?多点环境灰度发布,是一种解决方案; osgi 模块化开发部署应该也是一种解决方案。只是这两种方 案,很难在已有的项目中实现,我们还是考虑简单一点的处 理方式。1、提供参数管理功能( DB ) 在系统中实现一个参数设置功能,由管理员将最新的参数值 保存在数据库中。系统首先读取数据库中的参数值,如果为 空再从 properties 文件中读取。当需要调整系统参数时,管 理员进入管理界面修改并保存即可。可以看出,系统要实现这个定制功能,需要完成:参

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论