Zuul的简介

  Zuul是Netflix开源的微服务网关,它可以和Eureka、Ribbon、Hystrix等组件配合使用。

  Zuul的核心是一系列的过滤器,这些过滤器可以完成以下功能。

  • 身份认证与安全:识别每个资源的验证要求,并拒绝那些鱼要求不符的请求。

  • 审查与监控:在边缘位置追踪有意义的数据和统计结果,从而带来精确的生产视图。

  • 动态路由:动态地将请求路由到不同的后端集群。

  • 压力测试:主键增加指向集群的流量,以了解性能。

  • 负载分配:为每一种负载类型分配对应容量,并启用超出限定值的请求。

  • 静态响应处理:在边缘位置直接建立部分响应,从而避免其转发到内部集群。

  • 多区域弹性:跨越AWS Region进行请求路由,旨在实现ELB(Elastic Load Balancing)使用的多样化,以及让系统的边缘更贴近系统的使用者。

Zuul的添加方式

  导入Zuul依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>

  添加网关服务依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

  添加配置文件:

zuul:
  routes:
    item-service:   #item-service 这个名字是任意写的
      path: /item-service/** #配置请求URL的请求规则
      #url: http://127.0.0.1:8081 #真正的微服务地址
      serviceId: springcloud-goods-item #指定Eureka注册中心的服务id

  启用Zuul:

  在ApiGatewayApplication中添加下面的代码:

@EnableZuulProxy

添加网关过滤器

  创建过滤器的方式如下,就是创建一个类,这里创建的是UserLoginZuulFilter,使其继承Zuul的ZuulFilter,然后我们重写其中的方法,比如如下面的重写其中的run()方法。

package com.lyc.filters;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

@Component  //加入到Spring容器
public class UserLoginZuulFilter extends ZuulFilter {

    @Override
    public String filterType() {
        return "pre";    //设置过滤器类型为pre
    }

    @Override
    public int filterOrder() {
        return 0;   //设置执行顺序
    }

    @Override
    public boolean shouldFilter() {
        return true;   //该过滤需要执行
    }

    @Override
    public Object run() {  //编写业务逻辑
        RequestContext requestContext = RequestContext.getCurrentContext();
        HttpServletRequest request = requestContext.getRequest();
        String token = request.getParameter("token");
        if(StringUtils.isEmpty(token)){
            requestContext.setSendZuulResponse(false);   //过滤该请求,不对其进行路由
            requestContext.setResponseStatusCode(401);
            return null;
        }
        return null;
    }
}

  在上面代码中,我们实现功能是判断当前请求的url信息中是否含有登陆令牌token,如果含有,则放行,如果不含有,则返回401错误代码。

  然后在启动类ApiGatewayApplication中启用UserLoginZuulFilter。

	/**
     * 即便是所有的配置都写好了,如果不添加这个Bean方法,那还是不会执行任何的过滤方法
     * @return
     */
    @Bean
    public UserLoginZuulFilter userLoginZuulFilter(){
        return new UserLoginZuulFilter();
    }

  这样当我们通过服务网关访问商品服务时,如果我们含有token,我们的访问结果是这样的:

Spring Cloud与微服务之Zuul

  当我们去掉token令牌时,访问被阻止:

Spring Cloud与微服务之Zuul

相关文章: