springboot-ES多數(shù)據(jù)源鏈接\Spring-Data-ES 連接多個(gè)ES集群
本文為文章轉(zhuǎn)載;原文地址已經(jīng)置于文章尾部
- 一、背景
- 二、創(chuàng)建原理
- 三、核心類
- 四、實(shí)際代碼
-
- 1、配置文件application.properties
- 2、集群1:配置類C1ElasticsearchProperties
- 3、集群1:創(chuàng)建ES連接的類C1ElasticsearchAutoConfiguration
- 4、集群1:創(chuàng)建模版的類C1ElasticsearchDataAutoConfiguration
- 5、集群2:配置類: C2ElasticsearchProperties
- 6、集群2:創(chuàng)建ES連接的類: C2ElasticsearchAutoConfiguration
- 7、集群2:創(chuàng)建模板的類: C2ElasticsearchDataAutoConfiguration
一、背景
由于 spring-data-elasticsearch 中默認(rèn)只能連接一個(gè)ES集群,但是業(yè)務(wù)上需要在同一個(gè)工程中連接多個(gè)ES集群。
網(wǎng)上搜索了有一個(gè)可以用,但那是一個(gè)第三方ES的框架,我想保持spring-data-elasticsearch的純度,于是就想到了看源碼,并從源碼中學(xué)習(xí),從而獲得修改思路。
二、創(chuàng)建原理
spring-data-elasticsearch 靠spring的自動(dòng)配置機(jī)制,當(dāng)檢測到配置文件中定義了 spring.data.elasticsearch.cluster-nodes 這個(gè)屬性的時(shí)候,就會(huì)觸發(fā)創(chuàng)建ES集群連接,并且自動(dòng)化的創(chuàng)建 Repositories
三、核心類
以下類來自包org.springframework.boot:spring-boot-autoconfigure:2.0.4.RELEASEElasticsearchProperties
負(fù)責(zé)收集配置文件中的集群配置項(xiàng),頂頭上指定了配置項(xiàng)的前綴(默認(rèn)為: spring.data.elasticsearch)ElasticsearchAutoConfiguration
負(fù)責(zé)創(chuàng)建 TransportClient, 同時(shí)還判斷是否存在配置(spring.data.elasticsearch.c1.cluster-nodes),如果存在才創(chuàng)建該beanElasticsearchDataAutoConfiguration
負(fù)責(zé)創(chuàng)建 ElasticsearchTemplate
以下類來自包org.springframework.data:spring-data-elasticsearch:3.0.9.RELEASE@EnableElasticsearchRepositories
負(fù)責(zé)指定掃描的包(basePackages)和 elasticsearchTemplateRefapplication.properties
負(fù)責(zé)配置ES集群的連接信息
四、實(shí)際代碼
1、配置文件application.properties
# 集群1的配置
spring.data.elasticsearch.c1.cluster-name=es-c1
spring.data.elasticsearch.c1.cluster-nodes=127.0.0.1:9301
# 集群2的配置
spring.data.elasticsearch.c2.cluster-name=es-c2
spring.data.elasticsearch.c2.cluster-nodes=127.0.0.1:9302
2、集群1:配置類C1ElasticsearchProperties
該類拷貝自org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchProperties
其唯一的修改為@ConfigurationProperties(prefix = "spring.data.elasticsearch.c1"
),將prefix修改自定義的配置前綴即可。
代碼如下:
package com.xxx.search.es;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.HashMap;
import java.util.Map;
/**
* Configuration properties for Elasticsearch.
*
* @author
* @since 1.1.0
*/
@ConfigurationProperties(prefix = "spring.data.elasticsearch.c1")
public class C1ElasticsearchProperties {
/** Elasticsearch cluster name. */
private String clusterName = "elasticsearch";
/** Comma-separated list of cluster node addresses. */
private String clusterNodes;
/** Additional properties used to configure the client. */
private Map<String, String> properties = new HashMap<>();
public String getClusterName() {
return this.clusterName;
}
public void setClusterName(String clusterName) {
this.clusterName = clusterName;
}
public String getClusterNodes() {
return this.clusterNodes;
}
public void setClusterNodes(String clusterNodes) {
this.clusterNodes = clusterNodes;
}
public Map<String, String> getProperties() {
return this.properties;
}
public void setProperties(Map<String, String> properties) {
this.properties = properties;
}
}
3、集群1:創(chuàng)建ES連接的類C1ElasticsearchAutoConfiguration
該類拷貝自org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration
其中修改了3處:
- ConditionalOnProperty(prefix =
"spring.data.elasticsearch.c1"
)
將prefix修改自定義的配置前綴即可。 - 創(chuàng)建TransportClient的
@Bean
增加參數(shù),指定了自定義的bean名稱為c1TransportClient
- 去掉了創(chuàng)建TransportClient的
@ConditionalOnMissingBean
代碼如下:
package com.xxx.search.es;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.client.Trans2portClientFactoryBean;
import java.util.Properties;
@Configuration
@ConditionalOnClass({Client.class, TransportClientFactoryBean.class})
@ConditionalOnProperty(prefix = "spring.data.elasticsearch.c1", name = {"cluster-nodes"}, matchIfMissing = false)
@EnableConfigurationProperties({C1ElasticsearchProperties.class})
public class C1ElasticsearchAutoConfiguration {
private final C1ElasticsearchProperties properties;
public C1ElasticsearchAutoConfiguration(C1ElasticsearchProperties properties) {
this.properties = properties;
}
@Bean(name = "c1TransportClient")
public TransportClient elasticsearchClient() throws Exception {
TransportClientFactoryBean factory = new TransportClientFactoryBean();
factory.setClusterNodes(this.properties.getClusterNodes());
factory.setProperties(this.createProperties());
factory.afterPropertiesSet();
TransportClient transportClient = factory.getObject();
System.out.println("transportAddresses1: " + transportClient.transportAddresses());
return transportClient;
}
private Properties createProperties() {
Properties properties = new Properties();
properties.put("cluster.name", this.properties.getClusterName());
properties.putAll(this.properties.getProperties());
return properties;
}
}
4、集群1:創(chuàng)建模版的類C1ElasticsearchDataAutoConfiguration
該類拷貝自org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration
2個(gè)修改點(diǎn):
- 創(chuàng)建模版bean的方法中,@Bean增加自定義名稱:
c1ElasticsearchTemplate
;刪除@ConditionalOnMissingBean
;在參數(shù)client增加注解@Qualifier("c1TransportClient")
- 類上增加注解
@EnableElasticsearchRepositories(basePackages = "com.xxx.search.es.c1", elasticsearchTemplateRef = "c1ElasticsearchTemplate")
。這里須要指定當(dāng)前ES模版要掃描的包,以及使用的模版bean名稱(即當(dāng)前類中創(chuàng)建的自定義模版bean)
代碼如下:
package com.xxx.search.es;
import org.elasticsearch.client.Client;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter;
import org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverter;
import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
/**
* {@link EnableAutoConfiguration Auto-configuration} for Spring Data's Elasticsearch
* support.
* <p>
* Registers an {@link ElasticsearchTemplate} if no other bean of the same type is
* configured.
*
* @author Artur Konczak
* @author Mohsin Husen
* @see EnableElasticsearchRepositories
* @since 1.1.0
*/
@Configuration
@ConditionalOnClass({ Client.class, ElasticsearchTemplate.class })
@AutoConfigureAfter(C1ElasticsearchAutoConfiguration.class)
@EnableElasticsearchRepositories(basePackages = "com.xxx.search.es.c1", elasticsearchTemplateRef = "c1ElasticsearchTemplate")
public class C1ElasticsearchDataAutoConfiguration {
@Bean("c1ElasticsearchTemplate")
@ConditionalOnBean(Client.class)
public ElasticsearchTemplate elasticsearchTemplate(
@Qualifier("c1TransportClient") Client client,
ElasticsearchConverter converter) {
try {
return new ElasticsearchTemplate(client, converter);
}
catch (Exception ex) {
throw new IllegalStateException(ex);
}
}
@Bean
@ConditionalOnMissingBean
public ElasticsearchConverter elasticsearchConverter(SimpleElasticsearchMappingContext mappingContext) {
return new MappingElasticsearchConverter(mappingContext);
}
@Bean
@ConditionalOnMissingBean
public SimpleElasticsearchMappingContext mappingContext() {
return new SimpleElasticsearchMappingContext();
}
}
5、集群2:配置類: C2ElasticsearchProperties
修改內(nèi)容同集群1,代碼如下:
package com.xxx.search.es;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.HashMap;
import java.util.Map;
/**
* Configuration properties for Elasticsearch.
*
* @author Artur Konczak
* @author Mohsin Husen
* @since 1.1.0
*/
@ConfigurationProperties(prefix = "spring.data.elasticsearch.c2")
public class C2ElasticsearchProperties {
/** Elasticsearch cluster name. */
private String clusterName = "elasticsearch";
/** Comma-separated list of cluster node addresses. */
private String clusterNodes;
/**Additional properties used to configure the client. */
private Map<String, String> properties = new HashMap<>();
public String getClusterName() {
return this.clusterName;
}
public void setClusterName(String clusterName) {
this.clusterName = clusterName;
}
public String getClusterNodes() {
return this.clusterNodes;
}
public void setClusterNodes(String clusterNodes) {
this.clusterNodes = clusterNodes;
}
public Map<String, String> getProperties() {
return this.properties;
}
public void setProperties(Map<String, String> properties) {
this.properties = properties;
}
}
6、集群2:創(chuàng)建ES連接的類: C2ElasticsearchAutoConfiguration
修改內(nèi)容同集群1,代碼如下:
package com.xxx.search.es;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.client.TransportClientFactoryBean;
import java.util.Properties;
@Configuration
@ConditionalOnClass({Client.class, TransportClientFactoryBean.class})
@ConditionalOnProperty(prefix = "spring.data.elasticsearch.c2", name = {"cluster-nodes"}, matchIfMissing = false)
@EnableConfigurationProperties({C2ElasticsearchProperties.class})
public class C2ElasticsearchAutoConfiguration {
private final C2ElasticsearchProperties properties;
public C2ElasticsearchAutoConfiguration(C2ElasticsearchProperties properties) {
this.properties = properties;
}
@Bean(name = "c2TransportClient")
public TransportClient elasticsearchClient() throws Exception {
TransportClientFactoryBean factory = new TransportClientFactoryBean();
factory.setClusterNodes(this.properties.getClusterNodes());
factory.setProperties(this.createProperties());
factory.afterPropertiesSet();
TransportClient transportClient = factory.getObject();
System.out.println("transportAddresses2: " + transportClient.transportAddresses());
return transportClient;
}
private Properties createProperties() {
Properties properties = new Properties();
properties.put("cluster.name", this.properties.getClusterName());
properties.putAll(this.properties.getProperties());
return properties;
}
}
7、集群2:創(chuàng)建模板的類: C2ElasticsearchDataAutoConfiguration
修改內(nèi)容同集群1,代碼如下:
package com.xxx.search.es;
import org.elasticsearch.client.Client;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter;
import org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverter;
import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
/**
* {@link EnableAutoConfiguration Auto-configuration} for Spring Data's Elasticsearch
* support.
* <p>
* Registers an {@link ElasticsearchTemplate} if no other bean of the same type is
* configured.
*
* @author Artur Konczak
* @author Mohsin Husen
* @see EnableElasticsearchRepositories
* @since 1.1.0
*/
@Configuration
@ConditionalOnClass({ Client.class, ElasticsearchTemplate.class })
@AutoConfigureAfter(C2ElasticsearchAutoConfiguration.class)
@EnableElasticsearchRepositories(basePackages = "com.xxx.search.es.c2", elasticsearchTemplateRef = "c2ElasticsearchTemplate")
public class C2ElasticsearchDataAutoConfiguration {
@Bean("c2ElasticsearchTemplate")
@ConditionalOnBean(Client.class)
public ElasticsearchTemplate elasticsearchTemplate(
@Qualifier("c2TransportClient") Client client,
ElasticsearchConverter converter) {
try {
return new ElasticsearchTemplate(client, converter);
}
catch (Exception ex) {
throw new IllegalStateException(ex);
}
}
@Bean
@ConditionalOnMissingBean
public ElasticsearchConverter elasticsearchConverter(SimpleElasticsearchMappingContext mappingContext) {
return new MappingElasticsearchConverter(mappingContext);
}
@Bean
@ConditionalOnMissingBean
public SimpleElasticsearchMappingContext mappingContext() {
return new SimpleElasticsearchMappingContext();
}
}
本文換發(fā)自 :文章來源:http://www.zghlxwxcb.cn/news/detail-495061.html
https://blog.csdn.net/booynal/article/details/110259708文章來源地址http://www.zghlxwxcb.cn/news/detail-495061.html
到了這里,關(guān)于springboot-ES多數(shù)據(jù)源鏈接\Spring-Data-ES 連接多個(gè)ES集群的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!