API网关的作用
路由、监控、负载均衡、权限控制、请求限制等
什么是Zuul
Zuul是从设备和网站到Netflix流应用程序后端的所有请求的前门。作为边缘服务应用程序,Zuul旨在实现动态路由,监控,弹性和安全性。它还能够根据需要将请求路由到多个Amazon Auto Scaling组。
Nginx与Zuul的区别
开发语言:nginx是使用c语言编写;zuul是java写的
负载均衡的实现:zuul使用ribbon;nginx采用服务端实现
nginx能整合一些脚本语言适合做服务端负载均衡;zuul里可以使用过滤器(黑白名单)、权限控制、请求限制、判断token是否有效等,虽然nginx也能实现但比较麻烦
Zuul 实现API网关 会话验证判断token是否有效
@Component
public class TokenFilter extends ZuulFilter{
/**
* 是否执行该过滤器。
*/
@Override
public boolean shouldFilter() {
return false;
}
/**
* 过滤器的具体逻辑。
*/
@Override
public Object run() throws ZuulException {
RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletRequest request = currentContext.getRequest();
String userToken = request.getParameter("userToken");
if (StringUtils.isEmpty(userToken)) {
currentContext.setSendZuulResponse(false);
currentContext.setResponseStatusCode(401);
currentContext.setResponseBody("userToken is null");
return null;
}
// 否则正常执行业务逻辑.....
return null;
}
/**
* 前置过滤器。在 zuul 中定义了四种不同生命周期的过滤器类型:
* 1、pre:可以在请求被路由之前调用;
* 2、route:在路由请求时候被调用;
* 3、post:在route和error过滤器之后被调用;
* 4、error:处理请求时发生错误时被调用;
*/
@Override
public String filterType() {
return "pre";
}
/**
* 过滤的优先级,数字越大,优先级越低。
*/
@Override
public int filterOrder() {
return 0;
}
}