Zuul是一个基于Netflix的开源项目,是一个API网关框架,用于微服务架构中的服务间通信。它主要提供了路由、负载均衡、服务发现、安全校验、限流、熔断等核心功能,同时也支持自定义过滤器,可以实现各种自定义的处理逻辑。本文将详细介绍Zuul的核心功能及其使用方式,并给出一个完整的示例。
路由
Zuul最基本的功能就是路由,它可以根据请求的URI将请求路由到相应的服务上。Zuul支持两种路由方式,一种是基于服务名的路由,另一种是基于URL的路由。
基于服务名的路由
基于服务名的路由是Zuul最常用的路由方式。当一个请求到达Zuul时,Zuul会根据请求的URI找到匹配的路由规则,然后根据规则将请求路由到相应的服务上。服务名由serviceId
属性指定,可以通过Eureka或Consul等服务发现组件实现服务发现。下面是一个基于服务名的路由示例:
zuul:
routes:
users: /users/**
ignored-services: '*'
在这个示例中,我们定义了一个名为“users”的路由,将以“/users/”开头的请求路由到名为“users-service”的服务上。serviceId
默认等于路由名,也可以通过serviceId
属性指定。在实际应用中,服务名可能会因为部署环境的不同而发生变化,因此可以通过服务发现组件来动态获取服务名。
基于URL的路由
基于URL的路由是一种较少使用的路由方式。当一个请求到达Zuul时,Zuul会根据请求的URI找到匹配的路由规则,然后根据规则将请求路由到相应的URL上。下面是一个基于URL的路由示例:
代码语言:javascript复制zuul:
routes:
users:
path: /users/**
url: http://localhost:8081/users
ignored-services: '*'
在这个示例中,我们定义了一个名为“users”的路由,将以“/users/”开头的请求路由到名为“http://localhost:8081/users”的URL上。
过滤器
除了路由功能外,Zuul还提供了过滤器功能,可以对请求进行过滤、处理和修改。Zuul预定义了四种类型的过滤器:pre
、route
、post
和error
。
Pre过滤器
Pre过滤器在请求被路由之前调用,可以用来做身份验证、参数校验、限流等操作。如果请求被拦截,可以通过设置sendZuulResponse(false)
来阻止请求继续向下执行。下面是一个Pre过滤器的示例:
public class MyPreFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 1;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
String token = request.getParameter("token");
if (StringUtils.isBlank(token)) {
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
return null;
}
return null;
}
}
在这个示例中,我们自定义了一个Pre过滤器,用来校验请求中的token参数是否为空。如果为空,就阻止请求继续执行,并返回401状态码。