Browse Source

修复ES不支持https协议 https://gitee.com/ghi/dbsyncer/issues/I5VPFN

AE86 2 years ago
parent
commit
532d271a9c

+ 0 - 6
dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/connector/ElasticsearchConfigChecker.java

@@ -20,23 +20,17 @@ public class ElasticsearchConfigChecker implements ConnectorConfigChecker<ESConf
         String username = params.get("username");
         String password = params.get("password");
         String index = params.get("index");
-        String type = params.get("type");
         String url = params.get("url");
-        String schema = params.get("schema");
         String primaryKey = params.get("primaryKey");
         Assert.hasText(username, "Username is empty.");
         Assert.hasText(password, "Password is empty.");
         Assert.hasText(index, "Index is empty.");
-        Assert.hasText(type, "Type is empty.");
         Assert.hasText(url, "Url is empty.");
-        Assert.hasText(schema, "Schema is empty.");
 
         connectorConfig.setUsername(username);
         connectorConfig.setPassword(password);
         connectorConfig.setIndex(index);
-        connectorConfig.setType(type);
         connectorConfig.setUrl(url);
-        connectorConfig.setSchema(schema);
         connectorConfig.setPrimaryKey(primaryKey);
     }
 }

+ 3 - 16
dbsyncer-connector/src/main/java/org/dbsyncer/connector/config/ESConfig.java

