diff --git a/easy-es-annotation/src/main/java/org/dromara/easyes/annotation/EsDS.java b/easy-es-annotation/src/main/java/org/dromara/easyes/annotation/EsDS.java new file mode 100644 index 00000000..3c43116a --- /dev/null +++ b/easy-es-annotation/src/main/java/org/dromara/easyes/annotation/EsDS.java @@ -0,0 +1,19 @@ +package org.dromara.easyes.annotation; + +import java.lang.annotation.*; + + +/** + * @author lyy + */ +@Target({ElementType.TYPE, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface EsDS { + /** + * 数据源名称 + * + * @return 数据源名称 + */ + String value(); +} \ No newline at end of file diff --git a/easy-es-boot-starter/src/main/java/org/dromara/easyes/starter/config/DynamicEsProperties.java b/easy-es-boot-starter/src/main/java/org/dromara/easyes/starter/config/DynamicEsProperties.java new file mode 100644 index 00000000..8c8ee902 --- /dev/null +++ b/easy-es-boot-starter/src/main/java/org/dromara/easyes/starter/config/DynamicEsProperties.java @@ -0,0 +1,21 @@ +package org.dromara.easyes.starter.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author lyy + * @date 2023年03月14日 15:57 + */ +@Data +@ConfigurationProperties(prefix = "easy-es.dynamic") +public class DynamicEsProperties { + + /** + * 配置多动态数据源key datasource id + */ + private Map datasource = new HashMap<>(); +} \ No newline at end of file diff --git a/easy-es-boot-starter/src/main/java/org/dromara/easyes/starter/config/EsAutoConfiguration.java b/easy-es-boot-starter/src/main/java/org/dromara/easyes/starter/config/EsAutoConfiguration.java index df9a70c9..9e59dcd7 100644 --- a/easy-es-boot-starter/src/main/java/org/dromara/easyes/starter/config/EsAutoConfiguration.java +++ b/easy-es-boot-starter/src/main/java/org/dromara/easyes/starter/config/EsAutoConfiguration.java @@ -10,15 +10,12 @@ import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy; import org.apache.http.ssl.SSLContextBuilder; import org.dromara.easyes.common.enums.SchemaEnum; -import org.dromara.easyes.common.utils.ExceptionUtils; -import org.dromara.easyes.common.utils.LogUtils; -import org.dromara.easyes.common.utils.StringUtils; +import org.dromara.easyes.common.utils.*; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -26,12 +23,10 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.net.ssl.SSLContext; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; +import java.util.*; import static org.dromara.easyes.common.constants.BaseEsConstants.*; +import static org.dromara.easyes.common.utils.RestHighLevelClientUtils.DEFAULT_DS; /** * es自动配置 @@ -40,12 +35,16 @@ import static org.dromara.easyes.common.constants.BaseEsConstants.*; **/ @Configuration @ConditionalOnClass(RestHighLevelClient.class) -@EnableConfigurationProperties(EasyEsConfigProperties.class) -@ConditionalOnExpression("'${easy-es.address:x}'!='x'") +@EnableConfigurationProperties(value = {DynamicEsProperties.class, EasyEsConfigProperties.class}) +//@ConditionalOnExpression("'${easy-es.address:x}'!='x'") @ConditionalOnProperty(prefix = "easy-es", name = {"enable"}, havingValue = "true", matchIfMissing = true) public class EsAutoConfiguration { @Autowired private EasyEsConfigProperties easyEsConfigProperties; + @Autowired + private DynamicEsProperties dynamicEsProperties; + + private final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); /** * 装配RestHighLevelClient @@ -55,6 +54,26 @@ public class EsAutoConfiguration { @Bean @ConditionalOnMissingBean public RestHighLevelClient restHighLevelClient() { + return restHighLevelClient(easyEsConfigProperties); + } + + @Bean + public RestHighLevelClientUtils restHighLevelClientUtils() { + RestHighLevelClientUtils restHighLevelClientUtils = new RestHighLevelClientUtils(); + Map datasourceMap = dynamicEsProperties.getDatasource(); + if (CollectionUtils.isEmpty(datasourceMap)) { + // 设置默认数据源,兼容不使用多数据源配置场景的老用户使用习惯 + datasourceMap.put(DEFAULT_DS, easyEsConfigProperties); + } + for (String key : datasourceMap.keySet()) { + EasyEsConfigProperties easyEsConfigProperties = datasourceMap.get(key); + RestHighLevelClientUtils.registerRestHighLevelClient(key, restHighLevelClient(easyEsConfigProperties)); + } + return restHighLevelClientUtils; + } + + + private RestHighLevelClient restHighLevelClient(EasyEsConfigProperties easyEsConfigProperties) { // 处理地址 String address = easyEsConfigProperties.getAddress(); if (StringUtils.isEmpty(address)) { diff --git a/easy-es-boot-starter/src/main/java/org/dromara/easyes/starter/register/MapperFactoryBean.java b/easy-es-boot-starter/src/main/java/org/dromara/easyes/starter/register/MapperFactoryBean.java index 5a0df2bb..7fff1637 100644 --- a/easy-es-boot-starter/src/main/java/org/dromara/easyes/starter/register/MapperFactoryBean.java +++ b/easy-es-boot-starter/src/main/java/org/dromara/easyes/starter/register/MapperFactoryBean.java @@ -1,9 +1,11 @@ package org.dromara.easyes.starter.register; +import org.dromara.easyes.annotation.EsDS; import org.dromara.easyes.annotation.Intercepts; import org.dromara.easyes.annotation.rely.DefaultChildClass; import org.dromara.easyes.common.enums.ProcessIndexStrategyEnum; import org.dromara.easyes.common.utils.LogUtils; +import org.dromara.easyes.common.utils.RestHighLevelClientUtils; import org.dromara.easyes.common.utils.TypeUtils; import org.dromara.easyes.core.biz.EntityInfo; import org.dromara.easyes.core.cache.BaseCache; @@ -26,6 +28,8 @@ import java.lang.reflect.Proxy; import java.util.Map; import java.util.Optional; +import static org.dromara.easyes.common.utils.RestHighLevelClientUtils.DEFAULT_DS; + /** * 代理类 *

@@ -35,7 +39,8 @@ public class MapperFactoryBean implements FactoryBean { private Class mapperInterface; @Autowired - private RestHighLevelClient client; + private RestHighLevelClientUtils restHighLevelClientUtils; + @Autowired private ApplicationContext applicationContext; @@ -63,6 +68,10 @@ public class MapperFactoryBean implements FactoryBean { // 初始化缓存 GlobalConfigCache.setGlobalConfig(esConfigProperties.getGlobalConfig()); + + //获取动态数据源 若未配置多数据源,则使用默认数据源 + String restHighLevelClientId = Optional.ofNullable(mapperInterface.getAnnotation(EsDS.class)).map(EsDS::value).orElse(DEFAULT_DS); + RestHighLevelClient client = restHighLevelClientUtils.getClient(restHighLevelClientId); BaseCache.initCache(mapperInterface, entityClass, client); // 创建代理 @@ -83,9 +92,9 @@ public class MapperFactoryBean implements FactoryBean { // 将子文档索引激活为父文档索引 if (!DefaultChildClass.class.equals(entityInfo.getChildClass())) { - Optional.ofNullable(entityInfo.getChildClass()) - .flatMap(childClass -> Optional.ofNullable(EntityInfoHelper.getEntityInfo(childClass))) - .ifPresent(childEntityInfo -> childEntityInfo.setIndexName(entityInfo.getIndexName())); + Optional.ofNullable(entityInfo.getChildClass()) + .flatMap(childClass -> Optional.ofNullable(EntityInfoHelper.getEntityInfo(childClass))) + .ifPresent(childEntityInfo -> childEntityInfo.setIndexName(entityInfo.getIndexName())); } } } else { diff --git a/easy-es-common/src/main/java/org/dromara/easyes/common/utils/RestHighLevelClientUtils.java b/easy-es-common/src/main/java/org/dromara/easyes/common/utils/RestHighLevelClientUtils.java new file mode 100644 index 00000000..5a9c5322 --- /dev/null +++ b/easy-es-common/src/main/java/org/dromara/easyes/common/utils/RestHighLevelClientUtils.java @@ -0,0 +1,44 @@ +package org.dromara.easyes.common.utils; + +import org.elasticsearch.client.RestHighLevelClient; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author lyy + * @date 2023年03月14日 16:05 + */ +public class RestHighLevelClientUtils { + + public static final String DEFAULT_DS = "DEFAULT_DS"; + + private static Map restHighLevelClientMap = new ConcurrentHashMap<>(); + + public RestHighLevelClientUtils() { + } + + public static RestHighLevelClient getRestHighLevelClient(String restHighLevelClientId) { + if (DEFAULT_DS.equals(restHighLevelClientId)) { + return restHighLevelClientMap.values() + .stream() + .findFirst() + .orElseThrow(() -> ExceptionUtils.eee("找不到RestHighLevelClient,restHighLevelClientId:%s", restHighLevelClientId)); + } + RestHighLevelClient restHighLevelClient = restHighLevelClientMap.get(restHighLevelClientId); + if (restHighLevelClient == null) { + ExceptionUtils.eee("找不到RestHighLevelClient,restHighLevelClientId:%s", restHighLevelClientId); + + } + return restHighLevelClient; + } + + public RestHighLevelClient getClient(String restHighLevelClientId) { + return RestHighLevelClientUtils.getRestHighLevelClient(restHighLevelClientId); + } + + public static void registerRestHighLevelClient(String restHighLevelClientId, RestHighLevelClient restHighLevelClient) { + RestHighLevelClientUtils.restHighLevelClientMap.putIfAbsent(restHighLevelClientId, restHighLevelClient); + } + +} \ No newline at end of file diff --git a/easy-es-test/src/main/java/org/dromara/easyes/test/mapper/DocumentMapper.java b/easy-es-test/src/main/java/org/dromara/easyes/test/mapper/DocumentMapper.java index c078d214..8f4ff104 100644 --- a/easy-es-test/src/main/java/org/dromara/easyes/test/mapper/DocumentMapper.java +++ b/easy-es-test/src/main/java/org/dromara/easyes/test/mapper/DocumentMapper.java @@ -1,5 +1,6 @@ package org.dromara.easyes.test.mapper; +import org.dromara.easyes.annotation.EsDS; import org.dromara.easyes.core.core.BaseEsMapper; import org.dromara.easyes.test.entity.Document; @@ -8,5 +9,6 @@ import org.dromara.easyes.test.entity.Document; *

* Copyright © 2021 xpc1024 All Rights Reserved **/ +@EsDS("ds1") public interface DocumentMapper extends BaseEsMapper { } diff --git a/easy-es-test/src/test/resources/application.yml b/easy-es-test/src/test/resources/application.yml index f240aa3c..6f5eb39f 100644 --- a/easy-es-test/src/test/resources/application.yml +++ b/easy-es-test/src/test/resources/application.yml @@ -1,9 +1,9 @@ easy-es: -# enable: true - address: 10.20.64.228:9200 - schema: http -# username: elastic -# password: WG7WVmuNMtM4GwNYkyWH + # enable: true + # address: 10.20.64.228:9200 + # schema: http + # username: elastic + # password: WG7WVmuNMtM4GwNYkyWH keep-alive-millis: 18000 global-config: i-kun-mode: true @@ -17,6 +17,15 @@ easy-es: refresh-policy: immediate enable-track-total-hits: true # index-prefix: dev_ + dynamic: + datasource: + ds1: + address: 10.20.64.228:9200 # 数据源1 + ds2: + address: 49.234.28.111:9200 # 数据源2 + #username: '若无可去掉此行' + #password: '若无可去掉此行' + #logging: # level: # tracer: trace \ No newline at end of file