gpt4 book ai didi

java - 单个 API,多个 Elasticsearch 实例

转载 作者:行者123 更新时间:2023-11-30 06:59:13 26 4
gpt4 key购买 nike

我们有一个 Spring Boot Restful API,需要从 2 个不同的 Elasticsearch 实例(在不同的服务器上)获取数据,1 个用于“共享”数据(其上大约有 5 个不同的索引),1 个用于“私有(private)”数据(具有大约3个不同的索引)。目前仅针对“私有(private)”数据实例运行,一切都很好。但我们现在需要获取“共享”数据。

在我们的 Spring Boot 应用程序中,我们启用了这样的 Elasticsearch 存储库

@SpringBootApplication
@EnableElasticsearchRepositories(basePackages = {
"com.company.core.repositories", //<- private repos here...
"com.company.api.repositories" //<-- shared repos here...
})
public class Application { //... }

然后我们使用 ElasticsearchRepository 访问“私有(private)”数据,如下所示:

package com.company.core.repositories

public interface DocRepository extends ElasticsearchRepository<Doc, Integer> { ... }

在我们的端点中,我们有...

@RestController
@CrossOrigin
@RequestMapping("/v2/statuses/")
public class StatusEndpoint {
@Resource
private ElasticsearchTemplate template;

@Autowired
private DocRepository docRepository;

@Autowired
private Validator validator;
//...
}

现在我们要添加另一个存储库,例如:

package com.company.api.repositories

public interface LookupRepository extends ElasticsearchRepository<Lookup, Integer> { ... }

然后在我们的 API 层中,我们将添加一个自动连接实例...

@Autowired
private LookupRepository lookupRepo;

我们认为可以定义多个具有不同名称的 Bean,但是如何将每个“elasticsearchTemplate”bean 与需要它们的不同 ElasticsearchRepository 实例关联起来?另外,我们如何将“私有(private)”bean/配置与注入(inject)的实例关联起来

@Resource
private ElasticsearchTemplate template;

我们需要在哪里本地使用它?

最佳答案

您可以使用 2 个独特的 Elasticsearch 配置 bean 和 @Resource(name="XXX") 来解决此问题StatusEndpoint Controller 中模板注入(inject)的注释。

如果您根据存储库应使用的 Elasticsearch 集群将存储库分隔到不同的包中,则可以使用 @EnableElasticsearchRepositories 注释将它们与不同的配置关联起来。

例如:

如果您有这些包和类:

com.company.data.repositories.private.YourPrivateRepository
com.company.data.repositories.shared.YourSharedRepository

然后是这些配置:

@Configuration
@EnableElasticsearchRepositories(
basePackages = {"com.company.data.repositories.private"},
elasticsearchTemplateRef = "privateElasticsearchTemplate")
public class PrivateElasticsearchConfiguration {

@Bean(name="privateElasticsearchTemplate")
public ElasticsearchTemplate privateTemplate() {
//code to create connection to private ES cluster
}
}
<小时/>
@Configuration
@EnableElasticsearchRepositories(
basePackages = {"com.company.data.repositories.shared"},
elasticsearchTemplateRef = "sharedElasticsearchTemplate")
public class SharedElasticsearchConfiguration {

@Bean(name="sharedElasticsearchTemplate")
public ElasticsearchTemplate sharedTemplate() {
//code to create connection to shared ES cluster
}
}

因为elasticsearchTemplateRef @EnableElasticsearchRepositories 中的参数注释,实现存储库的 JPA 代码将使用 basePackages 中存储库的指定模板。列表。

对于StatusEndpoint部分,您只需提供您的 @Resource使用正确的模板 bean 名称进行注释。您的StatusEndpoint看起来像这样:

@RestController
@CrossOrigin
@RequestMapping("/v2/statuses/")
public class StatusEndpoint {

@Resource(name="privateElasticsearchTemplate")
private ElasticsearchTemplate template;

@Autowired
private DocRepository docRepository;

@Autowired
private Validator validator;
//...
}

关于java - 单个 API,多个 Elasticsearch 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41232248/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com