背景
很多项目目前都引入了es,由于es弥补了mysql存储及搜索查询的局限性,随着技术的不断迭代,原生的es客户端使用比较繁琐不直观,上手代价有点大,所以easy-es框架就面世了,学习成本很低,有空大家可以去了解下easy-es官网
那说回主题,我们项目会发布在测试环境,也会部署在UAT环境,最后上线,但是ES可能就部署一套或者和别的业务进行公用,此时我们需要按照不同环境进行es数据隔离,由于代码肯定是一套的,那此时方案就需要通过nacos的动态配置进行索引自动更新新的索引名了
引入依赖
<dependency><groupId>cn.easy-es</groupId><artifactId>easy-es-boot-starter</artifactId><version>1.0.3</version></dependency>
es全局配置
easy-es:global-config:# 是否开启小黑子模式,默认关闭, 开启后日志将更有趣,提升编码乐趣,仅供娱乐,切勿用于其它任何用途i-kun-mode: false#索引处理模式,smoothly:平滑模式, not_smoothly:非平滑模式, manual:手动模式,,默认开启此模式process-index-mode: smoothly# 开启控制台打印通过本框架生成的DSL语句,默认为开启,测试稳定后的生产环境建议关闭,以提升少量性能print-dsl: true# 当前项目是否分布式项目,默认为true,在非手动托管索引模式下,若为分布式项目则会获取分布式锁,非分布式项目只需synchronized锁. distributed: false# 重建索引超时时间 单位小时,默认72H 可根据ES中存储的数据量调整 reindexTimeOutHours: 72# 异步处理索引是否阻塞主线程 默认阻塞 数据量过大时调整为非阻塞异步进行 项目启动更快async-process-index-blocking: true # 分布式环境下,平滑模式,当前客户端激活最新索引最大重试次数,若数据量过大,重建索引数据迁移时间超过4320/60=72H,可调大此参数值,此参数值决定最大重试次数,超出此次数后仍未成功,则终止重试并记录异常日志active-release-index-max-retry: 4320# 分布式环境下,平滑模式,当前客户端激活最新索引最大重试次数 分布式环境下,平滑模式,当前客户端激活最新索引重试时间间隔 若您期望最终一致性的时效性更高,可调小此值,但会牺牲一些性能active-release-index-fixed-delay: 60 #默认为true,若为false则认为不启用本框架enable: true # es的连接地址,必须含端口 若为集群,则可以用逗号隔开 例如:127.0.0.1:9200,127.0.0.2:9200address : es-nqaegv2l.public.tencentelasticsearch.com:9200schema: https#若无 则可省略此行配置username: elastic#若无 则可省略此行配置password: gQbqb6nh7Hl5DHbZ db-config:# 是否开启下划线转驼峰 默认为falsemap-underscore-to-camel-case: false # 索引前缀,可用于区分环境 默认为空 用法和MP的tablePrefix一样的作用和用法index-prefix: dev_# id生成策略 customize为自定义,id值由用户生成,比如取MySQL中的数据id,如缺省此项配置,则id默认策略为es自动生成id-type: customize # 字段更新策略 默认为not_nullfield-strategy: not_empty # 默认开启,开启后查询所有匹配数据,若不开启,会导致无法获取数据总条数,其它功能不受影响,若查询数量突破1W条时,需要同步调整@IndexName注解中的maxResultWindow也大于1w,并重建索引后方可在后续查询中生效(不推荐,建议分页查询).enable-track-total-hits: true # 数据刷新策略,默认为不刷新,若对数据时效性要求比较高,可以调整为immediate,但性能损耗高,也可以调整为折中的wait_untilrefresh-policy: immediate # 批量更新接口的阈值 默认值为1万,突破此值需要同步调整enable-track-total-hits=true,@IndexName.maxResultWindow > 1w,并重建索引.batch-update-threshold: 10000 # 是否智能为字段添加.keyword后缀 默认开启,开启后会根据当前字段的索引类型及当前查询类型自动推断本次查询是否需要拼接.keyword后缀smartAddKeywordSuffix: true
业务层
public void insertVersionHistoryEcus(List<VehicleEcuVersionHistoryDO> softVersionChangedEcus) {for (VehicleEcuVersionHistoryDO item : softVersionChangedEcus) {item.setId(idService.nextId());if (item.getCreateTime() == null) {item.setCreateTime(new Date());}if (item.getUpdateTime() == null) {item.setUpdateTime(new Date());}}ecuVersionHistoryRepository.insertBatch(softVersionChangedEcus, EsConstant.INDEX_VEHICLE_ECU_VERSION_HISTORY);}
public class EsConstant {private EsConstant() {}// 索引名称public static final String INDEX_VEHICLE_ECU_VERSION_HISTORY = "vehicle_ecu_version_history";public static final String INDEX_VEHICLE_ECU_HARDWARE_HISTORY = "vehicle_ecu_hardware_history";public static final String INDEX_VEHICLE_LOG_NETWORK = "vehicle_log_network";public static final String INDEX_VEHICLE_LOG_CHECK = "vehicle_log_check";public static final String INDEX_VEHICLE_LOG_ECU_REPORT = "vehicle_log_ecu_report";public static final String INDEX_VEHICLE_TASK_UPGRADE_HISTORY = "vehicle_task_upgrade_history";public static final String INDEX_VEHICLE_TASK_UPGRADE_INFO = "vehicle_task_upgrade_info";public static final String INDEX_VEHICLE_LOG_FILE = "vehicle_log_file";public static final String INDEX_VEHICLE_LOG_EVENT = "vehicle_log_event";public static final String INDEX_VEHICLE_ECU = "vehicle_ecu";
}
@Data
@TableName(value = EsConstant.INDEX_VEHICLE_ECU)
public class VehicleEcuDO extends BaseEcuDO implements Cloneable {}
注意,虽然nacos配置了index-prefix: dev_,但是仍不会生效,因为还缺一个配置,需要在每个实体类上@TableName(value = “vehicle_info”, keepGlobalPrefix = true),目前业务中使用es进行CURD,无论是你显示传入indexName还是不传都可以生效,比如下面两个案例
当然如果在每个实体类中添加这个@TableName(value = “vehicle_info”, keepGlobalPrefix = true)可能比较麻烦,也可以在全局配置