温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

适应各种开发,测试,线上,线下环境的Spring配置方式

发布时间:2020-08-10 18:51:35 来源:网络 阅读:316 作者:沙漏半杯 栏目:编程语言

背景

假设开发了一个中间件,比如是一个缓存系统,这个中间件要配置一个IP地址,还要配置一个Factory,从这个Factory里得到一个client,如:


 


 


<bean name="cacheFactory" class="com.test.cache.Factory">

    <property name="address" value="192.168.1.100"/>

</bean>

<bean name="cacheClient" factory-bean="cacheFactory" factory-method="getClient" />


然后这个中间件有三个集群(clusterA, clusterB, clusterC),分别给不同的业务使用,那就这时会有很多的配置的麻烦。


 


 


 


 


从使用者的角度出发,应用不喜欢引入一堆的配置,它们只希望import一个配置文件,然后在代码里用@AutoWried注入一个Bean,就可以使用了。

Spring Bean被覆盖的风险。

 


如果两个不同的业务都使用了这个cache,然后它们的jar包又再被第三个业务引用,那么它们都import了一个cache service的配置,那么就有可能出现后面的Bean定义被前面的覆盖了。而Spring默认不处理这种Bean重复定义的问题。


 


@AutoWried 注入的问题。和上一个问题类似,@AutoWried注入时如果没有配置@Qualifier,那么如果某个类有多个Bean实例,那么就有可能出现Bean注入混乱的情况。

线上环境临时切换。必须要支持线上临时修改配置。

开发者无需配置。要提供默认值的配置,开发者不用做配置就可以直接在本地和测试环境运行代码。

静默发布新版配置。比如当集群迁移了,IP地址变换了,应用不用修改代码和配置,只需要用Maven重新打包即可。

 


可以利用的技术

spring profile,,@AutoWried,@Qualifier, PropertyPlaceholderConfigurer,PropertyOverrideConfigurer。


profile,PropertyPlaceholderConfigurer等的相关,不一一介绍了。如果有不明白的,可以到spring的文档里参考下。


 


简要列举下是如何解决上面的问题的。


1.在缓存中间件的jar包里放上三个集群的默认配置:




2.看下spring-cacheClusterA.xm里的内容:


 


<beans profile="dev">

<bean id="cacheClusterAFactory" class="com.test.cache.CacheFactory">

<property name="address" value="${cache.address.clusterA:127.0.0.1}"/>

</bean>

<bean name="cacheClusterAClient" factory-bean="cacheClusterAFactory" factory-method="getClient" />

</beans>

<beans profile="test">

<bean id="cacheClusterAFactory" class="com.test.cache.CacheFactory">

<property name="address" value="${cache.address.clusterA:192.168.1.101}"/>

</bean>

<bean name="cacheClusterAClient" factory-bean="cacheClusterAFactory" factory-method="getClient" />

</beans>

 

<beans profile="product">

<bean id="cacheClusterAFactory" class="com.test.cache.CacheFactory">

<property name="address" value="${cache.address.clusterA:10.10.1.10}"/>

</bean>

<bean name="cacheClusterAClient" factory-bean="cacheClusterAFactory" factory-method="getClient" />

</beans>


里面定义了三个profile:dev,test,product。这三个profile分别对应开发,测试,线上三种环境。


 


而在具体bean的配置上,用了一些"${}"这样的占位符,另外还为它们配置了默认值。


PropertyPlaceholderConfigurer,PropertyOverrideConfigurer可以配置默认值,估计这功能比较少人知道 。


这样就解决了不同环境,还要有默认配置的问题。


3.使用者的使用方法


假定使用者要用到clusterA和clusterB这两个集群,那么可以这样配置:


 


<context:property-placeholder location="classpath:env.properties" />

 

<import resource="cacheConfigDefault/spring-cacheClusterA.xml" />

<import resource="cacheConfigDefault/spring-cacheClusterB.xml" />

 


import了缓存中间件的默认配置,然后还用placeholder加载了一个env.properties的环境变量文件。


那么对于spring-cacheClusterA.xml和spring-cacheClusterB.xml里的address这个属性,如果没有在env.properties里有配置,则会使用默认配置。


如果想要修改,如修改cacheClusterA的配置,则可以在env.properties里加下:


 


#if comment this, will use the default value

cache.address.clusterA=testClusterAAddress

那么clusterA使用的就是用户的配置,而不是所依赖的jar包的默认配置了。


 

其它

调试spring placeholder时,或者线上查看placeholder到底有没有工作时,可以把spring的log级别调为TRACE,这样就可以看到很多有用的信息了。


 

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI