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

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

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

在實際項目中,一個微服務(wù)需要與多個不同的ES數(shù)據(jù)庫進行交互。下面介紹這種方式,微服務(wù)可以在數(shù)據(jù)庫或數(shù)據(jù)集群之間保持高效的交互,實現(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時,提供的是一個域名負載均衡地址(就像一個單節(jié)點地址),似乎應(yīng)該把云ES的地址認為是一直可用
		 */
//		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 無限,會跟服務(wù)端不一致報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ù)端默認應(yīng)該是120s
    private int maxConnPerRoute = 10;//default 2 , 對同一地址(例如3個節(jié)點使用不同ip時,應(yīng)該會是每個節(jié)點最多幾個;3個節(jié)點使用統(tǒng)一域名時,應(yīng)該是按一個節(jié)點算),對一個HttpClient對象而言
    private int maxConnTotal = 20;//default 20 , 總和,對一個HttpClient對象而言
    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實現(xiàn)連接多個ElasticSearch數(shù)據(jù)庫的文章就介紹到這了,更多相關(guān)Springboot連接多個ElasticSearch數(shù)據(jù)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Netty進階之ChannelPoolMap源碼解析

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

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

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

最新評論

依安县| 馆陶县| 山丹县| 桂阳县| 富平县| 辽宁省| 策勒县| 和硕县| 前郭尔| 宜兰县| 军事| 巴彦县| 福鼎市| 仙游县| 巢湖市| 太仓市| 陇川县| 木兰县| 长武县| 永安市| 砚山县| 博客| 黄陵县| 江口县| 胶南市| 高淳县| 循化| 汉阴县| 汝城县| 浪卡子县| 越西县| 阿合奇县| 盈江县| 丰台区| 三穗县| 连城县| 乐昌市| 安西县| 攀枝花市| 奉新县| 海阳市|