springBoot 集成阿里云Elasticsearch

背景

    原系统使用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有什么版本。

 
                org.springframework.boot
                spring-boot-starter-data-elasticsearch
                2.1.7.RELEASE
                
                    
                        org.elasticsearch.client
                        transport
                    
                        
                            org.elasticsearch
                            elasticsearch
                        
                    

                    org.elasticsearch.plugin
                    transport-netty4-client
                    

                

            
            
                org.elasticsearch.client
                x-pack-transport
                5.3.3
            

            
                org.elasticsearch
                elasticsearch
                5.3.3
            

@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;

    }

    
        
    

SpringBoot restClient配置

       接下来是另一个项目:springBoot的方式,一开始其实也想使用本文项目中上一个项目的配置,发现根本不行,提示缺少settings的某个方法,于是干脆直接把项目的ElasticsearchTemplate 替换为ElasticsearchRestTemplate。这里不得不吐槽下Template的设计,这两个的api一模一样,但是他们的父类反而有一个方法返回参数是一个抽象类,也导致了注入的对象不能使用抽象类。

        部署过程中也出现版本冲突问题:错误如下

{"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版本对应如下

springBoot 集成阿里云Elasticsearch_第1张图片

项目配置如下

 
                org.springframework.boot
                spring-boot-starter-data-elasticsearch
                2.0.6.RELEASE
                
                    
                        org.elasticsearch
                        elasticsearch
                    
                
            

            
                org.elasticsearch
                elasticsearch
                6.6.2
            

            
                org.elasticsearch.client
                elasticsearch-rest-high-level-client
                6.6.2
                
                    
                        org.elasticsearch
                        elasticsearch
                    
                
            

@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;


    }



}

你可能感兴趣的:(Spring,elasticsearch,spring,boot,阿里云)