/* @author Lize.Ma @date 2019-11-09 14:20 @description ES连接池 */ @Component public class ClientHelper { private Logger logger = Logger.getLogger(ClientHelper.class); @Value("${spring.data.elasticsearch.ip}") private String host; // 服务器地址 @Value("${spring.data.elasticsearch.port}") private int port; // 端口 @Value("${spring.data.elasticsearch.clustername}") private String clusterName; // @Value("${spring.data.elasticsearch.username}") // private String username; // @Value("${spring.data.elasticsearch.password}") // private String password; private String keypath; private Settings setting; private ConcurrentHashMap<String, Client> clientMap = new ConcurrentHashMap<String, Client>(); // hostname port private Map<String, Integer> ips = new HashMap<String, Integer>(); //单例模式 获取实例对象 public static final ClientHelper getInstance() { return ClientHolder.INSTANCE; } private static class ClientHolder { private static final ClientHelper INSTANCE = new ClientHelper(); } /** * 初始化默认的client */ public void init() { logger.info("host:" + host); logger.info("port:" + port); logger.info("clusterName:" + clusterName); //集群处理 if (host.contains(",")) { String[] split = host.split(","); for (String ip : split) { ips.put(ip, port); } } else { ips.put(host, port); } //读取检验文件 // keypath=ResourceFileUtil.getFilePath("elastic-certificates.p12"); // if (!CommonUtil.isNotNullEmpty(keypath)){ // logger.error("not find elastic-certificates.p12 path"); // return; // } setting = Settings.builder() .put("cluster.name", clusterName) // .put("xpack.security.user", username + ":" + password) // .put("xpack.security.transport.ssl.enabled", true) // .put("xpack.security.transport.ssl.verification_mode", "certificate") // .put("xpack.security.transport.ssl.keystore.path", keypath) // .put("xpack.security.transport.ssl.truststore.path", keypath) .put("client.transport.sniff", true) .put("thread_pool.search.size", 10).build(); addClient(setting, ips); } public Client getClient() { if (!CommonUtil.isNotMapNull(clientMap) || !CommonUtil.isNotMapNull(ips)) { init(); } return getClient(clusterName); } public Client getClient(String clusterName) { if (!CommonUtil.isNotMapNull(clientMap) || !CommonUtil.isNotMapNull(ips)) { init(); } return clientMap.get(clusterName); } /** * 添加到map * @param setting * @param ips */ public void addClient(Settings setting, Map<String, Integer> ips) { TransportClient client = new PreBuiltTransportClient(setting); for (String ip : ips.keySet()) { try { client = client.addTransportAddresses(new TransportAddress(InetAddress.getByName(ip), Integer.valueOf(ips.get(ip).toString()))); } catch (UnknownHostException e) { e.printStackTrace(); } } if (client != null) { clientMap.put(setting.get("cluster.name"), client); } else { logger.error("TransportClient is null ,can not build cennection for es"); } } /** * 获得所有的地址端口 * @return */ public List<TransportAddress> getAllAddress(Map<String, Integer> ips) { List<TransportAddress> addressList = new ArrayList<TransportAddress>(); for (String ip : ips.keySet()) { try { addressList.add(new TransportAddress(InetAddress.getByName(ip), Integer.valueOf(ips.get(ip).toString()))); } catch (UnknownHostException e) { e.printStackTrace(); } } return addressList; } }
感悟:es主要的耗时地方是:连接es,获取client上
连接池,就是第一次连接的时候,把获取的连接对象存到map里了,你以后再用直接从map里拿,相当于从内存拿,所以非常快
<!--es 依赖包 --> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>6.7.2</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>6.7.2</version> </dependency> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId> <version>7.7.0</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>x-pack-transport</artifactId> <version>5.6.0</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>6.7.2</version> </dependency> <!--日志包--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.2</version> </dependency> <!-- fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.58</version> </dependency>