zoukankan      html  css  js  c++  java
  • Spring Data Elasticsearch 和 x-pack 用户名/密码验证连接

    Elasticsearch Java API 客户端连接

    一个是TransportClient,一个是NodeClient,还有一个XPackTransportClient

    • TransportClient:

    作为一个外部访问者,请求ES的集群,对于集群而言,它是一个外部因素。

    • NodeClient

    作为ES集群的一个节点,它是ES中的一环,其他的节点对它是感知的。

    • XPackTransportClient:

    服务安装了 x-pack 插件

    重要:客户端版本应该和服务端版本保持一致

    TransportClient旨在被Java高级REST客户端取代,该客户端执行HTTP请求而不是序列化的Java请求。 在即将到来的Elasticsearch版本中将不赞成使用TransportClient,建议使用Java高级REST客户端。

    上面的警告比较尴尬,但是在 5xx版本中使用还是没有问题的,可能使用rest 客户端兼容性更好做一些。

    Elasticsearch Java Rest API 手册

    Maven Repository

    Elasticsearch Java API包已经上传到 Maven Central

    pom.xml文件中增加:

    transport 版本号最好就是与Elasticsearch版本号一致。

    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>transport</artifactId>
        <version>5.6.3</version>
    </dependency>

    Transport Client

    不设置集群名称

    // on startup
    
    //此步骤添加IP,至少一个,如果设置了"client.transport.sniff"= true 一个就够了,因为添加了自动嗅探配置
    TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
            .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300))
            .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host2"), 9300));
    
    // on shutdown  关闭client
    
    client.close();

    设置集群名称

    Settings settings = Settings.builder()
            .put("cluster.name", "myClusterName").build();  //设置ES实例的名称
    TransportClient client = new PreBuiltTransportClient(settings);  //自动嗅探整个集群的状态,把集群中其他ES节点的ip添加到本地的客户端列表中
    //Add transport addresses and do something with the client...

    增加自动嗅探配置

    Settings settings = Settings.builder()
            .put("client.transport.sniff", true).build();
    TransportClient client = new PreBuiltTransportClient(settings);

    其他配置

    client.transport.ignore_cluster_name  //设置 true ,忽略连接节点集群名验证
    client.transport.ping_timeout       //ping一个节点的响应时间 默认5秒
    client.transport.nodes_sampler_interval //sample/ping 节点的时间间隔,默认是5s

    对于ES Client,有两种形式,一个是TransportClient,一个是NodeClient。两个的区别为: TransportClient作为一个外部访问者,通过HTTP去请求ES的集群,对于集群而言,它是一个外部因素。 NodeClient顾名思义,是作为ES集群的一个节点,它是ES中的一环,其他的节点对它是感知的,不像TransportClient那样,ES集群对它一无所知。NodeClient通信的性能会更好,但是因为是ES的一环,所以它出问题,也会给ES集群带来问题。NodeClient可以设置不作为数据节点,在elasticsearch.yml中设置,这样就不会在此节点上分配数据。

    如果用ES的节点,仁者见仁智者见智。

    实例

    package name.quanke.es.study;
    
    import name.quanke.es.study.util.Utils;
    import org.elasticsearch.action.search.SearchResponse;
    import org.elasticsearch.client.transport.TransportClient;
    import org.elasticsearch.common.settings.Settings;
    import org.elasticsearch.common.transport.InetSocketTransportAddress;
    import org.elasticsearch.transport.client.PreBuiltTransportClient;
    import org.junit.After;
    import org.junit.Before;
    
    import java.net.InetAddress;
    
    /**
     * Elasticsearch 5.5.1 的client 和 ElasticsearchTemplate的初始化
     * 作为一个外部访问者,请求ES的集群,对于集群而言,它是一个外部因素。
     * Created by http://quanke.name on 2017/11/10.
     */
    public class ElasticsearchClient {
    
        protected TransportClient client;
    
        @Before
        public void setUp() throws Exception {
    
            Settings esSettings = Settings.builder()
                    .put("cluster.name", "utan-es") //设置ES实例的名称
                    .put("client.transport.sniff", true) //自动嗅探整个集群的状态,把集群中其他ES节点的ip添加到本地的客户端列表中
                    .build();
    
            /**
             * 这里的连接方式指的是没有安装x-pack插件,如果安装了x-pack则参考{@link ElasticsearchXPackClient}
             * 1. java客户端的方式是以tcp协议在9300端口上进行通信
             * 2. http客户端的方式是以http协议在9200端口上进行通信
             */
            client = new PreBuiltTransportClient(esSettings)
                    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.1.10"), 9300));
    
            System.out.println("ElasticsearchClient 连接成功");
        }
    
        @After
        public void tearDown() throws Exception {
            if (client != null) {
                client.close();
            }
    
        }
    
        protected void println(SearchResponse searchResponse) {
            Utils.println(searchResponse);
        }
    
    }

    XPackTransportClient

    如果 ElasticSearch 服务安装了 x-pack 插件,需要PreBuiltXPackTransportClient实例才能访问

    使用Maven管理项目,把下面代码增加到pom.xml;

    一定要修改默认仓库地址为https://artifacts.elastic.co/maven ,因为这个库没有上传到Maven中央仓库,如果有自己的 maven ,请配置代理

    <project ...>
    
       <repositories>
          <!-- add the elasticsearch repo -->
          <repository>
             <id>elasticsearch-releases</id>
             <url>https://artifacts.elastic.co/maven</url>
             <releases>
                <enabled>true</enabled>
             </releases>
             <snapshots>
                <enabled>false</enabled>
             </snapshots>
          </repository>
          ...
       </repositories>
       ...
    
       <dependencies>
          <!-- add the x-pack jar as a dependency -->
          <dependency>
             <groupId>org.elasticsearch.client</groupId>
             <artifactId>x-pack-transport</artifactId>
             <version>5.6.3</version>
          </dependency>
          ...
       </dependencies>
       ...
    
     </project>

    实例

    
    /**
     * Elasticsearch XPack Client
     * Created by http://quanke.name on 2017/11/10.
     */

    package com.yitong.test;

    import java.net.InetAddress;
    import java.net.UnknownHostException;
    import java.util.ArrayList;

    import org.elasticsearch.action.search.SearchResponse;
    import org.elasticsearch.client.transport.TransportClient;
    import org.elasticsearch.common.settings.Settings;
    import org.elasticsearch.common.transport.InetSocketTransportAddress;
    import org.elasticsearch.search.SearchHit;
    import org.elasticsearch.xpack.client.PreBuiltXPackTransportClient;

    import com.alibaba.fastjson.JSONObject;

    public class ConEsUtil {
    //客户端TransportClient对象
    private static TransportClient client = null;
    //es集群名称,必须和配置文件中的对应
    private static String clusterName = "test";
    //部署es服务器的ip
    private static String networkGost = "127.0.0.1";
    //es的port,注意不是http.host,是配置文件中的transport.tcp.port,默认9300.
    private static Integer transportTcpPort = 9300;


    /**
    * 创建es连接
    *
    * @return
    */
    public static TransportClient creatConEs() {
    if (null ==client) {
    Settings settings = Settings.builder()
    //嗅探功能
    .put("client.transport.ignore_cluster_name", true)
    //集群名称
    .put("cluster.name", clusterName)
    /**
    * 如果es集群安装了x-pack插件则以此种方式连接集群
    * 1. java客户端的方式是以tcp协议在9300端口上进行通信
    * 2. http客户端的方式是以http协议在9200端口上进行通信
    */
    .put("xpack.security.user", "elastic:changeme")
    .build();
    try {
    client = new PreBuiltXPackTransportClient(settings)
    //连接es端口
    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(networkGost), transportTcpPort));
    //client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(networkGost), Integer.valueOf(transportTcpPort)));

    } catch (UnknownHostException e) {
    e.printStackTrace();
    }
    }


    return client;
    }

    public static void main(String[] args) {
    TransportClient es = creatConEs();
    //es.prepareGet(index,type,3).get();
    //
    /* IndicesExistsResponse actionGet = client.admin().indices().exists(new IndicesExistsRequest("logstash-oesapp-2018.07")).actionGet();

    if(actionGet.isExists()){
    System.out.println("存在");
    }else{
    System.out.println("xxxxxxxx");
    }*/
    //matchAllQuery(es);
    searchByField(es);

    }
    //通过一个字段和描述查询({query:{match:{field:description}}})

    private static String searchByField(TransportClient client){
    ArrayList<String> list = new ArrayList<>();
    // MatchQueryBuilder builder = QueryBuilders.matchQuery("name","apache2.access.method");
    SearchResponse response = client.prepareSearch(".kibana").setTypes("index-pattern")//.setQuery(builder)
    .setFrom(0).setSize(3).get();
    SearchHit[] hits = response.getHits().getHits();
    for(int i = 0;i<hits.length;i++) {
    String sourceAsString = hits[i].getSourceAsString();
    list.add(sourceAsString);
    }
    String s = JSONObject.toJSONString(list);
    System.out.println(s);
    return s;
    }
    /**
    * 关闭连接
    */
    /* public static void closeConEs() {
    if (client != null) {
    client.close();
    client = null;
    System.out.println("........连接已关闭!");
    }
    }*/

    /* public static void matchAllQuery(Client client ) {

    SearchResponse res = null;

    MatchAllQueryBuilder qb = QueryBuilders.matchAllQuery();

    res = client.prepareSearch("logstash-oesapp-2018.07")

    .setTypes("allocation_id")

    .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)

    .setQuery(qb)

    .setFrom(0)

    .setSize(10)

    .execute().actionGet();

    for (SearchHit hit: res.getHits().getHits()){

    System.out.println(hit.getSourceAsString());

    }
    }*/
    }

     
  • 相关阅读:
    20171104 DOI Excel 导出
    ABAP 字符串处理
    SE80 开发对象
    ABAP开发中message dump
    物料单位转换的两个函数
    ABAP 多行消息分别显示弹窗
    隐藏你写的程序代码
    学习笔记:Javascript 变量 包装对象
    访问平安银行网站时出现证书问题 NET::ERR_CERT_SYMANTEC_LEGACY
    关于跨域问题
  • 原文地址:https://www.cnblogs.com/-flq/p/9505833.html
Copyright © 2011-2022 走看看