最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot實(shí)現(xiàn)連接多個(gè)ElasticSearch數(shù)據(jù)庫的過程

 更新時(shí)間:2026年03月17日 16:29:22   作者:彭于晏Yan  
這篇文章介紹了如何在Springboot項(xiàng)目中實(shí)現(xiàn)與多個(gè)Elasticsearch數(shù)據(jù)庫的高效交互,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧

在實(shí)際項(xiàng)目中,一個(gè)微服務(wù)需要與多個(gè)不同的ES數(shù)據(jù)庫進(jìn)行交互。下面介紹這種方式,微服務(wù)可以在數(shù)據(jù)庫或數(shù)據(jù)集群之間保持高效的交互,實(shí)現(xiàn)更復(fù)雜的業(yè)務(wù)邏輯。

1. 引入依賴

<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>7.7.1</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-client</artifactId>
    <version>7.7.1</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.7.1</version>
</dependency>
<!-- 適用于中大型的集群 -->
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-client-sinffer</artifactId>
    <version>7.7.1</version>
</dependency>

2. 配置信息

es:
  httpHosts: 127.0.0.1:9200
  username: elastic1
  password: elastic
test2:
  es:
    httpHosts: 127.0.0.2:9200
    username: elastic2
    password: elastic

3. RestHighLevelClientBuilder

public class RestHighLevelClientBuilder {
	public static RestHighLevelClient buildRestHighLevelClient(EsProperties esProperties) throws Exception {
		if (esProperties.getHttpHosts() == null) {
			throw new IllegalArgumentException("es httpHosts must be not empty");
		}
		String[] urls = esProperties.getHttpHosts().split(",");
		Node[] nodes = new Node[urls.length];
		for (int i = 0; i < urls.length; i++) {
			URI uri = new URI(urls[i]);
			nodes[i] = new Node(new HttpHost(uri.getHost(), uri.getPort(), uri.getScheme()));
		}
		RestClientBuilder builder = RestClient.builder(nodes);
		/**
		 * 在使用云ES時(shí),提供的是一個(gè)域名負(fù)載均衡地址(就像一個(gè)單節(jié)點(diǎn)地址),似乎應(yīng)該把云ES的地址認(rèn)為是一直可用
		 */
//		builder.setFailureListener(new RestClient.FailureListener() {
//		    @Override
//		    public void onFailure(Node node) {
//		        log.error("node:{} was failed", node);
//		    }
//		});
		builder.setNodeSelector(NodeSelector.ANY); //default
		builder.setRequestConfigCallback(new RequestConfigCallback() {
			@Override
			public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
				return requestConfigBuilder.setConnectionRequestTimeout(esProperties.getConnectionRequestTimeout())
						.setConnectTimeout(esProperties.getConnectTimeout())
						.setSocketTimeout(esProperties.getSocketTimeout());
			}
		});
		builder.setHttpClientConfigCallback(new HttpClientConfigCallback() {
			@Override
			public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
				if(StringUtils.hasText(esProperties.getPassword())) {
					CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
					credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(esProperties.getUsername(), esProperties.getPassword()));
					httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
				}
				httpClientBuilder.setKeepAliveStrategy(new DefaultConnectionKeepAliveStrategy() {
					@Override
					public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
						long keepAliveDuration = super.getKeepAliveDuration(response, context);
						if(keepAliveDuration < 0) {// < 0 無限,會(huì)跟服務(wù)端不一致報(bào)SocketTimeout
							return esProperties.getKeepAlive();
						}
						return keepAliveDuration;
					}
				});
//				httpClientBuilder.setConnectionManager(connManager);
//				httpClientBuilder.setConnectionReuseStrategy(reuseStrategy);
				httpClientBuilder.setMaxConnPerRoute(esProperties.getMaxConnPerRoute());
				httpClientBuilder.setMaxConnTotal(esProperties.getMaxConnTotal());
//				httpClientBuilder.setDefaultIOReactorConfig(IOReactorConfig.custom().setIoThreadCount(1).build());
				return httpClientBuilder.setDefaultIOReactorConfig(
						IOReactorConfig.custom().setIoThreadCount(Runtime.getRuntime().availableProcessors()).build());
			}
		});
		return new RestHighLevelClient(builder);
	}
}

