You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by wu...@apache.org on 2018/01/10 07:38:28 UTC

[incubator-servicecomb-java-chassis] 04/13: SCB-166 fix pr

This is an automated email from the ASF dual-hosted git repository.

wujimin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git

commit b32d4fb155bb1a83aa45c14fe86f6bd19b3c1e00
Author: zhengyangyong <ya...@huawei.com>
AuthorDate: Sat Jan 6 11:06:35 2018 +0800

    SCB-166 fix pr
    
    Signed-off-by: zhengyangyong <ya...@huawei.com>
---
 .../java/io/servicecomb/metrics/common/Health.java | 18 +++-------
 metrics/metrics-core/pom.xml                       |  4 +++
 .../health/DefaultMicroserviceHealthChecker.java   |  5 ++-
 .../core/publish/DefaultHealthCheckerManager.java  | 39 ++++++++++++++++++++++
 ...ker.java => CustomHealthCheckerAnnotation.java} |  8 +++--
 ...mHealthChecker.java => MySqlHealthChecker.java} | 26 +++++++++++++--
 .../metrics/extendhealthcheck/SimpleService.java   |  2 +-
 7 files changed, 81 insertions(+), 21 deletions(-)

diff --git a/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthChecker.java b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/Health.java
similarity index 63%
copy from samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthChecker.java
copy to metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/Health.java
index 1960de8..eb8c59f 100644
--- a/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthChecker.java
+++ b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/Health.java
@@ -15,20 +15,12 @@
  * limitations under the License.
  */
 
-package io.servicecomb.samples.metrics.extendhealthcheck;
+package io.servicecomb.metrics.common;
 
-import io.servicecomb.metrics.common.HealthCheckResult;
-import io.servicecomb.metrics.common.HealthChecker;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Target;
 
-public class CustomHealthChecker implements HealthChecker {
-  @Override
-  public String getName() {
-    return "custom";
-  }
+@Target(value = {ElementType.TYPE})
+public @interface Health {
 
-  @Override
-  public HealthCheckResult check() {
-    //add your health check code here
-    return new HealthCheckResult(true, "demo health check", "no extra data");
-  }
 }
diff --git a/metrics/metrics-core/pom.xml b/metrics/metrics-core/pom.xml
index 2566bbe..17115e4 100644
--- a/metrics/metrics-core/pom.xml
+++ b/metrics/metrics-core/pom.xml
@@ -47,6 +47,10 @@
       <artifactId>slf4j-log4j12</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-core</artifactId>
+    </dependency>
   </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/health/DefaultMicroserviceHealthChecker.java b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/health/DefaultMicroserviceHealthChecker.java
index f4fe4c1..df2d81e 100644
--- a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/health/DefaultMicroserviceHealthChecker.java
+++ b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/health/DefaultMicroserviceHealthChecker.java
@@ -17,6 +17,8 @@
 
 package io.servicecomb.metrics.core.health;
 
+import javax.ws.rs.core.Response.Status;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -27,6 +29,7 @@ import io.servicecomb.metrics.common.HealthChecker;
 import io.servicecomb.serviceregistry.RegistryUtils;
 import io.servicecomb.serviceregistry.api.registry.Microservice;
 import io.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
+import io.servicecomb.swagger.invocation.exception.InvocationException;
 
 public class DefaultMicroserviceHealthChecker implements HealthChecker {
 
@@ -56,7 +59,7 @@ public class DefaultMicroserviceHealthChecker implements HealthChecker {
     } catch (Exception e) {
       String error = "unable load microservice info from RegistryUtils";
       logger.error(error, e);
-      return error;
+      throw new InvocationException(Status.INTERNAL_SERVER_ERROR, error);
     }
   }
 }
diff --git a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/publish/DefaultHealthCheckerManager.java b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/publish/DefaultHealthCheckerManager.java
index 0393ab9..9cb5cb3 100644
--- a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/publish/DefaultHealthCheckerManager.java
+++ b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/publish/DefaultHealthCheckerManager.java
@@ -19,13 +19,21 @@ package io.servicecomb.metrics.core.publish;
 
 import static javax.ws.rs.core.Response.Status.BAD_REQUEST;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
+import org.springframework.core.type.filter.AnnotationTypeFilter;
 import org.springframework.stereotype.Component;
 
+import io.servicecomb.metrics.common.Health;
 import io.servicecomb.metrics.common.HealthCheckResult;
 import io.servicecomb.metrics.common.HealthChecker;
 import io.servicecomb.metrics.core.health.DefaultMicroserviceHealthChecker;