@@ -11,15 +11,10 @@ import org.dbsyncer.common.model.AbstractConnectorConfig;
 public class ESConfig extends AbstractConnectorConfig {
 
     /**
-     * 集群地址192.168.1.100:9200,192.168.1.200:9200
+     * 集群地址, http(s)-9200, tcp-9300 http://192.168.1.100:9200,http://192.168.1.200:9200
      */
     private String url;
 
-    /**
-     * 协议9200(http),9300(tcp)
-     */
-    private String schema;
-
     /**
      * 帐号
      */
@@ -36,9 +31,9 @@ public class ESConfig extends AbstractConnectorConfig {
     private String index;
 
     /**
-     * 类型(相当于表)
+     * 类型(相当于表), 6.x 每个索引对应一个type;7.x版本不再引入type概念
      */
-    private String type;
+    private String type = "_doc";
 
     /**
      * 主键
@@ -53,14 +48,6 @@ public class ESConfig extends AbstractConnectorConfig {
         this.url = url;
     }
 
-    public String getSchema() {
-        return schema;
-    }
-
-    public void setSchema(String schema) {
-        this.schema = schema;
-    }
-
     public String getUsername() {
         return username;
     }

+ 19 - 25
dbsyncer-connector/src/main/java/org/dbsyncer/connector/util/ESUtil.java

@@ -1,18 +1,23 @@
 package org.dbsyncer.connector.util;
 
-import org.dbsyncer.common.util.StringUtil;
 import org.apache.http.HttpHost;
 import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.Credentials;
 import org.apache.http.auth.UsernamePasswordCredentials;
 import org.apache.http.client.CredentialsProvider;
+import org.apache.http.conn.ssl.NoopHostnameVerifier;
+import org.apache.http.conn.ssl.TrustAllStrategy;
 import org.apache.http.impl.client.BasicCredentialsProvider;
+import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy;
+import org.apache.http.ssl.SSLContextBuilder;
+import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.connector.ConnectorException;
 import org.dbsyncer.connector.config.ESConfig;
+import org.elasticsearch.client.RequestOptions;
 import org.elasticsearch.client.RestClient;
 import org.elasticsearch.client.RestClientBuilder;
 import org.elasticsearch.client.RestHighLevelClient;
 
+import javax.net.ssl.SSLContext;
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.Objects;
@@ -20,21 +25,27 @@ import java.util.Objects;
 public abstract class ESUtil {
 
     public static final String PROPERTIES = "properties";
-    private static final int ADDRESS_LENGTH = 2;
 
     private ESUtil() {
     }
 
     public static RestHighLevelClient getConnection(ESConfig config) {
         String[] ipAddress = StringUtil.split(config.getUrl(), ",");
-        HttpHost[] hosts = Arrays.stream(ipAddress).map(node -> makeHttpHost(node, config.getSchema())).filter(Objects::nonNull).toArray(
+        HttpHost[] hosts = Arrays.stream(ipAddress).map(node -> HttpHost.create(node)).filter(Objects::nonNull).toArray(
                 HttpHost[]::new);
         RestClientBuilder builder = RestClient.builder(hosts);
         CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
-        Credentials credentials = new UsernamePasswordCredentials(config.getUsername(), config.getPassword());
-        credentialsProvider.setCredentials(AuthScope.ANY, credentials);
-        builder.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
-        return new RestHighLevelClient(builder);
+        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(config.getUsername(), config.getPassword()));
+        try {
+            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(new TrustAllStrategy()).build();
+            SSLIOSessionStrategy sessionStrategy = new SSLIOSessionStrategy(sslContext, NoopHostnameVerifier.INSTANCE);
+            builder.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider).setSSLStrategy(sessionStrategy));
+            final RestHighLevelClient client = new RestHighLevelClient(builder);
+            client.ping(RequestOptions.DEFAULT);
+            return client;
+        } catch (Exception e) {
+            throw new ConnectorException(String.format("Failed to connect to ElasticSearch on %s, %s", config.getUrl(), e.getMessage()));
+        }
     }
 
     public static void close(RestHighLevelClient client) {
@@ -47,21 +58,4 @@ public abstract class ESUtil {
         }
     }
 
-    /**
-     * 根据配置创建HttpHost
-     *
-     * @param address
-     * @param scheme
-     * @return
-     */
-    private static HttpHost makeHttpHost(String address, String scheme) {
-        String[] arr = StringUtil.split(address, ":");
-        if (arr.length == ADDRESS_LENGTH) {
-            String ip = arr[0];
-            int port = Integer.parseInt(arr[1]);
-            return new HttpHost(ip, port, scheme);
-        } else {
-            return null;
-        }
-    }
 }

+ 1 - 2
dbsyncer-listener/src/main/test/ESClientTest.java

@@ -48,8 +48,7 @@ public class ESClientTest {
     @Before
     public void init() {
         ESConfig config = new ESConfig();
-        config.setUrl("127.0.0.1:9200");
-        config.setSchema("http");
+        config.setUrl("https://127.0.0.1:9200");
         config.setUsername("ae86");
         config.setPassword("123456");
         client = ESUtil.getConnection(config);

+ 2 - 15
dbsyncer-web/src/main/resources/public/connector/addElasticsearch.html

@@ -18,28 +18,15 @@
         <div class="col-sm-4">
             <input class="form-control" name="index" type="text" maxlength="32" dbsyncer-valid="require" placeholder="test" th:value="${connector?.config?.index}?:'test'"/>
         </div>
-        <label class="col-sm-2 control-label">type <strong class="driverVerifcateRequired">*</strong></label>
-        <div class="col-sm-4 ">
-            <input class="form-control" name="type" type="text" maxlength="32" dbsyncer-valid="require" placeholder="_doc" th:value="${connector?.config?.type}?:'_doc'"/>
-        </div>
-    </div>
-    <div class="form-group">
         <label class="col-sm-2 control-label">主键 <i class="fa fa-question-circle fa_gray" aria-hidden="true" title="如果使用的表没有主键,可以自定义主键(大小写必须一致,添加表映射关系时,主键不能为空)。"></i><strong class="driverVerifcateRequired">*</strong></label>
         <div class="col-sm-4">
             <input class="form-control" name="primaryKey" type="text" maxlength="32" dbsyncer-valid="require" placeholder="id" th:value="${connector?.config?.primaryKey}?:'id'"/>
         </div>
-        <label class="col-sm-2 control-label">地址 <i class="fa fa-question-circle fa_gray" aria-hidden="true" title="多个使用英文逗号,例如:192.168.1.100:9200,192.168.1.200:9200"></i> <strong class="driverVerifcateRequired">*</strong></label>
-        <div class="col-sm-4">
-            <textarea id="sql" name="url" class="form-control dbsyncer_textarea_resize_none" maxlength="1024" dbsyncer-valid="require" rows="2" th:text="${connector?.config?.url}?:'127.0.0.1:9200'"></textarea>
-        </div>
     </div>
     <div class="form-group">
-        <label class="col-sm-2 control-label">协议 </label>
+        <label class="col-sm-2 control-label">地址 <i class="fa fa-question-circle fa_gray" aria-hidden="true" title="多个使用英文逗号,例如:http://192.168.1.100:9200,http://192.168.1.200:9200"></i> <strong class="driverVerifcateRequired">*</strong></label>
         <div class="col-sm-4">
-            <select class="form-control select-control" name="schema">
-                <option value="http" th:selected="${connector?.config?.schema eq 'http'}">http</option>
-                <option value="tcp" th:selected="${connector?.config?.schema eq 'tcp'}">tcp</option>
-            </select>
+            <textarea id="sql" name="url" class="form-control dbsyncer_textarea_resize_none" maxlength="1024" dbsyncer-valid="require" rows="2" th:text="${connector?.config?.url}?:'http://127.0.0.1:9200'"></textarea>
         </div>
         <div class="col-sm-6"></div>
     </div>