如何在zuul中进行基于内容的动态路由?

时间:2018-06-12 18:37:50

标签: spring-boot routing microservices netflix-zuul

我正在开发基于微服务的架构,其中包括关键级别的Spring-Boot,Eureka,Zuul。我的问题如下:

Service1:/ api / v1 / service1 POST
Service2:/ api / v2 / service2 POST

application.yml看起来像

zuul:
    routes:
        service1:
            path: /api/v1/**
        service2:
            path: /api/v1/**
        common:
            path: /common/endpoint

此外,我已经编写了一个过滤器,我试图通过这个公共端点获取输入,并根据post请求扣除在哪里引导请求,即service1或service2。但是在这里我被困住了,似乎没有任何结果,即使经过几次谷歌搜索并查看其他人的问题我还没有找到我的解决方案。 这是我的过滤器的样子:


public class CommonEndpointFilter extends ZuulFilter {

    @Override
    public boolean shouldFilter() {
        RequestContext ctx = RequestContext.getCurrentContext();
        if ((ctx.get("proxy") != null) && ctx.get("proxy").equals("common")) {
            return true;
        }
        return false;
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();

        InputStream in = (InputStream) ctx.get("requestEntity");
        if (in == null) {
            try {
                in = request.getInputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        String body = null;
        try {
            body = StreamUtils.copyToString(in, Charset.forName("UTF-8"));

            if (body.indexOf("somethingrelatedtoservice1") != -1) {
                //forward the request to Service1: /api/v1/service1
            } else if (body.indexOf("somethingrelatedtoservice2") != -1) {
                //forward the request to Service2: /api/v1/service2
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public String filterType() {
        return FilterConstants.ROUTE_TYPE;
    }

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

我无法弄清楚如何将请求进一步转发到这些服务,然后获得通过公共端点发回的响应。

我在这里做错了什么?我该怎么办,所以我不必使用任何服务的硬编码网址。请指导我完成这个。

我尝试了一些类似的事情:
1.使用DiscoveryClient获取实例并使用上下文的setRouteHost方法。它始终抛出一个zuulfilter异常URL不是通过DiscoveryClient获得的服务URL后附加的公共端点/端点。
2.我试过想到的最愚蠢的事情,使用RestTemplate发出请求并获得响应并将其放在上下文响应中,但也没有工作,但请求被转发到服务但我不会收到任何回应。

任何帮助表示赞赏!!

0 个答案:

没有答案