2017-08-12 33 views
0

我正在使用微服務架構,Zuul網關聯繫Eureka服務器以發現發佈的微服務。我希望我的zuul網關以特定格式接受路徑。如何使用令牌配置URL的Zuul路由?

它收到一個帶有作爲令牌發送的成員id的URL調用。因爲我們希望避免在URL中發送敏感信息,所以這些可期望的令牌將由Zuul解析,例如轉換爲社會安全號碼,並且ssn將在頭部中發送。

例如,銀行ACCT GET:

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

將映射到

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

我的計劃是建立一個 「預」 Zuul過濾器解析出成員令牌「11」並使用它來獲取SSN,然後將其添加到標題。

但我不知道如何配置此路線,或者如果它甚至可能。

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

沒有實現它。有我可以使用的其他機制嗎?

回答

1

在Zuul github上有幾個關於這個問題的論壇帖子,但沒有一個解決方案爲我工作。我無法弄清楚爲什麼並最終意識到:從我的Spring Tool Suite熱門部署到Zuul是重新啓動應用程序,但沒有部署最新的更改(最終這可能是對JRebel的認可!)。一旦我意識到這一點,我開始嘗試停止/部署/開始編碼,直到我得到一個與ZuulFilter合作的解決方案。

的解決方案涉及一個「預」濾波器,其重寫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; 
    } 

} 
+0

我正在嘗試做一些非常相似的事情,並且有興趣知道你在application.properties/yml中設置了哪些路由以使其工作?您是否需要原始路線以及與會員取走的路線? – Romell

+0

您的路線設置應獨立於此解決方案。在我的情況下,我使用了發現客戶端(Eureka),以便我的路由被動態配置。我在原始示例中沒有顯示的是,微服務名稱需要成爲網關的一部分,因此:http://zuulgateway/microservice/members.../ – IcedDante