首页 > 解决方案 > 通过 Spring Cloud Netflix 访问服务的端点 /actuator/health:Zuul

问题描述

我有 Spring gateway:localhost:7856和微服务 - “my-service”,例如localhost:8081。我可以访问端点localhost:8081/actuator/health-> {"status": "UP"}。但是我需要通过网关访问这样的端点,比如localhost:7856/my-service/actuator/health
我的网关配置:

zuul:
  ignoredServices: '*'
  routes:
    my-service:
      path: /my-service/**
      serviceId: my-service
      stripPrefix: false

在这里,关键时刻,我无法改变stripPrefix to true。我知道,我可以添加

management:
  endpoints:
    web:
       base-path: /my-service/actuator

但这不是一个好的解决方案,因为在这种情况下还需要更改 eureka 配置(对于 eureka 默认端点是 service-name/actuator/health)以检查微服务的健康状态。或者我可以创建额外的端点来重定向到我需要的东西。但我试图找到最好的决定,可能是 zuul 的特殊属性还是覆盖 zuul 类?

标签: javaspringspring-cloudnetflix-zuulspring-cloud-netflix

解决方案


最后,我找到了解决方案。

import org.springframework.cloud.netflix.zuul.filters.Route;
import org.springframework.cloud.netflix.zuul.filters.SimpleRouteLocator;
import org.springframework.cloud.netflix.zuul.filters.ZuulProperties;
import org.springframework.cloud.netflix.zuul.filters.ZuulProperties.ZuulRoute;

public class CustomRouteLocator extends SimpleRouteLocator {

    public CustomRouteLocator(String servletPath, ZuulProperties properties) {
        super(servletPath, properties);
    }

    @Override
    protected Route getRoute(ZuulRoute route, String path) {
        boolean oldPrefix = route.isStripPrefix();

        if (path.matches(".*/actuator/.*")) {
            route.setStripPrefix(true);
        }

        Route resultRoute = super.getRoute(route, path);
        route.setStripPrefix(oldPrefix);

        return resultRoute;
    }
}

我打开/关闭 stripPrefix 属性。效果很好。


推荐阅读