自己研究的一个通用配置中心方案,看看你的项目适用不
1.问题描述
一个项目很多子项目,每个项目有很多通用配置如数据源、Redis集群、ZK、dubbo、日志等
如果每个子项目分别维护这些配置,在修改这些通用配置会很麻烦,还可能漏掉
2.优化方案
使用一个通用properties来管理这些通用配置,将其放到一个指定服务器上,服务启动时用spring的PropertyPlaceholderConfigurer通过http方式读取该properties文件实例化一个配置bean到spring,在xml中通过${XXXX}引用配置或Java代码中@Value("${XXX}")来引用配置
3.这样做的好处
a、之后要修改任一通用配置,只需要修改通用properties即可,还可更快进行故障切换;
b、更好的保证配置的准确性及整体一致性;
c、使非通用properties配置文件更简洁;
4.
1)将通用properties放到一个服务器如Nginx主机,path为 /nginx/config-center/common-dubbo-config-center.properties
2)配置Nginx,在监听XX02端口这个server下增加一个location
location =/common-dubbo-config-center.properties {
allow 111.112.113.0/24; #只允许111.112.113网段IP访问
deny all;
root /nginx/config-center ;
}
3)读取配置到spring
4)在XML或Java代码中使用配置
XML:
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="${redis.pool.maxTotal}"/>
<property name="maxIdle" value="${redis.pool.maxIdle}"/>
<property name="timeBetweenEvictionRunsMillis" value="${redis.pool.timeBetweenEvictionRunsMillis}"/>
<property name="minEvictableIdleTimeMillis" value="${redis.pool.minEvictableIdleTimeMillis}"/>
<property name="testOnBorrow" value="${redis.pool.testOnBorrow}"/>
</bean>
JAVA:
@Component
@Configuration
public class EsClientConfiguration {
@Value("${clusterName}")
private String clusterName;
@Value("${userName}")
private String userName;
@Value("${userPwd}")
private String userPwd;
@Value("${clusterNodes}")
private String clusterNodes;
@Value("${caPath}")
private String caPath;
@Value("${esKey}")
private String esKey;
@Value("${certificate}")
private String certificate;
@Value("${SSLflag:true}")
private boolean SSLflag;
//原生API操作ES的对象
@Bean
@Lazy
public TransportClient transportClient() throws UnknownHostException {
Settings settings = null;
if (SSLflag) {
settings = Settings.builder()
.put("cluster.name", clusterName)
.put("xpack.security.user", userName + ":" + userPwd)
.put("xpack.ssl.certificate_authorities", caPath)
.put("xpack.ssl.key", esKey)
.put("xpack.ssl.certificate",certificate )
.put("xpack.security.transport.ssl.enabled", "true").build();
} else {
settings = Settings.builder().put("cluster.name", clusterName)
.put("xpack.security.user", userName + ":" + userPwd)
.put("xpack.security.transport.ssl.enabled", "false").build();
}
TransportClient client = new PreBuiltXPackTransportClient(settings);
String[] ip_port = clusterNodes.split(",");
for (String s : ip_port) {
String[] split = s.split(":");
client.addTransportAddress(new TransportAddress(InetAddress.getByName(split[0]), Integer.parseInt(split[1])));
}
return client;
}
//spring data 包装的API操作ES的对象(推荐使用)
@Bean
@Lazy
public ElasticsearchTemplate elasticsearchTemplate() throws UnknownHostException {
System.out.println(" .::::.");
System.out.println(" .::::::::.");
System.out.println(" :::::::::::");
System.out.println(" ..:::::::::::'");
System.out.println(" '::::::::::::'");
System.out.println(" .::::::::::");
System.out.println(" '::::::::::::::..");
System.out.println(" ..::::::::::::.");
System.out.println(" ``::::::::::::::::");
System.out.println(" ::::``:::::::::' .:::.");
System.out.println(" ::::' ':::::' .::::::::.");
System.out.println(" .::::' :::: .:::::::'::::.");
System.out.println(" .::' :::::.:::::::::' ':::::.");
System.out.println(" .::' ::::::::::::::' ``::::.");
System.out.println(" ...::: ::::::::::::' ``::.");
System.out.println(" ```` ':. ':::::::::' ::::..");
System.out.println(" '.:::::' ':'````..");
System.out.println("<<<<<ES><连><接><成><功>>>>>>");
return new ElasticsearchTemplate(transportClient());
}
}