From 1d354face94f8dde59bd9b648251faf70be1765b Mon Sep 17 00:00:00 2001 From: chenxing Date: Tue, 22 Sep 2026 09:25:07 +0800 Subject: [PATCH] =?UTF-8?q?E04a:=20/actuator/**=20=E7=BA=B3=E5=85=A5?= =?UTF-8?q?=E7=BD=91=E5=85=B3=E8=87=AA=E8=BA=AB=E7=AB=AF=E7=82=B9=E6=97=81?= =?UTF-8?q?=E8=B7=AF=EF=BC=88=E6=8E=A2=E6=B4=BB=E4=B8=8D=E8=A2=AB=20oapi?= =?UTF-8?q?=20=E9=93=BE=E8=A3=B8=20404=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit projman 探活口径 = {ctx}/actuator/health 且只认 HTTP 200;网关原先只旁路 /api/internal/**,健康探针被 TargetRouter 判未知 target 裸 404 → HealthGuard 连续失败会周期性 restart,E05/E06 的 health=200 验收也不可能达成。 台账/验签/转发四处共用同一判定,故一处改动即全链生效。 --- .../platform/gateway/filter/RoutingFilter.java | 13 +++++++++++-- .../platform/gateway/chain/GatewayChainTest.java | 11 +++++++++++ .../gateway/chain/GatewayEnforceChainTest.java | 9 +++++++++ src/test/resources/application-test.yml | 7 +++++++ 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/yunhai/platform/gateway/filter/RoutingFilter.java b/src/main/java/com/yunhai/platform/gateway/filter/RoutingFilter.java index 7049b00..d088400 100644 --- a/src/main/java/com/yunhai/platform/gateway/filter/RoutingFilter.java +++ b/src/main/java/com/yunhai/platform/gateway/filter/RoutingFilter.java @@ -31,6 +31,12 @@ public class RoutingFilter implements Filter { /** 网关自身管理端点前缀:绕开 oapi 判定链(T0.10 /api/internal/routes/refresh) */ public static final String INTERNAL_PREFIX = "/api/internal"; + /** + * 探活端点前缀:projman 的探活口径是 {@code {ctx}/actuator/health},被 oapi 链裸 404 + * 判死的容器会被 HealthGuard 周期性 restart,故与 {@link #INTERNAL_PREFIX} 同级旁路。 + */ + public static final String ACTUATOR_PREFIX = "/actuator"; + /** 路由产物 attribute({@link TargetRouter.Routing}) */ public static final String ATTR_ROUTING = "yh.gateway.routing"; /** 注册表策略 attribute({@link RouteSpec}) */ @@ -83,7 +89,10 @@ public class RoutingFilter implements Filter { } static boolean isGatewayInternal(String uri) { - return uri != null - && (uri.equals(INTERNAL_PREFIX) || uri.startsWith(INTERNAL_PREFIX + "/")); + return isSelfPath(uri, INTERNAL_PREFIX) || isSelfPath(uri, ACTUATOR_PREFIX); + } + + private static boolean isSelfPath(String uri, String prefix) { + return uri != null && (uri.equals(prefix) || uri.startsWith(prefix + "/")); } } diff --git a/src/test/java/com/yunhai/platform/gateway/chain/GatewayChainTest.java b/src/test/java/com/yunhai/platform/gateway/chain/GatewayChainTest.java index d67c230..0ce814e 100644 --- a/src/test/java/com/yunhai/platform/gateway/chain/GatewayChainTest.java +++ b/src/test/java/com/yunhai/platform/gateway/chain/GatewayChainTest.java @@ -179,4 +179,15 @@ class GatewayChainTest { ResponseEntity resp = rest.postForEntity("/api/internal/routes/refresh", null, String.class); assertThat(resp.getStatusCodeValue()).as("自身端点走 controller,不进 oapi 链").isEqualTo(200); } + + @Test + void actuator健康端点属自身端点_不被链拦且不入台账() throws Exception { + ResponseEntity resp = rest.getForEntity("/actuator/health", String.class); + + assertThat(resp.getStatusCodeValue()).as("健康探针不被 oapi 链裸 404(平台探活口径 = {ctx}/actuator/health)").isEqualTo(200); + assertThat(resp.getBody()).as("探针可读").contains("UP"); + + Thread.sleep(700); + assertThat(logRepository.findAll()).as("探针每 10s 一次,不得灌进 open_api 台账").isEmpty(); + } } diff --git a/src/test/java/com/yunhai/platform/gateway/chain/GatewayEnforceChainTest.java b/src/test/java/com/yunhai/platform/gateway/chain/GatewayEnforceChainTest.java index 9eef8cb..371a07a 100644 --- a/src/test/java/com/yunhai/platform/gateway/chain/GatewayEnforceChainTest.java +++ b/src/test/java/com/yunhai/platform/gateway/chain/GatewayEnforceChainTest.java @@ -128,4 +128,13 @@ class GatewayEnforceChainTest { assertThat(resp.getStatusCodeValue()).isEqualTo(200); assertThat(CALLER_SEEN.get()).isEqualTo("100617"); } + + @Test + void 收口形态下健康探针仍可达() { + ResponseEntity resp = rest.getForEntity("/actuator/health", String.class); + + assertThat(resp.getStatusCodeValue()) + .as("observe=false 也不得拦自身探针:平台探活口径是 {ctx}/actuator/health,拦死即重启风暴") + .isEqualTo(200); + } } diff --git a/src/test/resources/application-test.yml b/src/test/resources/application-test.yml index 18a0fa5..16f0a59 100644 --- a/src/test/resources/application-test.yml +++ b/src/test/resources/application-test.yml @@ -12,3 +12,10 @@ spring: jpa: hibernate: ddl-auto: none + +management: + health: + redis: + # 测试上下文没有 redis(默认 localhost:6379 连不上会让聚合探针 503); + # E04a 用例要钉的是「探针不经 oapi 链」= 平台探活口径 HTTP 200 + enabled: false