前情回顾
上一节(第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篇