From 438acdd56ee48821f3a7a4660ffc3286f775313d Mon Sep 17 00:00:00 2001 From: lengleng Date: Thu, 19 Nov 2020 15:38:50 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20Introducing=20new=20features.=20#2?= =?UTF-8?q?022=20=E8=87=AA=E5=AE=9A=E4=B9=89=20Spring=20Boot=20FailureAnal?= =?UTF-8?q?yzer=20=E9=81=BF=E5=85=8D=E8=B7=AF=E7=94=B1=E6=B2=A1=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=20=E5=90=AF=E5=8A=A8=E7=BD=91=E5=85=B3?= =?UTF-8?q?=E5=AF=BC=E8=87=B4404?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DynamicRouteAutoConfiguration.java | 22 +++++++++++++ .../exception/RouteCheckException.java | 27 +++++++++++++++ .../exception/RouteCheckFailureAnalyzer.java | 20 +++++++++++ .../support/DynamicRouteHealthIndicator.java | 33 +++++++++++++++++++ .../support/RedisRouteDefinitionWriter.java | 3 +- .../main/resources/META-INF/spring.factories | 2 ++ 6 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/exception/RouteCheckException.java create mode 100644 pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/exception/RouteCheckFailureAnalyzer.java create mode 100644 pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/DynamicRouteHealthIndicator.java create mode 100644 pigx-common/pigx-common-gateway/src/main/resources/META-INF/spring.factories diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/DynamicRouteAutoConfiguration.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/DynamicRouteAutoConfiguration.java index 3af60ffcb..6b8ccaae3 100644 --- a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/DynamicRouteAutoConfiguration.java +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/DynamicRouteAutoConfiguration.java @@ -19,6 +19,8 @@ package com.pig4cloud.pigx.common.gateway.configuration; import com.pig4cloud.pigx.common.core.constant.CacheConstants; import com.pig4cloud.pigx.common.core.util.SpringContextHolder; +import com.pig4cloud.pigx.common.gateway.exception.RouteCheckException; +import com.pig4cloud.pigx.common.gateway.support.DynamicRouteHealthIndicator; import com.pig4cloud.pigx.common.gateway.support.RouteCacheHolder; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; @@ -29,8 +31,10 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.listener.ChannelTopic; import org.springframework.data.redis.listener.RedisMessageListenerContainer; +import org.springframework.data.redis.serializer.StringRedisSerializer; /** * @author lengleng @@ -46,6 +50,7 @@ public class DynamicRouteAutoConfiguration { /** * 配置文件设置为空 redis 加载为准 + * * @return */ @Bean @@ -55,6 +60,7 @@ public class DynamicRouteAutoConfiguration { /** * redis 监听配置 + * * @param redisConnectionFactory redis 配置 * @return */ @@ -71,4 +77,20 @@ public class DynamicRouteAutoConfiguration { return container; } + /** + * 动态路由监控检查 + * + * @param redisTemplate redis + * @return + */ + @Bean + public DynamicRouteHealthIndicator healthIndicator(RedisTemplate redisTemplate) { + + redisTemplate.setKeySerializer(new StringRedisSerializer()); + if (!redisTemplate.hasKey(CacheConstants.ROUTE_KEY)) { + throw new RouteCheckException("路由信息未初始化,网关启动失败"); + } + + return new DynamicRouteHealthIndicator(redisTemplate); + } } diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/exception/RouteCheckException.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/exception/RouteCheckException.java new file mode 100644 index 000000000..9b147ce5a --- /dev/null +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/exception/RouteCheckException.java @@ -0,0 +1,27 @@ +package com.pig4cloud.pigx.common.gateway.exception; + +/** + * @author lengleng + * @date 2020/11/19 + */ +public class RouteCheckException extends RuntimeException { + + public RouteCheckException() { + } + + public RouteCheckException(String message) { + super(message); + } + + public RouteCheckException(String message, Throwable cause) { + super(message, cause); + } + + public RouteCheckException(Throwable cause) { + super(cause); + } + + public RouteCheckException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/exception/RouteCheckFailureAnalyzer.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/exception/RouteCheckFailureAnalyzer.java new file mode 100644 index 000000000..f1c26d369 --- /dev/null +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/exception/RouteCheckFailureAnalyzer.java @@ -0,0 +1,20 @@ +package com.pig4cloud.pigx.common.gateway.exception; + +import org.springframework.boot.diagnostics.AbstractFailureAnalyzer; +import org.springframework.boot.diagnostics.FailureAnalysis; + +/** + * @author lengleng + * @date 2020/11/19 + *

+ * 格式化异常信息,方便启动时观察。 + */ +public class RouteCheckFailureAnalyzer extends AbstractFailureAnalyzer { + + @Override + protected FailureAnalysis analyze(Throwable rootFailure, RouteCheckException cause) { + + return new FailureAnalysis(cause.getMessage(), + "解决方案参考: http://t.cn/A6Gl3sDJ", cause); + } +} diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/DynamicRouteHealthIndicator.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/DynamicRouteHealthIndicator.java new file mode 100644 index 000000000..05be3166b --- /dev/null +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/DynamicRouteHealthIndicator.java @@ -0,0 +1,33 @@ +package com.pig4cloud.pigx.common.gateway.support; + +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.actuate.health.AbstractHealthIndicator; +import org.springframework.boot.actuate.health.Health; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +/** + * @author lengleng + * @date 2020/11/19 + *

+ * 动态路由检查检查 + */ +@Slf4j +@RequiredArgsConstructor +public class DynamicRouteHealthIndicator extends AbstractHealthIndicator { + + private final RedisTemplate redisTemplate; + + @Override + protected void doHealthCheck(Health.Builder builder) { + redisTemplate.setKeySerializer(new StringRedisSerializer()); + if (redisTemplate.hasKey(CacheConstants.ROUTE_KEY)) { + builder.up(); + } else { + log.warn("动态路由监控检查失败,当前无路由配置"); + builder.down(); + } + } +} diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/RedisRouteDefinitionWriter.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/RedisRouteDefinitionWriter.java index 52b9f8eb7..b8796c9f3 100644 --- a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/RedisRouteDefinitionWriter.java +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/RedisRouteDefinitionWriter.java @@ -21,6 +21,7 @@ import cn.hutool.core.collection.CollUtil; import com.pig4cloud.pigx.common.core.constant.CacheConstants; import com.pig4cloud.pigx.common.gateway.vo.RouteDefinitionVo; import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.cloud.gateway.route.RouteDefinition; @@ -42,7 +43,7 @@ import java.util.List; */ @Slf4j @Component -@AllArgsConstructor +@RequiredArgsConstructor public class RedisRouteDefinitionWriter implements RouteDefinitionRepository { private final RedisTemplate redisTemplate; diff --git a/pigx-common/pigx-common-gateway/src/main/resources/META-INF/spring.factories b/pigx-common/pigx-common-gateway/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..6b20e9c77 --- /dev/null +++ b/pigx-common/pigx-common-gateway/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.diagnostics.FailureAnalyzer=\ +com.pig4cloud.pigx.common.gateway.exception.RouteCheckFailureAnalyzer \ No newline at end of file