开发过程中难免遇到多个ElasticSearch数据源的配置问题,如果类同于项目中关系型数据库Mysql的多数据源,那么在实际业务场景中ElasticSearch的多数据源需求更迫切。
在项目中只需要有Spring即可,没必要是Spring-data-elasticsearch,如果引入Spring-data-elasticsearch需要特别注意集成es版本和服务器中es集群版本。
1.Spring Client Bean
在ElasticSearch 应用开发(二)Java Client 连接ElasticSearch集群中介绍了,Spring 注入Bean形式获得Client,借助同样的思想,可是获取多个bean示例,如下代码示例。
@Bean(name = "baseClient")
@Primary
@Scope("singleton")
public Client getBaseClient() {
return clientInit(SpringMultiClientConfig.getBaseClusterHostnamePort(),
SpringMultiClientConfig.getBaseClusterName(),
SpringMultiClientConfig.getBaseClusterClientTransportsniff());
}
@Bean(name = "localClient")
@Scope("singleton")
public Client getLocaClient() {
return clientInit(SpringMultiClientConfig.getLocalClusterHostnamePort(),
SpringMultiClientConfig.getLocalClusterName(),
SpringMultiClientConfig.getLocalClusterClientTransportsniff());
}
2.bean初始化
public Client clientInit(String CLUSTER_HOSTNAME_PORT,String CLUSTER_NAME,String CLUSTER_CLIENT_TRANSPORTSNIFF){
String[] hostNamesPort = CLUSTER_HOSTNAME_PORT.split(",");
Settings settings = Settings.builder()
/*设置ES实例的名称*/
.put("cluster.name", CLUSTER_NAME)
/*自动嗅探整个集群的状态,把集群中其他ES节点的ip添加到本地的客户端列表中*/
.put("client.transport.sniff", CLUSTER_CLIENT_TRANSPORTSNIFF)
/*x-pack设置*/
/*.put("xpack.security.transport.ssl.enabled", false)
//x-pack用户密码 elastic:changme是默认的用户名:密码
.put("xpack.security.user", "elastic:changme")*/
.build();
/*初始化client*/
TransportClient transportClient = new PreBuiltTransportClient(settings);
String host;
int port;
String[] temp;
if (0 != hostNamesPort.length){
for (String hostPort : hostNamesPort) {
try {
temp = hostPort.split(":");
host = temp[0].trim();
port = Integer.parseInt(temp[1].trim());
transportClient.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
Client client = transportClient;
return client;
}
3.属性配置
@Configuration("classpath:elasticsearch-multi-client.properties")
public class SpringMultiClientConfig {
@Value("${base.elastic.cluster.name}")
private static String BASE_CLUSTER_NAME;
@Value("${base.elastic.cluster.clientTransportSniff}")
private static String BASE_CLUSTER_CLIENT_TRANSPORTSNIFF;
@Value("${base.elastic.cluster.discover.hostname}")
private static String BASE_CLUSTER_HOSTNAME_PORT;
@Value("${local.elastic.cluster.name}")
private static String LOCAL_CLUSTER_NAME;
@Value("${local.elastic.cluster.clientTransportSniff}")
private static String LOCAL_CLUSTER_CLIENT_TRANSPORTSNIFF;
@Value("${local.elastic.cluster.discover.hostname}")
private static String LOCAL_CLUSTER_HOSTNAME_PORT;
public static String getBaseClusterName() {
return BASE_CLUSTER_NAME;
}
public static void setBaseClusterName(String baseClusterName) {
BASE_CLUSTER_NAME = baseClusterName;
}
public static String getBaseClusterClientTransportsniff() {
return BASE_CLUSTER_CLIENT_TRANSPORTSNIFF;
}
public static void setBaseClusterClientTransportsniff(String baseClusterClientTransportsniff) {
BASE_CLUSTER_CLIENT_TRANSPORTSNIFF = baseClusterClientTransportsniff;
}
public static String getBaseClusterHostnamePort() {
return BASE_CLUSTER_HOSTNAME_PORT;
}
public static void setBaseClusterHostnamePort(String baseClusterHostnamePort) {
BASE_CLUSTER_HOSTNAME_PORT = baseClusterHostnamePort;
}
public static String getLocalClusterName() {
return LOCAL_CLUSTER_NAME;
}
public static void setLocalClusterName(String localClusterName) {
LOCAL_CLUSTER_NAME = localClusterName;
}
public static String getLocalClusterClientTransportsniff() {
return LOCAL_CLUSTER_CLIENT_TRANSPORTSNIFF;
}
public static void setLocalClusterClientTransportsniff(String localClusterClientTransportsniff) {
LOCAL_CLUSTER_CLIENT_TRANSPORTSNIFF = localClusterClientTransportsniff;
}
public static String getLocalClusterHostnamePort() {
return LOCAL_CLUSTER_HOSTNAME_PORT;
}
public static void setLocalClusterHostnamePort(String localClusterHostnamePort) {
LOCAL_CLUSTER_HOSTNAME_PORT = localClusterHostnamePort;
}
}
以上源码依旧可以做https://github.com/codersfarm/elasticsearch找到