背景
原系统使用tcp方式接入ES,使用 ElasticsearchTemplate API方式交互ES。原springes的yml配置如下:
spring:
data:
elasticsearch:
cluster-nodes: 192.168.10.11:9300
cluster-name: xxxxxes集群名称
由于接入阿里云的ES,且加上了X-PACK验证模式,必须有用户名和密码。故拉取新的分支支持阿里云ES的配置。
springMvc模式配置
由于A项目是SpringMvc方式的配置,下面讲一下遇到的问题以及最后的配置,服务器阿里云用的是ES5。故参考了阿里云官网的配置。x-pack-transport 5.3.3。在配置是一开始仅引入了x-pack-transport。并未引入elasticsearch 5.3.3。部署就发生了 NoClassFound后者 not exists method等错误。诸如此类的问题都是x-pack-transport 和springboot里自带的ealsticsearch不兼容所致。使用mvn:dpendency:tree查看 项目的pop依赖,看出来有jar包冲突,主要涉及:elasticsearch和transport-nettyx-client。x-pack-transport中引入了transport-netty3-client。故排除原springboot的配置,自行引入相应版本。
在解决ES的冲突问题时,其实也很烦,一方面不知道该引入具体什么版本,另一方面是在是网络欠佳,工具欠佳不知道具体的每个artifactId有什么版本。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.1.7.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
</exclusion>
<exclusion>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</exclusion>
<exclusion>
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>transport-netty4-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>x-pack-transport</artifactId>
<version>5.3.3</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.3.3</version>
</dependency>
@Configuration
public class EsConfig {
@Value("${elasticsearch.host}")
private String esHost;
@Value("${elasticsearch.port}")
private Integer port;
@Value("${elasticsearch.name}")
private String name;
@Value("${elasticsearch.user}")
private String user;
@Value("${elasticsearch.password}")
private String password;
@Bean
public TransportClient transportClient() throws UnknownHostException {
TransportClient client = new PreBuiltXPackTransportClient(Settings.builder()
.put("cluster.name", name)
.put("xpack.security.user", user + ":" + password)
.build())
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(esHost), port));
return client;
}
<bean name="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
<constructor-arg name="client" ref="transportClient"/>
</bean>
SpringBoot restClient配置
接下来是另一个项目:springBoot的方式,一开始其实也想使用本文项目中上一个项目的配置,发现根本不行,提示缺少settings的某个方法,于是干脆直接把项目的ElasticsearchTemplate 替换为ElasticsearchRestTemplate。这里不得不吐槽下Template的设计,这两个的api一模一样,但是他们的父类反而有一个方法返回参数是一个抽象类,也导致了注入的对象不能使用抽象类。
部署过程中也出现版本冲突问题:错误如下文章来源:https://www.toymoban.com/news/detail-596748.html
{"root_cause":[{"type":"illegal_argument_exception","reason":"request [/pcc_es/area_su_es/_search] contains unrecognized parameters: [ignore_throttled], [rest_total_hits_as_int]"}],"type":"illegal_argument_exception","reason":"request [/pcc_es/area_su_es/_search] contains unrecognized parameters: [ignore_throttled], [rest_total_hits_as_int]"},"status":400}
ES和springboot版本对应如下
文章来源地址https://www.toymoban.com/news/detail-596748.html
项目配置如下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.0.6.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.6.2</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.6.2</version>
<exclusions>
<exclusion>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</exclusion>
</exclusions>
</dependency>
@Configuration
@Log4j2
public class ElasticSearchConfig {
@PostConstruct
void init() {
log.info("update es config");
System.setProperty("es.set.netty.runtime.available.processors", "false");
}
@Value("${elasticsearch.host}")
private String esHost;
@Value("${elasticsearch.port}")
private Integer port;
@Value("${elasticsearch.name}")
private String name;
@Value("${elasticsearch.user}")
private String user;
@Value("${elasticsearch.password}")
private String password;
@Bean
public RestHighLevelClient client() throws IOException {
try{
}catch (Exception e){
}
// 阿里云Elasticsearch集群需要basic auth验证。
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
//访问用户名和密码为您创建阿里云Elasticsearch实例时设置的用户名和密码,也是Kibana控制台的登录用户名和密码。
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(user, password));
// 通过builder创建rest client,配置http client的HttpClientConfigCallback。
// 单击所创建的Elasticsearch实例ID,在基本信息页面获取公网地址,即为ES集群地址。
RestClientBuilder builder = RestClient.builder(new HttpHost(esHost, port, "http"))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});
// RestHighLevelClient实例通过REST low-level client builder进行构造。
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder);
log.info("开始访问ES");
try{
GetRequest getRequest = new GetRequest("pcc_check_audit");
BasicHeader[] headerList = new BasicHeader[]{};
boolean exists = restHighLevelClient.exists(getRequest, headerList);
log.info("访问ES结果" + exists);
}catch (Exception e){
log.error("访问ES失败{}",e.getMessage(),e);
}
return restHighLevelClient;
}
}
到了这里,关于springBoot 集成阿里云Elasticsearch的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!