摘要:前言公司的最近需要全部进行升级,目的是方便维护和统一管理。以前的版本不统一,这次准备统一升级到一个固定的版本。带来的问题就是我这边的程序得改了,目前用的是来操作。升级完之后又有坑了。下载地址以上就是这次升级过程中踩过的坑,分享给大家。
前言
公司的ES最近需要全部进行升级,目的是方便维护和统一管理。以前的版本不统一,这次准备统一升级到一个固定的版本。
同时还会给ES加上权限控制,虽然都是部署在内网,为了防止误操作,加上权限还是有必要的。
带来的问题就是我这边的程序得改了,目前用的是Spring Data Elasticsearch来操作ES。
问题首先版本从5.x升级到6.4.0,我这边用的Spring Boot是2.0.1版本,这块是兼容的,没有影响。唯一导致我这边要改动的就是权限这块。
在Spring Boot的文档中,提供了三种操作ES的框架,有两种是走Http协议的,也就是操作9200端口,是可以直接支持用户名和密码配置的。
elasticsearch-rest-client:
spring.elasticsearch.rest.uris=http://search.example.com:9200 spring.elasticsearch.rest.username=user spring.elasticsearch.rest.password=secret
JestClient:
spring.elasticsearch.jest.uris=http://search.example.com:9200 spring.elasticsearch.jest.read-timeout=10000 spring.elasticsearch.jest.username=user spring.elasticsearch.jest.password=secret
偏偏我用的是第三种Spring Data Elasticsearch,没有认证信息的配置,但是有一个扩展属性properties
@ConfigurationProperties(prefix = "spring.data.elasticsearch") public class ElasticsearchProperties { /** * 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 Mapproperties = new HashMap<>(); }
在TransportClientFactoryBean中初始化Settings的时候,会取properties中值
private Settings settings() { if (properties != null) { Settings.Builder builder = Settings.builder(); properties.forEach((key, value) -> { builder.put(key.toString(), value.toString()); }); return builder.build(); } return Settings.builder() .put("cluster.name", clusterName) .put("client.transport.sniff", clientTransportSniff) .put("client.transport.ignore_cluster_name", clientIgnoreClusterName) .put("client.transport.ping_timeout", clientPingTimeout) .put("client.transport.nodes_sampler_interval", clientNodesSamplerInterval) .build(); }
于是我在properties 中加上认证信息的配置发现还是不行,因为这个全新认证是扩展的,需要增加x-pack-transport才行。
org.elasticsearch.client x-pack-transport 6.4.2
恶心的是中央仓库没有,还得指定仓库:
elasticsearch-releases https://artifacts.elastic.co/maven true false
当你加入这些依赖之后你会发现,还是不能采用spring.data.elasticsearch.xxx这种方式直接配置认证信息,因为底层不是用的xpack扩展的client构造的, 用的是PreBuiltTransportClient,看下代码:
protected void buildClient() throws Exception { client = new PreBuiltTransportClient(settings()); clusterNodes.stream() // .peek(it -> logger.info("Adding transport node : " + it.toString())) // .forEach(client::addTransportAddress); client.connectedNodes(); }
最终还是放弃了自动配置的方式,自己手动配置定义Client来支持权限认证。
@Bean public Client client() { try { Settings.Builder builder = Settings.builder() .put("client.transport.ping_timeout", pingTimeout) .put("cluster.name", clusterName) .put("xpack.security.user", username + ":" + password) .put("xpack.security.transport.ssl.enabled", "true") .put("xpack.security.transport.ssl.truststore.path", keystorePath) .put("xpack.security.transport.ssl.keystore.path", keystorePath) .put("xpack.security.transport.ssl.verification_mode", "certificate"); Settings settings = builder.build(); String[] nodes = clusterNodes.split(","); TransportAddress[] addressArray = new TransportAddress[nodes.length]; for (int i = 0; i < nodes.length; i++) { String[] nodeArray = nodes[i].split(":"); addressArray[i] = new TransportAddress(InetAddress.getByName(nodeArray[0]), Integer.parseInt(nodeArray[1])); } return new PreBuiltXPackTransportClient(settings).addTransportAddresses(addressArray); } catch (Exception e) { logger.error("初始化ESClient异常", e); } return null; }
username:用户名
password:密码
keystorePath:证书地址,会有一个.p12的证书
不知大家发现没有,看上去我们自定义的代码也没什么特别,关键点在于PreBuiltXPackTransportClient,框架中用的是PreBuiltTransportClient,所以我们才需要自定义。
配置完了你会发现还是不行,各种jar冲突,Spring Boot的版本还需要升级,于是只能升到目前最新的2.1.0版本。升级完之后又有坑了。
升级之前Data中的注解,要指定类型,keyword变成了Keyword
@Field(type=FieldType.Keyword)
ES的这个Field注解没有别名映射的属性,就是我es中存的u_name, 实体类中写的是username,这个确实不太方便,像data mongodb中都有这样的功能,有知道怎么解决的要给我留言哈,学习下。
然后就是security的一个坑了,升级之后security版本也升级了,下载下来的jar包用不了,错误如下:
一开始以为是网络原因,没下载完,然后重新删了再下,试了5次还是不行,最后没办法,我手动下载了spring-security-config这个包,替换了本地仓库的jar。
下载地址:https://mvnrepository.com/art...
以上就是这次升级过程中踩过的坑,分享给大家。这次只是客户端这块的改变,至于ES是怎么开启权限认证的我这边就不做讲解了,因为这块不是我弄的,所以我也不熟悉,等后面有机会我也去研究研究可以给大家分享,反正是基于xpack搞的。
欢迎加入我的知识星球,一起交流技术,免费学习猿天地的课程(http://cxytiandi.com/course)文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/73534.html
摘要:大家好,我是平头哥联盟的首席填坑官苏南,今天要给大家分享的是最近公司做的一个小程序项目,过程中的一些好的总结和遇到的坑,希望能给其他攻城狮带来些许便利,更希望能做完之后老板给你加薪今天是中秋节的第一天,假日的清晨莫名的醒的特别早,不知道为什 showImg(https://segmentfault.com/img/bVbhAYf?w=1278&h=722); 大家好,我是@IT·平...
摘要:代表公司去参加今年的第二届前端开发者年度大会,散会的时候,技术老大问我,今天感觉怎么样,有什么收获,当时就零零碎碎的回答了一些,不算完美趁着还记得点什么,在这里做个自我回顾总结,谨代表个人见解,有不当之处,或若涉及图片隐私或者其它问题,烦请 代表公司去参加今年的 第二届前端开发者年度大会,散会的时候,Team 技术老大问我,今天感觉怎么样,有什么收获,当时就零零碎碎的回答了一些,不算完...
创业团队撸 Node 前言 大家好,我是 Scott,2016 年 9 月 25 日在杭州大搜车总部举行的杭州 Node Party 上分享了一个话题 - 《创业公司撸 Node》 ,分享之后我以文字的形式又记录了一遍,分享给没有与会的朋友,也方便大家通过搜索引擎者一些技术社区平台来看到这篇文章。 写在前面,感谢芋头哥和大搜车,给了我这个机会跟大家在大搜车面基,说实话,从我出道以来,这还真的是我...
摘要:都会造成错误,注意一定一定严格的用,所以我建议直接复制我的。因为用的话他会转义代码,写不写其实一个样。不可避免的,构建肯定是要用到的。这个时候一般用的是在外面保存然后里面调用第二个坑更隐蔽。 目标人群 献给熟悉基础的React语法的刚接触React的同学~ 如果你已经写过半年以上的React那也不用看了,毕竟我水平并不高 Whats React React 是一个不存在的网络公司Fac...
阅读 2578·2021-11-23 09:51
阅读 808·2021-09-24 10:37
阅读 3565·2021-09-02 15:15
阅读 1943·2019-08-30 13:03
阅读 1862·2019-08-29 15:41
阅读 2584·2019-08-29 14:12
阅读 1383·2019-08-29 11:19
阅读 3278·2019-08-26 13:39