摘要:前言公司的最近需要全部進行升級,目的是方便維護和統一管理。以前的版本不統一,這次準備統一升級到一個固定的版本。帶來的問題就是我這邊的程序得改了,目前用的是來操作。升級完之后又有坑了。下載地址以上就是這次升級過程中踩過的坑,分享給大家。
前言
公司的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)文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/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...
閱讀 2629·2021-11-23 09:51
閱讀 861·2021-09-24 10:37
閱讀 3612·2021-09-02 15:15
閱讀 1962·2019-08-30 13:03
閱讀 1881·2019-08-29 15:41
閱讀 2624·2019-08-29 14:12
閱讀 1424·2019-08-29 11:19
閱讀 3301·2019-08-26 13:39