threeperson
发布于 2019-07-02 / 1 阅读
0
0

springcloud微服务上下线管理

我们的微服务是托管在阿里云平台,通过Swarm控制台管理。平台本身是不提供服务的平滑上下线功能的,只有对应的部署功能。

于是我们在我们的内容搭建了一个服务上下线的管理功能,先看一下管理页面。

![springcloud服务上下线管理](http://dl2.iteye.com/upload/attachment/0132/0238/19e6119c-3b36-30d8-81be-7030f1e8c969.png)

下面罗列一下服务解析和上下线代码。

###服务列表 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

改变服务状态后,需要访问该接口来刷新单个服务的节点状态。


评论