优化注册中心的配置

This commit is contained in:
523163881@qq.com
2020-10-03 23:53:59 +08:00
parent 089b8ae726
commit da88dcea47
7 changed files with 77 additions and 355 deletions
@@ -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);
}
}
@@ -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));
}
}
@@ -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);
@@ -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));
}
}