2017-12-17 13 views
2

HTTPメソッド(GET/POST/PUT ...)に基づいてZuulの動的ルーティングを作成する方法は?あなたがルートに異なるホストの代わりに、デフォルトで説明したものとPOSTリクエスト必要例えば 、「zuul.routesを。*」...HTTPメソッドに基づいてZuul動的ルーティングを作成し、 'serviceId'によってターゲットホストを解決するにはどうすればいいですか?

zuul: 
    routes: 
    first-service: 
     path: /first/** 
     serviceId: first-service 
     stripPrefix: false 

    second-service: 
     path: /second/** 
     serviceId: second-service 
     stripPrefix: false 

すなわち、私たちは「GET /最初」を要求し、その後Zuulルート「最初のサービス」への要求が、我々は「第二サービス」から「POST /最初」をZuulルート要求を要求した場合。

答えて

2

HTTPメソッドに基づいて動的ルーティングを実装するには、カスタム 'ルートタイプ'ZuulFilterを作成し、 'serviceId'からDiscoveryClientを解決できます。例:

@Component 
public class PostFilter extends ZuulFilter { 

    private static final String REQUEST_PATH = "/first"; 
    private static final String TARGET_SERVICE = "second-service"; 
    private static final String HTTP_METHOD = "POST"; 

    private final DiscoveryClient discoveryClient; 

    public PostOrdersFilter(DiscoveryClient discoveryClient) { 
     this.discoveryClient = discoveryClient; 
    } 

    @Override 
    public String filterType() { 
     return "route"; 
    } 

    @Override 
    public int filterOrder() { 
     return 0; 
    } 

    @Override 
    public boolean shouldFilter() { 
     RequestContext context = RequestContext.getCurrentContext(); 
     HttpServletRequest request = context.getRequest(); 
     String method = request.getMethod(); 
     String requestURI = request.getRequestURI(); 
     return HTTP_METHOD.equalsIgnoreCase(method) && requestURI.startsWith(REQUEST_PATH); 
    } 

    @Override 
    public Object run() { 

     RequestContext context = RequestContext.getCurrentContext(); 
     List<ServiceInstance> instances = discoveryClient.getInstances(TARGET_SERVICE); 
     try { 
      if (instances != null && instances.size() > 0) { 
       context.setRouteHost(instances.get(0).getUri().toURL()); 
      } else { 
       throw new IllegalStateException("Target service instance not found!"); 
      } 
     } catch (Exception e) { 
      throw new IllegalArgumentException("Couldn't get service URL!", e); 
     } 
     return null; 
    } 
} 
関連する問題