Zuul网关

Zuul的主要作用:

  1.路由,进行请求转发。

  2.鉴权,进行身份认证(安全)。

  3.限流,限制访问的数量,保证服务器的稳定。

  除此之外还有以下作用

  4.负载均衡。

  5.压力测试。

  6.监控

1.Zuul简单使用

  1.添加依赖

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

  2.添加@EnableZuulProxy 注解

@EnableZuulProxy
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class,args);
    }
}

  3.配置路由地址

    a.配置写死的地址

zuul:
  routes:
    user:
      path: /user/**
      url: http://127.0.0.1:8083

    b.结合eureka,动态拉取服务列表,根据服务id找到对应的url。

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
zuul:
  routes:
    user:
      path: /user-service/**
      serviceId: user-service

    c.简化版配置,routes的key是服务id,值是映射的地址

zuul:
  routes:
    user-service: /user-service/**

    d.Zuul默认为从eureka拉取服务列表中的所有服务配置了key=服务名,值为 /服务名/** 的routes。也就是说即使不做任何配置,也可以匹配服务名进行访问服务。

    e.某些服务不需要Zuul的默认配置,做以下配置做过滤。

  ignored-services:
    - customer-service

    f.若想去除路由前缀,可做以下配置。strip-prefix: false 

zuul:
  routes:
    #user-service: /user-service/**
    user:
      path: /user/**
      serviceId: user-service
      strip-prefix: false

2.ZuulFilter简介

  Zuul最重要的一个功能是实现请求的鉴权,而Zuul实现的方式是通过过滤器,ZuulFilter则是这些过滤器的顶级父类,其中有四个最重要的方法。 

    //过滤器类型
    public abstract String filterType();
    //过滤器优先级
    public abstract int filterOrder();
    //是否启用过滤器
    boolean shouldFilter();
    //过滤逻辑
    Object run() throws ZuulException;

  其中,Zuul的过滤器类型主要有四种,也代表着ZuulFilter的生命周期

    pre:请求在路由被执行之前

    routing:在路由请求时调用

    post:在routing和error过滤器之后调用

    error:处理请求时发生错误时调用

  

图片来源:https://blog.csdn.net/chengqiuming/article/details/80821023

  自定义一个过滤器,程式如下 

@Component
public class LoginFilter extends ZuulFilter {

    //过滤器类型,分为pre(处理请求头,身份验证等),routing(路由转发),post(路由转发后的处理),error(处理请求时发生错误时调用)
    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }

    //优先级
    @Override
    public int filterOrder() {
        return FilterConstants.SERVLET_DETECTION_FILTER_ORDER-1;
    }
    //是否启动过滤拦截
    @Override
    public boolean shouldFilter() {
        return true;
    }
    //拦截的逻辑
    @Override
    public Object run() throws ZuulException {
        RequestContext context = RequestContext.getCurrentContext();
        HttpServletRequest request =context.getRequest();
        String token = request.getParameter("access-token");
        if (StringUtils.isBlank(token)){
            context.setSendZuulResponse(false);
            context.setResponseStatusCode(HttpStatus.FORBIDDEN.value());
        }
        return null;
    }
}

3. Zuul的负载均衡和熔断机制

  Zuul集成了Ribbon和Hystrix,只需要做简单的配置,就可以实现负载均衡和熔断机制。需要注意的是,hystrix的超时时长要大于RIbbon的超时时长。另外,Zuul中Ribbon的超时时长计算公式如下

    ribbonTimeout = (ribbonReadTimeout + ribbonConnectTimeout) * (maxAutoRetries + 1) * (maxAutoRetriesNextServer + 1); 

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 6000
ribbon:
  ConnectionTimeOut: 500
  ReadTimeOut: 2000

4.Zuul的高可用性

   Zuul作为微服务,可以启动多台Zuul,自动注册到eureka上,形成集群。通常可搭配Ngnix服务网关来使用,来实现对Zuul集群的负载均衡调用。   

  

posted @ 2020-07-08 21:24  听风和  阅读(368)  评论(0)    收藏  举报