美文网首页elasticsearch程序员ES
Elasticsearch Java API - 客户端连接(T

Elasticsearch Java API - 客户端连接(T

作者: 全科 | 来源:发表于2017-11-13 19:34 被阅读710次

    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);
        }
    
    }
    
    
    

    本实例代码已经上传到 Git ElasticsearchClient.java

    所有实例 已经上传到Git

    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.
     */
    public class ElasticsearchXPackClient {
    
        protected TransportClient client;
        
        @Before
        public void setUp() throws Exception {
            /**
             * 如果es集群安装了x-pack插件则以此种方式连接集群
             * 1. java客户端的方式是以tcp协议在9300端口上进行通信
             * 2. http客户端的方式是以http协议在9200端口上进行通信
             */
            Settings settings = Settings.builder()
                    .put("xpack.security.user", "elastic:utan100")
                    .put("cluster.name", "utan-es")
                    .build();
            client = new PreBuiltXPackTransportClient(settings)
                    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.1.10"), 9300));
    //        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    //        credentialsProvider.setCredentials(AuthScope.ANY,
    //                new UsernamePasswordCredentials("elastic", "utan100"));
    
            System.out.println("ElasticsearchXPackClient 启动成功");
        }
    
        @Test
        public void testClientConnection() throws Exception {
    
            System.out.println("--------------------------");
        }
    
        @After
        public void tearDown() throws Exception {
            if (client != null) {
                client.close();
            }
    
        }
    
        protected void println(SearchResponse searchResponse) {
            Utils.println(searchResponse);
        }
    }
    
    

    本实例代码已经上传到 Git ElasticsearchXPackClient.java

    所有实例 已经上传到Git

    更多请浏览 spring-boot-starter-es 开源项目

    如何有任何问题请给我留言

    全科龙婷▼升职加薪

    全科龙婷

    相关文章

      网友评论

        本文标题:Elasticsearch Java API - 客户端连接(T

        本文链接:https://www.haomeiwen.com/subject/vsqtvxtx.html