4. Es連接配置

@Data
public class EsProperties {
    private boolean shutdownOnUpdateCheck = true;
    private String httpHosts;
    private String username;
    private String password;
    private int connectionRequestTimeout = 3000;//default -1 ;
    private int connectTimeout = 1000;//default 1000
    private int socketTimeout = 30000;//default 30000
    private int keepAlive = 118000;//ES服務(wù)端默認(rèn)應(yīng)該是120s
    private int maxConnPerRoute = 10;//default 2 , 對(duì)同一地址(例如3個(gè)節(jié)點(diǎn)使用不同ip時(shí),應(yīng)該會(huì)是每個(gè)節(jié)點(diǎn)最多幾個(gè);3個(gè)節(jié)點(diǎn)使用統(tǒng)一域名時(shí),應(yīng)該是按一個(gè)節(jié)點(diǎn)算),對(duì)一個(gè)HttpClient對(duì)象而言
    private int maxConnTotal = 20;//default 20 , 總和,對(duì)一個(gè)HttpClient對(duì)象而言
    private boolean enabled;
    public RestHighLevelClient buildRestHighLevelClient() throws Exception {
        if(enabled) {
            return RestHighLevelClientBuilder.buildRestHighLevelClient(this);
        }
        return null;
    }
}

5.其他ES連接信息

@Data
@Configuration
@ConditionalOnClass(value = {RestHighLevelClient.class})
@ConfigurationProperties(prefix = "es")
public class Test1EsProperties extends EsProperties {
}
@Data
@Configuration
@ConditionalOnClass(value = {RestHighLevelClient.class})
@ConfigurationProperties(prefix = "test2.es")
public class Test2EsProperties extends EsProperties{
}

6. Es客戶端注入Bean

@Configuration
public class EsConfigBean {
    @Autowired
    private Test1EsProperties test1EsProperties;
    @Autowired
    private Test2EsProperties test2EsProperties;
    @Bean
    @Primary
    public RestHighLevelClient client() throws Exception {
        return test1EsProperties.buildRestHighLevelClient();
    }
    @Bean("test2Client")
    public RestHighLevelClient test2Client() throws Exception {
        return test2EsProperties.buildRestHighLevelClient();
    }
}

