mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
优化注册中心的配置
This commit is contained in:
@@ -1,45 +0,0 @@
|
||||
package com.alibaba.druid.admin.config;
|
||||
|
||||
import com.ecwid.consul.transport.TLSConfig;
|
||||
import com.ecwid.consul.v1.ConsulClient;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.cloud.consul.ConditionalOnConsulEnabled;
|
||||
import org.springframework.cloud.consul.ConsulProperties;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
* @author linchtech
|
||||
* @date 2020-09-20 19:56
|
||||
**/
|
||||
@Configuration
|
||||
@ConditionalOnConsulEnabled
|
||||
public class MonitorConsulConfig {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnProperty(value = "spring.cloud.consul.enabled")
|
||||
public ConsulProperties consulProperties() {
|
||||
return new ConsulProperties();
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConditionalOnProperty(value = "spring.cloud.consul.enabled")
|
||||
public ConsulClient consulClient(ConsulProperties consulProperties) {
|
||||
final int agentPort = consulProperties.getPort();
|
||||
final String agentHost = !StringUtils.isEmpty(consulProperties.getScheme())
|
||||
? consulProperties.getScheme() + "://" + consulProperties.getHost()
|
||||
: consulProperties.getHost();
|
||||
|
||||
if (consulProperties.getTls() != null) {
|
||||
ConsulProperties.TLSConfig tls = consulProperties.getTls();
|
||||
TLSConfig tlsConfig = new TLSConfig(tls.getKeyStoreInstanceType(),
|
||||
tls.getCertificatePath(), tls.getCertificatePassword(),
|
||||
tls.getKeyStorePath(), tls.getKeyStorePassword());
|
||||
return new ConsulClient(agentHost, agentPort, tlsConfig);
|
||||
}
|
||||
return new ConsulClient(agentHost, agentPort);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
package com.alibaba.druid.admin.config;
|
||||
|
||||
import com.netflix.discovery.EurekaClient;
|
||||
import com.netflix.discovery.EurekaClientConfig;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.cloud.client.discovery.DiscoveryClient;
|
||||
import org.springframework.cloud.netflix.eureka.EurekaDiscoveryClient;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
/**
|
||||
* @author linchtech
|
||||
* @date 2020-09-22 12:02
|
||||
**/
|
||||
@Configuration
|
||||
@ConditionalOnProperty(value = "eureka.client.enabled")
|
||||
public class MonitorEurekaConfig {
|
||||
|
||||
private final EurekaClient eurekaClient;
|
||||
|
||||
private final EurekaClientConfig clientConfig;
|
||||
|
||||
public MonitorEurekaConfig(EurekaClient eurekaClient,
|
||||
EurekaClientConfig clientConfig) {
|
||||
this.clientConfig = clientConfig;
|
||||
this.eurekaClient = eurekaClient;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public DiscoveryClient discoveryClient(EurekaClient client,
|
||||
EurekaClientConfig clientConfig) {
|
||||
return new EurekaDiscoveryClient(client, clientConfig);
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
package com.alibaba.druid.admin.config;
|
||||
|
||||
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
|
||||
import com.alibaba.cloud.nacos.discovery.NacosDiscoveryClient;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.cloud.client.discovery.DiscoveryClient;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
/**
|
||||
* @author linchtech
|
||||
* @date 2020-09-20 22:29
|
||||
**/
|
||||
@Configuration
|
||||
@ConditionalOnProperty(value = "spring.cloud.nacos.discovery.enabled")
|
||||
public class MonitorNacosConfig {
|
||||
|
||||
@Bean
|
||||
public DiscoveryClient nacosDiscoveryClient(NacosDiscoveryProperties nacosDiscoveryProperties) {
|
||||
return new NacosDiscoveryClient(nacosDiscoveryProperties);
|
||||
}
|
||||
|
||||
}
|
||||
-84
@@ -1,84 +0,0 @@
|
||||
package com.alibaba.druid.admin.service;
|
||||
|
||||
import com.alibaba.druid.admin.model.ServiceNode;
|
||||
import com.ecwid.consul.v1.ConsulClient;
|
||||
import com.ecwid.consul.v1.Response;
|
||||
import com.ecwid.consul.v1.agent.model.Service;
|
||||
import com.alibaba.druid.admin.config.MonitorProperties;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author linchtech
|
||||
* @date 2020-09-22 11:14
|
||||
**/
|
||||
@Component
|
||||
@Slf4j
|
||||
@ConditionalOnProperty(value = "spring.cloud.consul.enabled")
|
||||
public class ConsulMonitorStatService extends MonitorStatService {
|
||||
|
||||
@Autowired
|
||||
private ConsulClient consulClient;
|
||||
@Autowired
|
||||
private MonitorProperties monitorProperties;
|
||||
|
||||
@Override
|
||||
public Map<String, ServiceNode> getAllServiceNodeMap() {
|
||||
Response<Map<String, Service>> agentServices = consulClient.getAgentServices();
|
||||
Map<String, Service> value = agentServices.getValue();
|
||||
List<ServiceNode> serviceNodes = new ArrayList<>();
|
||||
for (String key : value.keySet()) {
|
||||
Service service = value.get(key);
|
||||
String address = service.getAddress();
|
||||
Integer port = service.getPort();
|
||||
String id = service.getId();
|
||||
String serviceName = id.substring(0, id.lastIndexOf("-"));
|
||||
// 根据前端参数采集指定的服务
|
||||
if (monitorProperties.getApplications().contains(serviceName)) {
|
||||
ServiceNode serviceNode = new ServiceNode();
|
||||
serviceNode.setId(id);
|
||||
serviceNode.setPort(port);
|
||||
serviceNode.setAddress(address);
|
||||
serviceNode.setServiceName(serviceName);
|
||||
serviceNodes.add(serviceNode);
|
||||
serviceIdMap.put(id, serviceNode);
|
||||
}
|
||||
}
|
||||
return serviceNodes.parallelStream().collect(Collectors.toMap(i -> i.getServiceName() + "-" + i.getAddress() + "-" + i.getPort(),
|
||||
Function.identity(), (v1, v2) -> v2));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, ServiceNode> getServiceAllNodeMap(Map<String, String> parameters) {
|
||||
String requestServiceName = parameters.get("serviceName");
|
||||
Response<Map<String, Service>> agentServices = consulClient.getAgentServices();
|
||||
Map<String, Service> value = agentServices.getValue();
|
||||
List<ServiceNode> serviceNodes = new ArrayList<>();
|
||||
for (String key : value.keySet()) {
|
||||
Service service = value.get(key);
|
||||
String address = service.getAddress();
|
||||
Integer port = service.getPort();
|
||||
String id = service.getId();
|
||||
String serviceName = id.substring(0, id.lastIndexOf("-"));
|
||||
if (serviceName.equals(requestServiceName)) {
|
||||
ServiceNode serviceNode = new ServiceNode();
|
||||
serviceNode.setPort(port);
|
||||
serviceNode.setId(id);
|
||||
serviceNode.setAddress(address);
|
||||
serviceNode.setServiceName(serviceName);
|
||||
serviceNodes.add(serviceNode);
|
||||
serviceIdMap.put(id, serviceNode);
|
||||
}
|
||||
}
|
||||
return serviceNodes.parallelStream().collect(Collectors.toMap(i -> i.getServiceName() + "-" + i.getAddress() + "-" + i.getPort(),
|
||||
Function.identity(), (v1, v2) -> v2));
|
||||
}
|
||||
}
|
||||
-77
@@ -1,77 +0,0 @@
|
||||
package com.alibaba.druid.admin.service;
|
||||
|
||||
import com.alibaba.druid.admin.model.ServiceNode;
|
||||
import com.alibaba.druid.admin.config.MonitorProperties;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.cloud.client.ServiceInstance;
|
||||
import org.springframework.cloud.client.discovery.DiscoveryClient;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author linchtech
|
||||
* @date 2020-09-22 13:52
|
||||
**/
|
||||
@Component
|
||||
@Slf4j
|
||||
@ConditionalOnProperty(value = "eureka.client.enabled")
|
||||
public class EurekaMonitorStatService extends MonitorStatService {
|
||||
|
||||
@Autowired
|
||||
private DiscoveryClient discoveryClient;
|
||||
@Autowired
|
||||
private MonitorProperties monitorProperties;
|
||||
|
||||
@Override
|
||||
public Map<String, ServiceNode> getAllServiceNodeMap() {
|
||||
List<String> services = discoveryClient.getServices();
|
||||
List<ServiceNode> serviceNodes = new ArrayList<>();
|
||||
for (String serviceId : services) {
|
||||
List<ServiceInstance> instances = discoveryClient.getInstances(serviceId);
|
||||
for (ServiceInstance serviceInstance : instances) {
|
||||
if (monitorProperties.getApplications().contains(serviceId)) {
|
||||
ServiceNode serviceNode = new ServiceNode();
|
||||
serviceNode.setId(serviceInstance.getInstanceId());
|
||||
serviceNode.setPort(serviceInstance.getPort());
|
||||
serviceNode.setAddress(serviceInstance.getHost());
|
||||
serviceNode.setServiceName(serviceId);
|
||||
serviceNodes.add(serviceNode);
|
||||
serviceIdMap.put(serviceInstance.getInstanceId(), serviceNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
return serviceNodes.parallelStream().collect(Collectors.toMap(i -> i.getServiceName() + "-" + i.getAddress() + "-" + i.getPort(),
|
||||
Function.identity(), (v1, v2) -> v2));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, ServiceNode> getServiceAllNodeMap(Map<String, String> parameters) {
|
||||
String requestServiceName = parameters.get("serviceName");
|
||||
|
||||
List<String> services = discoveryClient.getServices();
|
||||
List<ServiceNode> serviceNodes = new ArrayList<>();
|
||||
for (String serviceId : services) {
|
||||
List<ServiceInstance> instances = discoveryClient.getInstances(serviceId);
|
||||
for (ServiceInstance serviceInstance : instances) {
|
||||
if (requestServiceName.equals(serviceId)) {
|
||||
ServiceNode serviceNode = new ServiceNode();
|
||||
serviceNode.setId(serviceInstance.getInstanceId());
|
||||
serviceNode.setPort(serviceInstance.getPort());
|
||||
serviceNode.setAddress(serviceInstance.getHost());
|
||||
serviceNode.setServiceName(serviceId);
|
||||
serviceNodes.add(serviceNode);
|
||||
serviceIdMap.put(serviceInstance.getInstanceId(), serviceNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
return serviceNodes.parallelStream().collect(Collectors.toMap(i -> i.getServiceName() + "-" + i.getAddress() + "-" + i.getPort(),
|
||||
Function.identity(), (v1, v2) -> v2));
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,5 @@
|
||||
package com.alibaba.druid.admin.service;
|
||||
package com.linchtech.druid.admin.service;
|
||||
|
||||
import com.alibaba.druid.admin.config.MonitorProperties;
|
||||
import com.alibaba.druid.admin.model.ServiceNode;
|
||||
import com.alibaba.druid.admin.model.dto.ConnectionResult;
|
||||
import com.alibaba.druid.admin.model.dto.SqlDetailResult;
|
||||
import com.alibaba.druid.admin.util.HttpUtil;
|
||||
import com.alibaba.druid.stat.DruidStatServiceMBean;
|
||||
import com.alibaba.druid.support.http.stat.WebAppStatManager;
|
||||
import com.alibaba.druid.support.json.JSONUtils;
|
||||
@@ -14,12 +9,20 @@ import com.alibaba.druid.util.StringUtils;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.alibaba.druid.admin.model.dto.DataSourceResult;
|
||||
import com.alibaba.druid.admin.model.dto.SqlListResult;
|
||||
import com.alibaba.druid.admin.model.dto.WallResult;
|
||||
import com.alibaba.druid.admin.model.dto.WebResult;
|
||||
import com.linchtech.druid.admin.config.MonitorProperties;
|
||||
import com.linchtech.druid.admin.model.ServiceNode;
|
||||
import com.linchtech.druid.admin.model.dto.ConnectionResult;
|
||||
import com.linchtech.druid.admin.model.dto.DataSourceResult;
|
||||
import com.linchtech.druid.admin.model.dto.SqlDetailResult;
|
||||
import com.linchtech.druid.admin.model.dto.SqlListResult;
|
||||
import com.linchtech.druid.admin.model.dto.WallResult;
|
||||
import com.linchtech.druid.admin.model.dto.WebResult;
|
||||
import com.linchtech.druid.admin.util.HttpUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.cloud.client.ServiceInstance;
|
||||
import org.springframework.cloud.client.discovery.DiscoveryClient;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
@@ -27,13 +30,16 @@ import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author linchtech
|
||||
* @date 2020-09-16 11:12
|
||||
**/
|
||||
@Slf4j
|
||||
public abstract class MonitorStatService implements DruidStatServiceMBean {
|
||||
@Component
|
||||
public class MonitorStatService implements DruidStatServiceMBean {
|
||||
|
||||
public final static int RESULT_CODE_SUCCESS = 1;
|
||||
public final static int RESULT_CODE_ERROR = -1;
|
||||
@@ -49,6 +55,9 @@ public abstract class MonitorStatService implements DruidStatServiceMBean {
|
||||
*/
|
||||
public static Map<String, ServiceNode> serviceIdMap = new HashMap<>();
|
||||
|
||||
@Autowired
|
||||
private DiscoveryClient discoveryClient;
|
||||
|
||||
@Autowired
|
||||
private MonitorProperties monitorProperties;
|
||||
|
||||
@@ -57,7 +66,34 @@ public abstract class MonitorStatService implements DruidStatServiceMBean {
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public abstract Map<String, ServiceNode> getAllServiceNodeMap();
|
||||
public Map<String, ServiceNode> getAllServiceNodeMap(){
|
||||
List<String> services = discoveryClient.getServices();
|
||||
List<ServiceNode> serviceNodes = new ArrayList<>();
|
||||
for (String service : services) {
|
||||
List<ServiceInstance> instances = discoveryClient.getInstances(service);
|
||||
for (ServiceInstance instance : instances) {
|
||||
String host = instance.getHost();
|
||||
String instanceId = instance.getInstanceId();
|
||||
if (instanceId == null) {
|
||||
instanceId = instance.getMetadata().get("nacos.instanceId").replaceAll("#", "-").replaceAll("@@", "-");
|
||||
}
|
||||
int port = instance.getPort();
|
||||
String serviceId = instance.getServiceId();
|
||||
// 根据前端参数采集指定的服务
|
||||
if (monitorProperties.getApplications().contains(serviceId)) {
|
||||
ServiceNode serviceNode = new ServiceNode();
|
||||
serviceNode.setId(instanceId);
|
||||
serviceNode.setPort(port);
|
||||
serviceNode.setAddress(host);
|
||||
serviceNode.setServiceName(serviceId);
|
||||
serviceNodes.add(serviceNode);
|
||||
serviceIdMap.put(instanceId, serviceNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
return serviceNodes.parallelStream().collect(Collectors.toMap(i -> i.getServiceName() + "-" + i.getAddress() + "-" + i.getPort(),
|
||||
Function.identity(), (v1, v2) -> v2));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取指定服务名的所有节点
|
||||
@@ -65,8 +101,36 @@ public abstract class MonitorStatService implements DruidStatServiceMBean {
|
||||
* @param parameters
|
||||
* @return
|
||||
*/
|
||||
public abstract Map<String, ServiceNode> getServiceAllNodeMap(Map<String, String> parameters);
|
||||
public Map<String, ServiceNode> getServiceAllNodeMap(Map<String, String> parameters){
|
||||
String requestServiceName = parameters.get("serviceName");
|
||||
List<String> services = discoveryClient.getServices();
|
||||
List<ServiceNode> serviceNodes = new ArrayList<>();
|
||||
|
||||
for (String service : services) {
|
||||
List<ServiceInstance> instances = discoveryClient.getInstances(service);
|
||||
for (ServiceInstance instance : instances) {
|
||||
String host = instance.getHost();
|
||||
String instanceId = instance.getInstanceId();
|
||||
if (instanceId == null) {
|
||||
instanceId = instance.getMetadata().get("nacos.instanceId").replaceAll("#", "-").replaceAll("@@", "-");
|
||||
}
|
||||
int port = instance.getPort();
|
||||
String serviceId = instance.getServiceId();
|
||||
// 根据前端参数采集指定的服务
|
||||
if (serviceId.equals(requestServiceName)) {
|
||||
ServiceNode serviceNode = new ServiceNode();
|
||||
serviceNode.setId(instanceId);
|
||||
serviceNode.setPort(port);
|
||||
serviceNode.setAddress(host);
|
||||
serviceNode.setServiceName(serviceId);
|
||||
serviceNodes.add(serviceNode);
|
||||
serviceIdMap.put(instanceId, serviceNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
return serviceNodes.parallelStream().collect(Collectors.toMap(i -> i.getServiceName() + "-" + i.getAddress() + "-" + i.getPort(),
|
||||
Function.identity(), (v1, v2) -> v2));
|
||||
}
|
||||
@Override
|
||||
public String service(String url) {
|
||||
Map<String, String> parameters = getParameters(url);
|
||||
|
||||
-79
@@ -1,79 +0,0 @@
|
||||
package com.alibaba.druid.admin.service;
|
||||
|
||||
import com.alibaba.druid.admin.config.MonitorProperties;
|
||||
import com.alibaba.druid.admin.model.ServiceNode;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.cloud.client.ServiceInstance;
|
||||
import org.springframework.cloud.client.discovery.DiscoveryClient;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author linchtech
|
||||
* @date 2020-09-22 11:18
|
||||
**/
|
||||
@Slf4j
|
||||
@Component
|
||||
@ConditionalOnProperty(value = "spring.cloud.nacos.discovery.enabled")
|
||||
public class NacosMonitorStatService extends MonitorStatService {
|
||||
|
||||
@Autowired
|
||||
private DiscoveryClient discoveryClient;
|
||||
@Autowired
|
||||
private MonitorProperties monitorProperties;
|
||||
|
||||
@Override
|
||||
public Map<String, ServiceNode> getAllServiceNodeMap() {
|
||||
List<String> services = discoveryClient.getServices();
|
||||
List<ServiceNode> serviceNodes = new ArrayList<>();
|
||||
for (String serviceId : services) {
|
||||
List<ServiceInstance> instances = discoveryClient.getInstances(serviceId);
|
||||
for (ServiceInstance serviceInstance : instances) {
|
||||
if (monitorProperties.getApplications().contains(serviceId)) {
|
||||
ServiceNode serviceNode = new ServiceNode();
|
||||
serviceNode.setId(serviceInstance.getInstanceId());
|
||||
serviceNode.setPort(serviceInstance.getPort());
|
||||
serviceNode.setAddress(serviceInstance.getHost());
|
||||
serviceNode.setServiceName(serviceId);
|
||||
serviceNodes.add(serviceNode);
|
||||
serviceIdMap.put(serviceInstance.getInstanceId(), serviceNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
return serviceNodes.parallelStream().collect(Collectors.toMap(i -> i.getServiceName() + "-" + i.getAddress() + "-" + i.getPort(),
|
||||
Function.identity(), (v1, v2) -> v2));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, ServiceNode> getServiceAllNodeMap(Map<String, String> parameters) {
|
||||
String requestServiceName = parameters.get("serviceName");
|
||||
|
||||
List<String> services = discoveryClient.getServices();
|
||||
List<ServiceNode> serviceNodes = new ArrayList<>();
|
||||
for (String serviceId : services) {
|
||||
List<ServiceInstance> instances = discoveryClient.getInstances(serviceId);
|
||||
for (ServiceInstance serviceInstance : instances) {
|
||||
if (requestServiceName.equals(serviceId)) {
|
||||
ServiceNode serviceNode = new ServiceNode();
|
||||
// nacos节点id格式:ip#port#DEFAULT#DEFAULT_GROUP@@name
|
||||
String id = serviceInstance.getMetadata().get("nacos.instanceId");
|
||||
serviceNode.setId(id.replaceAll("#","-").replaceAll("@@","-"));
|
||||
serviceNode.setPort(serviceInstance.getPort());
|
||||
serviceNode.setAddress(serviceInstance.getHost());
|
||||
serviceNode.setServiceName(serviceId);
|
||||
serviceNodes.add(serviceNode);
|
||||
serviceIdMap.put(serviceNode.getId(), serviceNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
return serviceNodes.parallelStream().collect(Collectors.toMap(i -> i.getServiceName() + "-" + i.getAddress() + "-" + i.getPort(),
|
||||
Function.identity(), (v1, v2) -> v2));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user