我们的微服务是托管在阿里云平台,通过Swarm控制台管理。平台本身是不提供服务的平滑上下线功能的,只有对应的部署功能。
于是我们在我们的内容搭建了一个服务上下线的管理功能,先看一下管理页面。

下面罗列一下服务解析和上下线代码。
###服务列表 http://name:password@ip:port/eureka/apps
```
<applications>
<versions__delta>1</versions__delta>
<apps__hashcode>UP_19_</apps__hashcode>
<application>...</application>
<application>...</application>
<application>...</application>
<application>...</application>
<application>...</application>
<application>...</application>
<application>...</application>
```
###解析服务列表
```
public static void main(String[] args) throws IOException {
String s = HttpClientUtils.doRequest(ConfigProperties.getString(ConfigKeys.SERVICE_REQUEST_URL));
System.out.println(s);
Root root = XmlUtil.toObj(s, Root.class);
Map<String, List<Instance>> serviceMap = Maps.newHashMap();
List<Application> applications = root.getApplication();
applications.forEach(application -> {
String name = application.getName();
List<Instance> instances = application.getInstance();
serviceMap.put(name, instances);
});
System.out.println(serviceMap);
}
public class XmlUtil {
private static final Logger logger = LoggerUtils.getLogger(XmlUtil.class);
static ObjectMapper xmlMapper = new XmlMapper();
static {
xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
xmlMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
}
public static <T> T toObj(String xml, Class<T> tClass) {
try {
return xmlMapper.readValue(xml, tClass);
} catch (Exception e) {
return null;
}
}
}
public static class Service {
private String name;
private String instanceId;
private String status;
private String serverId;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getInstanceId() {
return instanceId;
}
public void setInstanceId(String instanceId) {
this.instanceId = instanceId;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getServerId() {
return serverId;
}
public void setServerId(String serverId) {
this.serverId = serverId;
}
}
@JacksonXmlRootElement
private static class Root {
@JacksonXmlProperty(localName = "application")
@JacksonXmlElementWrapper(useWrapping = false)
private List<Application> application;
public List<Application> getApplication() {
return application;
}
public void setApplication(List<Application> application) {
this.application = application;
}
}
public static class Application {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@JacksonXmlProperty(localName = "instance")
@JacksonXmlElementWrapper(useWrapping = false)
private List<Instance> instance;
public List<Instance> getInstance() {
return instance;
}
public void setInstance(List<Instance> instance) {
this.instance = instance;
}
}
@JacksonXmlRootElement
public static class Instance {
private String instanceId;
private String status;
@JacksonXmlProperty(localName = "metadata")
private Metadata metadata;
public String getInstanceId() {
return instanceId;
}
public void setInstanceId(String instanceId) {
this.instanceId = instanceId;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Metadata getMetadata() {
return metadata;
}
public void setMetadata(Metadata metadata) {
this.metadata = metadata;
}
}
public static class Metadata {
@JacksonXmlProperty(localName = "server-id")
private String serverId;
public String getServerId() {
return serverId;
}
public void setServerId(String serverId) {
this.serverId = serverId;
}
}
```
### [服务上下线](http://www.threeperson.com/users/zld406504302/articles/2159)
### 问题
服务上下线后调用http://name:password@ip:port/eureka/apps 查看服务状态,发现服务状态并没有及时更新。
但是在http://name:password@ip:port/eureka 页面发现服务状态已经改变。我们需要json数据,解析页面就有些麻烦了。
最终发现通过制定服务列表查询,更新更加及时些。
接口:http://name:password@ip:port/eureka/apps/SERVICE-NAME
改变服务状态后,需要访问该接口来刷新单个服务的节点状态。