cloub spring 拦截器_使用Spring Cloud Zuul实现过滤器或拦截器功能案例

使用Spring Cloud Zuul实现过滤器或拦截器功能案例

Spring Cloud的API网关不但可以实现类似NGINX+Lua强大的路由分发,实现动静页面的分流,更重要可以实现对所有发往后端微服务请求的拦截。Zuul主要有四种类型的过滤器,我们可以为特定的url模式添加任意数量的过滤器。

“pre” 预过滤器 - 在路由分发一个请求之前调用。

“post” 后过滤器 - 在路由分发一个请求后调用。

“route” 路由过滤器 - 用于路由请求分发。

“error” 错误过滤器 - 在处理请求时发生错误时调用

上图显示这几种过滤器的前后调用顺序,第一个是pre过滤器然后是Route过滤器,最后响应是post过滤器。

下面我们开始演示这几种过滤器的开发,Springcloud的开发三板斧就是pom.xml、application配置和元注解三种,首先pom.xml如下:

org.springframework.cloud

spring-cloud-starter-netflix-zuul

下面是自己实现这四种过滤器,只要实现com.netflix.zuul.ZuulFilter接口,然后实现方法filterType,返回字符串为这四种类型pre post route error。

@Override

public String filterType() {

return "pre;//关键在这里,四种类型定义

}

比如实现pre类型预处理器代码:

public class PreFilter extends ZuulFilter {

@Override

public String filterType() {

return "pre";

}

@Override

public int filterOrder() {

return 0;

}

@Override

public boolean shouldFilter() {

return true;

}

@Override

public Object run() {

RequestContext ctx = RequestContext.getCurrentContext();

HttpServletRequest request = ctx.getRequest();

System.out.println(

"Pre Filter: Request Method : " + request.getMethod() + " " +

"Request URL : " + request.getRequestURL().toString());

return null;

}

}

这里虽然类名PreFilter,其实是可以任意取名的,在run方法中我们定义了该过滤器应该做的事情。

其他几种也是类似这样建立,这里省去,可见文后的源码。

下面我们来运行调试验证,首先还是启动Producer服务,当然也可以启动注册服务器,这取决于你只使用URL路径分发还是服务ID分发。这部分设置见上篇

运行我们的Zuul应用,然后访问http://localhost:8080/producer/articles

控制台输出如下:

Pre Filter: Request Method : GET Request URL : http://localhost:8080/producer/articles

Route: Using Route Filter

Post:Using Post Filter

过滤器作用比较大,一般用来作为安全拦截,当然最好不要侵入业务,否则这里变成一个业务服务网关,当然你也可以美其名曰“中台”,其实像ESB消息总线等复杂业务侵入式的中台都是多余的。微服务倡导智能终端哑管道理念,哑管道就是管道必须简单,是个哑巴,不要太智能。

由于Zuul充当我们所有微服务的代理,我们可以使用Zuul服务来实现一些跨领域的问题,如安全性,速率限制等。一个常见的用例是将Authentication头转发给所有下游服务。

通常在微服务中,我们将使用OAuth服务进行身份验证和授权。一旦客户端通过身份验证,OAuth服务将生成一个令牌,该令牌应包含在发送给其他微服务的请求中,以便客户端无需单独为每个服务进行身份验证。我们可以使用Zuul过滤器来实现这样的功能。当然实际中会使用JWT令牌格式。

本文源码用Idea打开:百度网盘

更多过滤器源码:这里

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值