一:zuul服务网关的工作原理
zuul的底层是通过各种Filter来实现的,zuul中的filter按照执行顺序分为了“pre”前置(”custom”自定义一般是前置),“routing”路由,“post”后置,以及“error”异常Filter组成,当各种Filter出现了异常,请求会跳转到“error filter”,然后再经过“post filter” 最后返回结果,下面是Filter的执行流程图:
-
正常流程:
-
请求到达首先会经过pre类型过滤器,而后到达routing类型,进行路由,请求就到达真正的服务提供者,执行请求,返回结果后,会到达post过滤器。而后返回响应。
-
-
异常流程:
-
整个过程中,pre或者routing过滤器出现异常,都会直接进入error过滤器,再error处理完毕后,会将请求交给POST过滤器,最后返回给用户。
-
如果是error过滤器自己出现异常,最终也会进入POST过滤器,而后返回。
-
如果是POST过滤器出现异常,会跳转到error过滤器,但是与pre和routing不同的时,请求不会再到达POST过滤器了。
-
二:自定义Fileter
@Component
public class LoginCheckZuulFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre"; // 返回pre前置过滤器类型
// 分类 1.前置过滤器 2.路由过滤器routing 3.后置过滤器post 4.错误过滤器 error
}
@Override
public int filterOrder() {
return 0; // 是filter的执行顺序,越小越先执行
}
@Override
public boolean shouldFilter() { //是其父接口IZuulFilter的方法,用来决定run方法是否要被执行
RequestContext context = RequestContext.getCurrentContext();
// 获取请求对象
HttpServletRequest request = context.getRequest();
// 判断是否登录
if(!request.getRequestURI().contains("/login")){
return true;
}
return false;
}
@Override
public Object run() throws ZuulException {
RequestContext context = RequestContext.getCurrentContext();
// 1.获取请求对象
HttpServletRequest request = context.getRequest();
HttpServletResponse response = context.getResponse();
// 2.获取请求头的token
String token = request.getHeader("token");
// 3.没有token就返回错误信息
if(StringUtils.isEmpty(token)){
// 没有登录的话 就不继续往下执行
context.setSendZuulResponse(false);
try {
response.setContentType("application/json;charset=utf-8");
response.getWriter().println("服务器异常,请重试");
} catch (IOException e) {
e.printStackTrace();
}
}
// 4.有token直接放行
return null;
}
}
三:测试
启动zuul,浏览器访问:http://localhost:10050/pay/pay/1 ,当没登录的情况下浏览器应该会返回如下信息代表登录检查起作用了:
使用postmain,发送post请求,在header中添加token值,如下:
分享先到这里了,有关于zuul的基本搭建和配置的流程在上一个文章中有体现