@@ -33,12 +41,19 @@ import io.servicecomb.swagger.invocation.exception.InvocationException;
 
 @Component
 public class DefaultHealthCheckerManager implements HealthCheckerManager {
+
+  private static Logger logger = LoggerFactory.getLogger(DefaultHealthCheckerManager.class);
+
   private final Map<String, HealthChecker> healthCheckers;
 
   public DefaultHealthCheckerManager() {
     this.healthCheckers = new ConcurrentHashMap<>();
     HealthChecker defaultHealthChecker = new DefaultMicroserviceHealthChecker();
     this.healthCheckers.put(defaultHealthChecker.getName(), defaultHealthChecker);
+
+    for (HealthChecker checker : getAllAnnotationHealthChecker()) {
+      this.healthCheckers.put(checker.getName(), checker);
+    }
   }
 
   @Override
@@ -59,4 +74,28 @@ public class DefaultHealthCheckerManager implements HealthCheckerManager {
     }
     throw new InvocationException(BAD_REQUEST, "HealthChecker name : " + name + " unregister");
   }
+
+  private List<HealthChecker> getAllAnnotationHealthChecker() {
+    List<HealthChecker> checkers = new ArrayList<>();
+    ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);
+    scanner.addIncludeFilter(new AnnotationTypeFilter(Health.class));
+    for (BeanDefinition definition : scanner.findCandidateComponents("./")) {
+      try {
+        Class<?> beanClass = Class.forName(definition.getBeanClassName());
+        if (HealthChecker.class.isAssignableFrom(beanClass)) {
+          try {
+            checkers.add((HealthChecker) beanClass.getConstructor(null).newInstance());
+          } catch (Exception e) {
+            logger.error("construct health check class failed", e);
+          }
+        } else {
+          logger.error(
+              "health annotation class:" + definition.getBeanClassName() + " not implement HealthChecker interface");
+        }
+      } catch (ClassNotFoundException e) {
+        logger.error("health check class not found", e);
+      }
+    }
+    return checkers;
+  }
 }
diff --git a/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthChecker.java b/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthCheckerAnnotation.java
similarity index 81%
copy from samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthChecker.java
copy to samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthCheckerAnnotation.java
index 1960de8..6816abd 100644
--- a/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthChecker.java
+++ b/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthCheckerAnnotation.java
@@ -17,10 +17,13 @@
 
 package io.servicecomb.samples.metrics.extendhealthcheck;
 
+import io.servicecomb.metrics.common.Health;
 import io.servicecomb.metrics.common.HealthCheckResult;
 import io.servicecomb.metrics.common.HealthChecker;
 
-public class CustomHealthChecker implements HealthChecker {
+//this health check will auto register because Health Annotation
+@Health
+public class CustomHealthCheckerAnnotation implements HealthChecker {
   @Override
   public String getName() {
     return "custom";
@@ -28,7 +31,6 @@ public class CustomHealthChecker implements HealthChecker {
 
   @Override
   public HealthCheckResult check() {
-    //add your health check code here
-    return new HealthCheckResult(true, "demo health check", "no extra data");
+    return new HealthCheckResult(true, "custom", "no extra data");
   }
 }
diff --git a/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthChecker.java b/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/MySqlHealthChecker.java
similarity index 59%
rename from samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthChecker.java
rename to samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/MySqlHealthChecker.java
index 1960de8..620857d 100644
--- a/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/CustomHealthChecker.java
+++ b/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/MySqlHealthChecker.java
@@ -17,18 +17,38 @@
 
 package io.servicecomb.samples.metrics.extendhealthcheck;
 
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+
 import io.servicecomb.metrics.common.HealthCheckResult;
 import io.servicecomb.metrics.common.HealthChecker;
 
-public class CustomHealthChecker implements HealthChecker {
+//this is a demo health checker for mysql
+public class MySqlHealthChecker implements HealthChecker {
   @Override
   public String getName() {
-    return "custom";
+    return "mysql";
   }
 
   @Override
   public HealthCheckResult check() {
     //add your health check code here
-    return new HealthCheckResult(true, "demo health check", "no extra data");
+    Connection connection = null;
+    try {
+      connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test_db?useSSL=false", "root", "pwd");
+      return new HealthCheckResult(true, "local mysql health check", "");
+    } catch (SQLException e) {
+      e.printStackTrace();
+      return new HealthCheckResult(false, "local mysql health check", e.toString());
+    } finally {
+      if (connection != null) {
+        try {
+          connection.close();
+        } catch (SQLException e) {
+          e.printStackTrace();
+        }
+      }
+    }
   }
 }
diff --git a/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/SimpleService.java b/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/SimpleService.java
index 5e24cb2..a25cdba 100644
--- a/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/SimpleService.java
+++ b/samples/metrics-extend-healthcheck/src/main/java/io/servicecomb/samples/metrics/extendhealthcheck/SimpleService.java
@@ -38,7 +38,7 @@ public class SimpleService {
     this.manager = manager;
 
     //register your custom health check
-    this.manager.register(new CustomHealthChecker());
+    this.manager.register(new MySqlHealthChecker());
   }
 
   @GetMapping(path = "/f")

-- 
To stop receiving notification emails like this one, please contact
"commits@servicecomb.apache.org" <co...@servicecomb.apache.org>.