diff --git a/ms/register-center1/README.md b/ms/register-center1/README.md
index 0a16ef9..7f5515d 100644
--- a/ms/register-center1/README.md
+++ b/ms/register-center1/README.md
@@ -1,4 +1,7 @@
# 高可用注册中心
相同的hostname的注册中心eureka会认为是这些euraka在同一台物理机上,这些eureka会一共存储
一份注册者的信息,而不是每个注册中心存储一份。所以在同一台机器上模拟高可用注册中心的时候
-必须修改hosts文件,注册中心使用不同的hostname
\ No newline at end of file
+必须修改hosts文件,注册中心使用不同的hostname
+
+#### 增加了注册实例查询的restful接口
+默认的base路径是`/restful/eureka`
\ No newline at end of file
diff --git a/ms/register-center1/pom.xml b/ms/register-center1/pom.xml
index 730a1a9..4bc764b 100644
--- a/ms/register-center1/pom.xml
+++ b/ms/register-center1/pom.xml
@@ -41,6 +41,12 @@
org.springframework.boot
spring-boot-starter-security
+
+
+ com.micro.fast
+ boot-starter-common
+ ${micro.fast.version}
+
org.springframework.boot
diff --git a/ms/register-center1/src/main/java/com/micro/fast/eureka/server/controller/RestfulEurekaController.java b/ms/register-center1/src/main/java/com/micro/fast/eureka/server/controller/RestfulEurekaController.java
index 5023354..5663e7f 100644
--- a/ms/register-center1/src/main/java/com/micro/fast/eureka/server/controller/RestfulEurekaController.java
+++ b/ms/register-center1/src/main/java/com/micro/fast/eureka/server/controller/RestfulEurekaController.java
@@ -1,5 +1,6 @@
package com.micro.fast.eureka.server.controller;
+import com.micro.fast.boot.starter.common.response.ServerResponse;
import com.netflix.appinfo.AmazonInfo;
import com.netflix.appinfo.ApplicationInfoManager;
import com.netflix.appinfo.DataCenterInfo;
@@ -14,28 +15,33 @@ import com.netflix.eureka.registry.PeerAwareInstanceRegistry;
import com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl;
import com.netflix.eureka.resources.StatusResource;
import com.netflix.eureka.util.StatusInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpStatus;
+import org.mortbay.jetty.Server;
import org.springframework.beans.factory.annotation.Value;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.net.URI;
import java.util.*;
+
/**
* restful操作eureka的接口
+ *
* @author lsy
*/
@RestController
@RequestMapping({"${eureka.restful.path:/restful/eureka}"})
+@Api(description = "注册中心的restful接口")
public class RestfulEurekaController {
@Value("${eureka.restful.path:/restful/eureka}")
- private String restfulPath = "";
+ private String restfulPath = "/restful/eureka";
+
/**
* 实例管理对象
*/
@@ -45,11 +51,64 @@ public class RestfulEurekaController {
this.applicationInfoManager = applicationInfoManager;
}
- /**
- * 获取详细信息
- * @param request
- * @return
- */
+ @GetMapping("/apps")
+ @ApiOperation("获取所有的服务实例的简单信息")
+ public ServerResponse apps(HttpServletRequest request, HttpServletResponse response) {
+ Map map = new HashMap<>();
+ //获取所有服务的信息
+ populateApps(map);
+ return ServerResponse.successMsgData("获取所有实例成功", map);
+ }
+
+ @GetMapping("/apps/{instanceId}")
+ @ApiOperation("根据主机名获取某个实例的信息")
+ public ServerResponse getInstance(@PathVariable("instanceId") String instanceId) {
+ InstanceInfo instanceInfo = null;
+ if (StringUtils.isNotBlank(instanceId)){
+ List sortedApplications = getRegistry().getSortedApplications();
+ boolean isBreak = false;
+ for (Application sortedApplication : sortedApplications) {
+ List instances = sortedApplication.getInstances();
+ for (InstanceInfo instance : instances) {
+ String hostName = instance.getHostName();
+ if (hostName.startsWith(instanceId)){
+ instanceInfo = instance;
+ isBreak = true;
+ break;
+ }
+ }
+ if (isBreak){
+ break;
+ }
+ }
+ }else {
+ return ServerResponse.errorMsg("instanceId不能为空");
+ }
+
+ return ServerResponse.successMsgData("根据主机名获取实例信息成功", instanceInfo);
+ }
+ @GetMapping("/apps/{appId}")
+ @ApiOperation("根据appId查询实例,可能有多个")
+ public ServerResponse getInstancesByAppId(@PathVariable("appId") String appId) {
+ Set instanceInfos = new HashSet<>(10);
+ if (StringUtils.isNotBlank(appId)){
+ List sortedApplications = getRegistry().getSortedApplications();
+ for (Application sortedApplication : sortedApplications) {
+ List instances = sortedApplication.getInstances();
+ for (InstanceInfo instance : instances) {
+ if (appId.equals(instance.getAppName())){
+ instanceInfos.add(instance);
+ }
+ }
+
+ }
+ }else {
+ return ServerResponse.errorMsg("instanceId不能为空");
+ }
+
+ return ServerResponse.successMsgData("根据主机名获取实例信息成功", instanceInfos);
+ }
+
@GetMapping
@ResponseBody
public Map status(HttpServletRequest request, HttpServletResponse response) {
@@ -58,26 +117,27 @@ public class RestfulEurekaController {
populateApps(map);
StatusInfo statusInfo;
try {
+ //获取当前注册中心的本身的相信信息
statusInfo = new StatusResource().getStatusInfo();
- }
- catch (Exception e) {
+ } catch (Exception e) {
+ //获取当前注册中心的本身的相信信息
statusInfo = StatusInfo.Builder.newBuilder().isHealthy(false).build();
}
map.put("statusInfo", statusInfo);
populateInstanceInfo(map, statusInfo);
filterReplicas(map, statusInfo);
- response.setStatus(HttpStatus.SC_OK);
return map;
}
/**
* 获取最后注册的实例
+ *
* @param request
* @return
*/
@GetMapping("/lastn")
public Map lastn(HttpServletRequest request) {
- Map map = new HashMap<>();
+ Map map = new HashMap<>();
populateBase(request, map);
PeerAwareInstanceRegistryImpl registry = (PeerAwareInstanceRegistryImpl) getRegistry();
ArrayList