Commit 045d44d4 by Nepxion

控制台增加批量异步推送规则配置信息接口

parent e4b1dc3d
...@@ -14,6 +14,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; ...@@ -14,6 +14,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Import;
import org.springframework.web.client.RestTemplate;
import com.nepxion.discovery.console.endpoint.ConsoleEndpoint; import com.nepxion.discovery.console.endpoint.ConsoleEndpoint;
...@@ -41,5 +42,10 @@ public class ConsoleAutoConfiguration { ...@@ -41,5 +42,10 @@ public class ConsoleAutoConfiguration {
public ConsoleEndpoint consoleEndpoint() { public ConsoleEndpoint consoleEndpoint() {
return new ConsoleEndpoint(); return new ConsoleEndpoint();
} }
@Bean
public RestTemplate consoleRestTemplate() {
return new RestTemplate();
}
} }
} }
\ No newline at end of file
...@@ -18,18 +18,24 @@ import java.util.LinkedHashMap; ...@@ -18,18 +18,24 @@ import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.endpoint.Endpoint; import org.springframework.boot.actuate.endpoint.Endpoint;
import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint; import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint;
import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.http.ResponseEntity;
import org.springframework.jmx.export.annotation.ManagedOperation; import org.springframework.jmx.export.annotation.ManagedOperation;
import org.springframework.jmx.export.annotation.ManagedResource; import org.springframework.jmx.export.annotation.ManagedResource;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import com.nepxion.discovery.console.entity.InstanceEntity; import com.nepxion.discovery.console.entity.InstanceEntity;
...@@ -37,9 +43,14 @@ import com.nepxion.discovery.console.entity.InstanceEntity; ...@@ -37,9 +43,14 @@ import com.nepxion.discovery.console.entity.InstanceEntity;
@Api(tags = { "控制台接口" }) @Api(tags = { "控制台接口" })
@ManagedResource(description = "Console Endpoint") @ManagedResource(description = "Console Endpoint")
public class ConsoleEndpoint implements MvcEndpoint { public class ConsoleEndpoint implements MvcEndpoint {
private static final Logger LOG = LoggerFactory.getLogger(ConsoleEndpoint.class);
@Autowired @Autowired
private DiscoveryClient discoveryClient; private DiscoveryClient discoveryClient;
@Autowired
private RestTemplate consoleRestTemplate;
@RequestMapping(path = "/console/services", method = RequestMethod.GET) @RequestMapping(path = "/console/services", method = RequestMethod.GET)
@ApiOperation(value = "获取服务注册中心的服务列表", notes = "", response = List.class, httpMethod = "GET") @ApiOperation(value = "获取服务注册中心的服务列表", notes = "", response = List.class, httpMethod = "GET")
@ResponseBody @ResponseBody
...@@ -72,6 +83,22 @@ public class ConsoleEndpoint implements MvcEndpoint { ...@@ -72,6 +83,22 @@ public class ConsoleEndpoint implements MvcEndpoint {
return getInstanceMap(); return getInstanceMap();
} }
@RequestMapping(path = "/console/config/send-async/{serviceId}", method = RequestMethod.POST)
@ApiOperation(value = "批量异步推送规则配置信息", notes = "", response = ResponseEntity.class, httpMethod = "POST")
@ResponseBody
@ManagedOperation
public ResponseEntity<?> configSendAsync(@PathVariable(value = "serviceId") @ApiParam(value = "服务名", required = true) String serviceId, @RequestBody @ApiParam(value = "规则配置内容,XML格式", required = true) String config) {
return send(serviceId, config, true);
}
@RequestMapping(path = "/console/config/send-sync/{serviceId}", method = RequestMethod.POST)
@ApiOperation(value = "批量同步推送规则配置信息", notes = "", response = ResponseEntity.class, httpMethod = "POST")
@ResponseBody
@ManagedOperation
public ResponseEntity<?> configSendSync(@PathVariable(value = "serviceId") @ApiParam(value = "服务名", required = true) String serviceId, @RequestBody @ApiParam(value = "规则配置内容,XML格式", required = true) String config) {
return send(serviceId, config, false);
}
public List<String> getServices() { public List<String> getServices() {
return discoveryClient.getServices(); return discoveryClient.getServices();
} }
...@@ -105,31 +132,33 @@ public class ConsoleEndpoint implements MvcEndpoint { ...@@ -105,31 +132,33 @@ public class ConsoleEndpoint implements MvcEndpoint {
List<String> services = getServices(); List<String> services = getServices();
Map<String, List<InstanceEntity>> serviceMap = new LinkedHashMap<String, List<InstanceEntity>>(services.size()); Map<String, List<InstanceEntity>> serviceMap = new LinkedHashMap<String, List<InstanceEntity>>(services.size());
for (String service : services) { for (String service : services) {
List<ServiceInstance> serviceInstances = getInstances(service); List<InstanceEntity> instanceEntityList = getInstanceList(service);
for (ServiceInstance serviceInstance : serviceInstances) { serviceMap.put(service, instanceEntityList);
String serviceId = serviceInstance.getServiceId().toLowerCase();
String version = serviceInstance.getMetadata().get("version");
String host = serviceInstance.getHost();
int port = serviceInstance.getPort();
InstanceEntity instanceEntity = new InstanceEntity();
instanceEntity.setServiceId(serviceId);
instanceEntity.setVersion(version);
instanceEntity.setHost(host);
instanceEntity.setPort(port);
List<InstanceEntity> instanceEntityList = serviceMap.get(service);
if (instanceEntityList == null) {
instanceEntityList = new ArrayList<InstanceEntity>(serviceInstances.size());
serviceMap.put(service, instanceEntityList);
}
instanceEntityList.add(instanceEntity);
}
} }
return serviceMap; return serviceMap;
} }
private ResponseEntity<?> send(String serviceId, String config, boolean async) {
List<ServiceInstance> serviceInstances = getInstances(serviceId);
for (ServiceInstance serviceInstance : serviceInstances) {
String host = serviceInstance.getHost();
int port = serviceInstance.getPort();
String url = "http://" + host + ":" + port + "/config/send-" + (async ? "async" : "sync");
String result = consoleRestTemplate.postForEntity(url, config, String.class).getBody();
LOG.info("Send rule, serviceId={} url={}, result={}", serviceId, url, result);
// 这里需要考虑分布式事务
if (!StringUtils.equals(result, "OK")) {
return ResponseEntity.ok().body("Send rule failed for url=" + url + ", cause=" + result);
}
}
return ResponseEntity.ok().body("OK");
}
@Override @Override
public String getPath() { public String getPath() {
return "/"; return "/";
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment