Zuul的核心功能(一)

2023-04-09 10:47:47 浏览数 (1)

Zuul是一个基于Netflix的开源项目,是一个API网关框架,用于微服务架构中的服务间通信。它主要提供了路由、负载均衡、服务发现、安全校验、限流、熔断等核心功能,同时也支持自定义过滤器,可以实现各种自定义的处理逻辑。本文将详细介绍Zuul的核心功能及其使用方式,并给出一个完整的示例。

路由

Zuul最基本的功能就是路由,它可以根据请求的URI将请求路由到相应的服务上。Zuul支持两种路由方式,一种是基于服务名的路由,另一种是基于URL的路由。

基于服务名的路由

基于服务名的路由是Zuul最常用的路由方式。当一个请求到达Zuul时,Zuul会根据请求的URI找到匹配的路由规则,然后根据规则将请求路由到相应的服务上。服务名由serviceId属性指定,可以通过Eureka或Consul等服务发现组件实现服务发现。下面是一个基于服务名的路由示例:

代码语言:javascript复制
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预定义了四种类型的过滤器:prerouteposterror

Pre过滤器

Pre过滤器在请求被路由之前调用,可以用来做身份验证、参数校验、限流等操作。如果请求被拦截,可以通过设置sendZuulResponse(false)来阻止请求继续向下执行。下面是一个Pre过滤器的示例:

代码语言:javascript复制
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状态码。

0 人点赞