diff --git a/service-web/src/main/java/com/lanyuanxiaoyao/service/web/WebApplication.java b/service-web/src/main/java/com/lanyuanxiaoyao/service/web/WebApplication.java index ec51cd9..cccaefd 100644 --- a/service-web/src/main/java/com/lanyuanxiaoyao/service/web/WebApplication.java +++ b/service-web/src/main/java/com/lanyuanxiaoyao/service/web/WebApplication.java @@ -1,5 +1,6 @@ package com.lanyuanxiaoyao.service.web; +import javax.annotation.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.ApplicationArguments; @@ -8,7 +9,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration; import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.netflix.eureka.EurekaServiceInstance; import org.springframework.scheduling.annotation.EnableAsync; /** diff --git a/service-web/src/main/java/com/lanyuanxiaoyao/service/web/controller/CloudController.java b/service-web/src/main/java/com/lanyuanxiaoyao/service/web/controller/CloudController.java index 2a6bbff..ad1d6e6 100644 --- a/service-web/src/main/java/com/lanyuanxiaoyao/service/web/controller/CloudController.java +++ b/service-web/src/main/java/com/lanyuanxiaoyao/service/web/controller/CloudController.java @@ -1,7 +1,9 @@ package com.lanyuanxiaoyao.service.web.controller; +import cn.hutool.core.util.ObjectUtil; import com.lanyuanxiaoyao.service.configuration.entity.AmisResponse; import com.lanyuanxiaoyao.service.web.entity.CloudServiceVO; +import com.netflix.appinfo.InstanceInfo; import org.eclipse.collections.api.block.function.Function; import org.eclipse.collections.api.factory.Lists; import org.eclipse.collections.api.factory.Maps; @@ -9,6 +11,7 @@ import org.eclipse.collections.api.list.ImmutableList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.netflix.eureka.EurekaServiceInstance; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -33,15 +36,32 @@ public class CloudController extends BaseController { private ImmutableList serviceVOS(Function groupByField) { return Lists.immutable.ofAll(client.getServices()) .flatCollect(client::getInstances) - .collect(instance -> new CloudServiceVO.Service( - instance.getInstanceId(), - instance.getServiceId(), - instance.getHost(), - instance.getPort(), - instance.isSecure(), - instance.getUri().toString(), - Maps.immutable.ofAll(instance.getMetadata()) - )) + .collect(instance -> { + CloudServiceVO.Service service = new CloudServiceVO.Service( + instance.getInstanceId(), + instance.getServiceId(), + instance.getHost(), + instance.getPort(), + instance.isSecure(), + instance.getUri().toString(), + Maps.immutable.ofAll(instance.getMetadata()) + ); + if (instance instanceof EurekaServiceInstance) { + EurekaServiceInstance eurekaServiceInstance = (EurekaServiceInstance) instance; + InstanceInfo info = eurekaServiceInstance.getInstanceInfo(); + service.setActionType(info.getActionType().name()); + service.setStatus(info.getStatus().name()); + service.setUpdateTime(info.getLastUpdatedTimestamp()); + if (ObjectUtil.isNotNull(info.getLeaseInfo())) { + service.setDuration(info.getLeaseInfo().getDurationInSecs()); + service.setRegistrationTime(info.getLeaseInfo().getRegistrationTimestamp()); + service.setLastRenewalTime(info.getLeaseInfo().getRenewalTimestamp()); + service.setEvictionTime(info.getLeaseInfo().getEvictionTimestamp()); + service.setServiceUpTime(info.getLeaseInfo().getServiceUpTimestamp()); + } + } + return service; + }) .groupBy(groupByField) .toMap() .collectValues((serviceId, services) -> new CloudServiceVO(serviceId, services.toList().toImmutable())) diff --git a/service-web/src/main/java/com/lanyuanxiaoyao/service/web/entity/CloudServiceVO.java b/service-web/src/main/java/com/lanyuanxiaoyao/service/web/entity/CloudServiceVO.java index bbd96c0..cc6af4e 100644 --- a/service-web/src/main/java/com/lanyuanxiaoyao/service/web/entity/CloudServiceVO.java +++ b/service-web/src/main/java/com/lanyuanxiaoyao/service/web/entity/CloudServiceVO.java @@ -44,6 +44,15 @@ public class CloudServiceVO { private final String url; private final ImmutableMap metadata; + private String actionType; + private String status; + private Long updateTime; + private Integer duration; + private Long registrationTime; + private Long lastRenewalTime; + private Long evictionTime; + private Long serviceUpTime; + public Service(String instanceId, String serviceId, String host, Integer port, Boolean secure, String url, ImmutableMap metadata) { this.instanceId = instanceId; this.serviceId = serviceId; @@ -82,6 +91,70 @@ public class CloudServiceVO { return metadata; } + public String getActionType() { + return actionType; + } + + public void setActionType(String actionType) { + this.actionType = actionType; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public Long getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Long updateTime) { + this.updateTime = updateTime; + } + + public Integer getDuration() { + return duration; + } + + public void setDuration(Integer duration) { + this.duration = duration; + } + + public Long getRegistrationTime() { + return registrationTime; + } + + public void setRegistrationTime(Long registrationTime) { + this.registrationTime = registrationTime; + } + + public Long getLastRenewalTime() { + return lastRenewalTime; + } + + public void setLastRenewalTime(Long lastRenewalTime) { + this.lastRenewalTime = lastRenewalTime; + } + + public Long getEvictionTime() { + return evictionTime; + } + + public void setEvictionTime(Long evictionTime) { + this.evictionTime = evictionTime; + } + + public Long getServiceUpTime() { + return serviceUpTime; + } + + public void setServiceUpTime(Long serviceUpTime) { + this.serviceUpTime = serviceUpTime; + } + @Override public String toString() { return "Service{" + @@ -92,6 +165,9 @@ public class CloudServiceVO { ", secure=" + secure + ", url='" + url + '\'' + ", metadata=" + metadata + + ", actionType='" + actionType + '\'' + + ", status='" + status + '\'' + + ", updateTime='" + updateTime + '\'' + '}'; } } diff --git a/service-web/src/main/resources/static/components/cloud-tab.js b/service-web/src/main/resources/static/components/cloud-tab.js index 4b1dbc1..f986bc9 100644 --- a/service-web/src/main/resources/static/components/cloud-tab.js +++ b/service-web/src/main/resources/static/components/cloud-tab.js @@ -1,3 +1,10 @@ +function time(field) { + return { + type: 'tpl', + tpl: `\${${field}|date:YYYY-MM-DD HH\\:mm\\:ss:x}` + } +} + function cloudCrud(title, path) { return { type: 'crud', @@ -13,11 +20,41 @@ function cloudCrud(title, path) { columns: [ {name: 'name', label: '名称'}, { - name: 'serviceId', - label: '服务', - width: 200, + name: 'status', + label: '状态', + align: 'center', + width: 60, + }, + { + name: 'serviceUpTime', + label: '启动时间', + ...time('serviceUpTime'), + align: 'center', + width: 140, + }, + { + name: 'registrationTime', + label: '注册时间', + ...time('registrationTime'), + align: 'center', + width: 140, + }, + { + name: 'lastRenewalTime', + label: '上次更新时间', + ...time('lastRenewalTime'), + align: 'center', + width: 140, + }, + { + name: 'evictionTime', + label: '驱逐时间', + ...time('evictionTime'), + align: 'center', + width: 140, }, {name: 'url', label: '地址', width: 200}, + {name: 'serviceId', label: '服务', width: 180, fixed: 'right'}, ] } }