本文最后更新于:2021年6月15日 晚上
前言
集群应用的配置文件如果写在项目的 resources 目录下面,当遇到需要修改某一个配置值时,需要将集群的所有应用的配置信息进行修改,并且将机密的配置信息比如数据库账号密码如果不进行加密配置在项目中很危险,一旦发生代码泄露问题,后果很严重。
为了避免上述情况发生,将配置信息存储到数据库中,比如数据库连接、用户名、以及密码,通过 Config 项目的一个接口提供获取配置信息。Config 项目只用于读取配置信息。
远程配置
一)新建类 RemoteProperties
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; public class RemoteProperties implements InitializingBean, FactoryBean<Properties> {
private String url = null;
private Properties properties = new Properties();
@Override public Properties getObject() throws Exception { return properties; }
@Override public Class<?> getObjectType() { return properties.getClass(); }
@Override public boolean isSingleton() { return true; }
@Override public void afterPropertiesSet() throws Exception { loadProperty(); }
public String getUrl() { return url; }
public void setUrl(String url) { this.url = url; }
private void loadProperty() { if (StringUtil.strIsNull(url)) return; String content = HttpClientUtil.urlGet(url);
JSONObject object = JSONObject.parseObject(content); JSONArray data = object.getJSONArray("datasource"); for (Object obj : data) { JSONObject jsonObject = (JSONObject) obj; String key = obj.getString("key"); String value = obj.getString("value"); properties.put(key, value); } } }
|
此类用于发送请求获取配置信息,请求返回格式为 JSON 的配置信息, 如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| { "datasource":[ { "value":"com.mysql.jdbc.Driver", "key":"jdbc.driver" }, { "value":"jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8", "key":"jdbc.url" }, { "value":"root", "key":"jdbc.username" }, { "value":"root", "key":"jdbc.password" } ] }
|
二)编写 Spring 配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<bean id="propertyConfigurerUserServer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="properties"> <bean id="remoteProperties" class="com.craft.partner.server.util.RemoteProperties" p:url="http://api.xxx.com/config"/> </property> <property name="locations"> <list> <value>classpath:configure.properties</value> </list> </property> </bean>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" p:driverClass="${jdbc.driver}" p:jdbcUrl="${jdbc.url}" p:user="${jdbc.username}" p:password="${jdbc.password}"> <property name="initialPoolSize" value="10" /> <property name="minPoolSize" value="10" /> <property name="maxPoolSize" value="50" /> <property name="maxStatements" value="0" /> <property name="maxIdleTime" value="600" /> <property name="idleConnectionTestPeriod" value="300" /> <property name="acquireIncrement" value="5" /> <property name="autoCommitOnClose" value="true" /> <property name="checkoutTimeout" value="2000" /> </bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="find*" read-only="true" /> <tx:method name="*" propagation="REQUIRED" read-only="true"/> </tx:attributes> </tx:advice>
<aop:config expose-proxy="false"> <aop:pointcut id="serviceMethod" expression="execution(* com.craft.partner.server.service.*.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/> </aop:config> </beans>
|
注意: 通过 p:url=”地址” 的方式,调用 RemoteProperties 的方法,发送请求获取配置信息,通过 Spring 进行注入。
注入后,可以通过 p:属性 的方式获取配置。
参考