【问题标题】:How do I configure Zuul routing for URL with Token?如何为带有 Token 的 URL 配置 Zuul 路由?
【发布时间】:2017-08-12 11:55:47
【问题描述】:

我正在使用微服务架构,其中 Zuul 网关与 Eureka 服务器联系以发现已发布的微服务。我希望我的 zuul 网关接受特定格式的路径。

它收到了一个带有作为令牌发送的成员 ID 的 URL 调用。因为我们希望避免在 URL 中发送敏感信息,所以 Zuul 会解析这些可过期的令牌,将其转换为社会安全号码,例如,ssn 将在标头中发送。

例如,银行帐户 GET:

http://zuulgateway/member/11/account/

将映射到

http://microservice/account X-MEMBER-SSN: 1112223333

我的计划是设置一个“pre”Zuul过滤器来解析出成员令牌“11”并使用它来获取SSN,然后将其添加到header中。

但我不确定我如何配置这条路线,或者它是否可能。

zuul.routes.account.path: /member/*/**

没有实现。我可以使用其他一些机制吗?

【问题讨论】:

    标签: netflix-eureka netflix-zuul


    【解决方案1】:

    Zuul github 上有一些关于此问题的论坛帖子,但没有一个解决方案对我有用。我不知道为什么,终于意识到:从我的 Spring Tool Suite 到 Zuul 的热部署是重新启动应用程序,而不是部署最新的更改(也许这最终是对 JRebel 的背书!)。一旦我意识到这一点,我就开始尝试停止/部署/开始编码,直到我得到一个使用 ZuulFilter 的解决方案。

    解决方案涉及一个“pre”过滤器,它重写 contextURL 以删除 URL 的 /member/\d+/ 部分,以便可以将上下文直接映射到

    下面是一些示例代码:

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
    import org.springframework.stereotype.Component;
    
    import com.netflix.zuul.ZuulFilter;
    import com.netflix.zuul.context.RequestContext;
    
    @Component
    public class SpecialFilter extends ZuulFilter {
    
        private static final String REQUEST_URI_KEY = "requestURI";
        private static final Pattern URL_PATTERN = Pattern.compile("^\\/?(\\d+)\\/(.+)$");
    
        @Override
        public boolean shouldFilter() {
            return isMember(RequestContext.getCurrentContext());
        }
    
        private boolean isMember(RequestContext currentContext) {
            String path = (String) currentContext.get(REQUEST_URI_KEY);
            Matcher m = URL_PATTERN.matcher(path);
            return m.matches();
        }
    
        @Override
        public Object run() {
            RequestContext context = RequestContext.getCurrentContext();
            String originalRequestPath = (String) context.get(REQUEST_URI_KEY);
            Matcher m = URL_PATTERN.matcher(originalRequestPath);
            System.out.println("Parsing original "+originalRequestPath + " against " + URL_PATTERN.toString());
            if(!m.matches()) {
                System.err.println("Invalid URL");
                return null;
            }
            String ssn = translateSSN(m.group(1));
            String requestPath = m.group(2);
            String modifiedRequestPath = "/" + requestPath;
            context.put(REQUEST_URI_KEY, modifiedRequestPath);
    
            //Add this header to the request
            context.addZuulRequestHeader("X-SSN", ssn);
            return null;
        }
    
        @Override
        public String filterType() {
            return "pre";
        }
    
        @Override
        public int filterOrder() {
            // Should proceed this filter
            return FilterConstants.PRE_DECORATION_FILTER_ORDER + 1;
        }
    
    }
    

    【讨论】:

    • 我正在尝试做一些非常相似的事情,并且有兴趣知道您在 application.properties/yml 中设置了哪些路由以使其正常工作?原路线和取出会员的路线都需要吗?
    • 你的路由设置应该独立于这个解决方案。就我而言,我使用了一个发现客户端(Eureka),以便动态配置我的路由。我在原始示例中没有显示的是微服务名称需要是网关的一部分,所以:zuulgateway/microservice/members...
    猜你喜欢
    • 2016-06-05
    • 2017-12-23
    • 2016-11-14
    • 2016-09-16
    • 2016-09-22
    • 2012-05-10
    • 2023-03-11
    • 2017-11-25
    • 1970-01-01
    相关资源
    最近更新 更多