Commit 045d44d4 by Nepxion

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

parent e4b1dc3d
......@@ -14,6 +14,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.web.client.RestTemplate;
import com.nepxion.discovery.console.endpoint.ConsoleEndpoint;
......@@ -41,5 +42,10 @@ public class ConsoleAutoConfiguration {
public ConsoleEndpoint 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;
import java.util.List;
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.boot.actuate.endpoint.Endpoint;
import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint;
import org.springframework.cloud.client.ServiceInstance;
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.ManagedResource;
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.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import com.nepxion.discovery.console.entity.InstanceEntity;
......@@ -37,9 +43,14 @@ import com.nepxion.discovery.console.entity.InstanceEntity;
@Api(tags = { "控制台接口" })
@ManagedResource(description = "Console Endpoint")
public class ConsoleEndpoint implements MvcEndpoint {
private static final Logger LOG = LoggerFactory.getLogger(ConsoleEndpoint.class);
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private RestTemplate consoleRestTemplate;
@RequestMapping(path = "/console/services", method = RequestMethod.GET)
@ApiOperation(value = "获取服务注册中心的服务列表", notes = "", response = List.class, httpMethod = "GET")
@ResponseBody
......@@ -72,6 +83,22 @@ public class ConsoleEndpoint implements MvcEndpoint {
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() {
return discoveryClient.getServices();
}
......@@ -105,29 +132,31 @@ public class ConsoleEndpoint implements MvcEndpoint {
List<String> services = getServices();
Map<String, List<InstanceEntity>> serviceMap = new LinkedHashMap<String, List<InstanceEntity>>(services.size());
for (String service : services) {
List<ServiceInstance> serviceInstances = getInstances(service);
List<InstanceEntity> instanceEntityList = getInstanceList(service);
serviceMap.put(service, instanceEntityList);
}
return serviceMap;
}
private ResponseEntity<?> send(String serviceId, String config, boolean async) {
List<ServiceInstance> serviceInstances = getInstances(serviceId);
for (ServiceInstance serviceInstance : serviceInstances) {
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);
String url = "http://" + host + ":" + port + "/config/send-" + (async ? "async" : "sync");
String result = consoleRestTemplate.postForEntity(url, config, String.class).getBody();
List<InstanceEntity> instanceEntityList = serviceMap.get(service);
if (instanceEntityList == null) {
instanceEntityList = new ArrayList<InstanceEntity>(serviceInstances.size());
serviceMap.put(service, instanceEntityList);
}
instanceEntityList.add(instanceEntity);
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 serviceMap;
return ResponseEntity.ok().body("OK");
}
@Override
......
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