SpringCloud极简入门|zuul 过滤器修改转发的url,困扰很久的功能终于实现了 第6讲

版权声明:更多信息请关注 wwws.shinians.com 官网 https://blog.csdn.net/zzhuan_1/article/details/86026438

前情回顾

上一节(第5讲),我们讲解了zuul的基本配置,如下链接

SpringCloud极简入门|zuul智能路由回退、认证、转发功能(五):https://www.toutiao.com/i6643405381466849800/

本章知识点很重要!很重要!很重要!,真的很重要,网上资料不是很多,所以建议收藏下转发

动态路由设置使zuul变得很灵活,但是网上的资料大多是基于动态配置实现的,这样导致如果需要配置的路由成千上万的话,难免会有瓶颈(内存、或者同步实效性)。

业务场景:我们需要一种动态转发机制实现一种动态改变url的场景,说白了

我们访问的时候是: http://localhost:8002/hello?name=zs&token=1

可是需要路由动态的设置host或者url比如变成:http://localhost:8001/hello?name=zs&token=1(注端口已变化)

而这种变化我们不采用配置文件配置的方式,那如何实现转发呢(基于数据某种规则,此处只演示静态的)

Demo开始

承接上篇用springcloud-02-getway-zuul模块

分别启动:注册中心spring-cloud-eureka-002(端口7001),生产者一 spring-cloud-producter1-002(端口8001),生产者2 spring-cloud-producter2-002(端口8002) ,路由spring-cloud-zuul-002(端口6001)

路由增加个路由配置,也就是访问testforward规则的url时,会转发给消费者2

也就是访问http://localhost:6001/testforward/hello?name=zs&token=1 此时访问是生产者2的controller

我们要做的是访问时动态的设置url使之变成访问 http://localhost:8001/hello?name=zs&token=1

如何做呢?很简单,不过错过了这篇需要查询很多资料了

增加一个拦截器(注意里面规则可以根据具体业务进行转发,以下只是一个demo,判断如果url含有testforward则转发到http://127.0.0.1:8001/

@Component
public class ForwardFilter extends ZuulFilter{

    private Logger logger= LoggerFactory.getLogger(ForwardFilter.class);

    private static Map<String,String> forwardUrlMap=new HashMap<>();

    static {
        forwardUrlMap.put("testforward","http://127.0.0.1:8001/");
    }

    @Override
    public String filterType() {
        //路由时进行转发;此外还含有 pre post error等类型
        return FilterConstants.ROUTE_TYPE;
    }

    @Override
    public int filterOrder() {
        // filter执行顺序,通过数字指定 ,优先级为0,数字越大,优先级越低
        return 0;
    }

    @Override
    public boolean shouldFilter() {
        // 是否执行该过滤器,此处为true,说明需要过滤
        return true;
    }

    @Override
    public Object run() throws ZuulException {
        RequestContext ctx = RequestContext.getCurrentContext();

        HttpServletRequest request = ctx.getRequest();

        //获取请求的URI  //测试访问:http://localhost:6001/testforward/hello?name=zs&token=1
        String url=request.getRequestURI();//
        if(url.indexOf("testforward")>-1){
            try {
                //[1]:设置RouteHost
                URI uri1=new URI(forwardUrlMap.get("testforward"));
                ctx.setRouteHost(uri1.toURL());
            } catch (Exception e) {
                e.printStackTrace();
            }
            //[2]:设置URI
            url=url.substring(url.indexOf("testforward")+12,url.length());
            ctx.put(FilterConstants.REQUEST_URI_KEY,url);
        }

//        url.split("/",3);
        logger.info("--->>> TokenFilter {},{}", request.getMethod(), request.getRequestURL().toString());


        return null;
    }
}

验证结果:完成动态转发

End:

功能实现了就很简单,但是我们在寻找答案的时候总是那么难,所以还是需要热于分享的人出现,坚持写作1个月了,每晚都在凌晨一点睡,总是觉得时间不够用,不过还希望小伙伴们有所收获。

话外篇

截至目前粉丝已经999个了,这是个吉利数字,打算现在申请原创,希望得到大家的祝福,欢迎转发,真心希望能一次通过,虽然有点不现实,毕竟粉丝数比较少。不管结局如何在此感谢转发的小伙伴....

文章数量82篇

 

源码下载:https://github.com/shinians/springcloud-demos

猜你喜欢

转载自blog.csdn.net/zzhuan_1/article/details/86026438