到此這篇關(guān)于Springboot實(shí)現(xiàn)連接多個(gè)ElasticSearch數(shù)據(jù)庫的文章就介紹到這了,更多相關(guān)Springboot連接多個(gè)ElasticSearch數(shù)據(jù)庫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入理解Java虛擬機(jī) JVM 內(nèi)存結(jié)構(gòu)

    深入理解Java虛擬機(jī) JVM 內(nèi)存結(jié)構(gòu)

    本節(jié)將會(huì)介紹一下JVM的內(nèi)存結(jié)構(gòu),JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)的各個(gè)組成部分:堆,方法區(qū),程序計(jì)數(shù)器,Java虛擬機(jī)棧,本地方法棧,還會(huì)對(duì)Java堆的分代劃分做個(gè)簡(jiǎn)單的介紹
    2021-09-09
  • java實(shí)現(xiàn)的連接數(shù)據(jù)庫及模糊查詢功能示例

    java實(shí)現(xiàn)的連接數(shù)據(jù)庫及模糊查詢功能示例

    這篇文章主要介紹了java實(shí)現(xiàn)的連接數(shù)據(jù)庫及模糊查詢功能,結(jié)合實(shí)例形式分析了java基于jdbc連接數(shù)據(jù)庫及使用LIKE語句實(shí)現(xiàn)模糊查詢功能的相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12
  • 淺析Java中線程的創(chuàng)建和啟動(dòng)

    淺析Java中線程的創(chuàng)建和啟動(dòng)

    這篇文章運(yùn)用實(shí)例代碼介紹了Java中線程的創(chuàng)建和啟動(dòng),非常詳細(xì),有需要的朋友們可以參考借鑒,下面一起來看看。
    2016-08-08
  • spring cloud整合ribbon問題及解決方案

    spring cloud整合ribbon問題及解決方案

    很多小伙伴在整合ribbon都出了相同的問題,今天特地為大家整理了該問題的解決方案,文中有非常詳細(xì)的圖文解說,對(duì)出現(xiàn)同樣問題的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • mybatisplus 多表關(guān)聯(lián)條件分頁查詢的實(shí)現(xiàn)

    mybatisplus 多表關(guān)聯(lián)條件分頁查詢的實(shí)現(xiàn)

    本文主要介紹了mybatisplus 多表關(guān)聯(lián)條件分頁查詢的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • Spring Boot 菜單刪除實(shí)現(xiàn)代碼與事務(wù)管理

    Spring Boot 菜單刪除實(shí)現(xiàn)代碼與事務(wù)管理

    本文將詳細(xì)介紹Spring Boot環(huán)境下菜單刪除功能的實(shí)現(xiàn)邏輯,包括關(guān)聯(lián)數(shù)據(jù)處理、事務(wù)控制和異常處理等關(guān)鍵環(huán)節(jié),強(qiáng)調(diào)需處理多級(jí)嵌套、角色關(guān)聯(lián)及數(shù)據(jù)一致性,感興趣的朋友跟隨小編一起看看吧
    2025-08-08
  • Java設(shè)計(jì)模式之外觀模式示例詳解

    Java設(shè)計(jì)模式之外觀模式示例詳解

    外觀模式為多個(gè)復(fù)雜的子系統(tǒng),提供了一個(gè)一致的界面,使得調(diào)用端只和這個(gè)接口發(fā)生調(diào)用,而無須關(guān)系這個(gè)子系統(tǒng)內(nèi)部的細(xì)節(jié)。本文將通過示例詳細(xì)為大家講解一下外觀模式,需要的可以參考一下
    2022-08-08
  • MyBatis查詢數(shù)據(jù)返回null的解決

    MyBatis查詢數(shù)據(jù)返回null的解決

    本文主要介紹了MyBatis查詢數(shù)據(jù)返回null的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Netty進(jìn)階之ChannelPoolMap源碼解析

    Netty進(jìn)階之ChannelPoolMap源碼解析

    這篇文章主要介紹了Netty進(jìn)階之ChannelPoolMap源碼解析,ChannelPoolMap是用來存儲(chǔ)ChannelPool和指定key的一個(gè)集合Map,實(shí)際的應(yīng)用場(chǎng)景就是服務(wù)器端是一個(gè)分布式集群服務(wù),擁有多個(gè)配置地址,這樣我們就可以配置多個(gè)服務(wù)地址,減輕單臺(tái)服務(wù)器的壓力,需要的朋友可以參考下
    2023-11-11
  • Java學(xué)習(xí)字符串之方法返回、跳出嵌套循環(huán)及正則表達(dá)式

    Java學(xué)習(xí)字符串之方法返回、跳出嵌套循環(huán)及正則表達(dá)式

    這篇文章主要介紹了Java學(xué)習(xí)字符串之方法返回、跳出嵌套循環(huán)及正則表達(dá)式的相關(guān)資料,包括字符串的基本操作(如長(zhǎng)度、截取、替換等)以及正則表達(dá)式的匹配和替換操作,需要的朋友可以參考下
    2026-03-03

最新評(píng)論

迭部县| 卓资县| 云霄县| 闵行区| 旅游| 雷州市| 平和县| 淮阳县| 乐东| 屏南县| 凌源市| 雷山县| 斗六市| 泉州市| 西乌珠穆沁旗| 武平县| 张家口市| 罗山县| 太仆寺旗| 鄂州市| 潜江市| 吉安市| 淅川县| 镇江市| 南陵县| 西丰县| 巴林右旗| 塘沽区| 靖边县| 贡嘎县| 阳东县| 长沙县| 祁连县| 修文县| 理塘县| 南召县| 台江县| 惠东县| 繁昌县| 沐川县| 泰来县|