Spring Cloud服务网关 - Zuul

Zuul高层架构图

封装一个安全的Request Context对象,每个请求都会封装这个对象Request Context对象:

1、Zuul Servlet是线程非安全的,所以有可能会窜数据

2、用Servlet处理Filter时,Filter区分不出每一次的请求的不同

一、网关简介

1、由于微服务“各自为政的特性”使微服务的使用非常麻烦

2、通常我们雇佣一个“传达室大爷”作为统一入口,这就是网关

3、网关主要是实现请求转发和请求过滤

二、网关优点

1、为客户端提供更简单的界面

2、可用于防止将内部微服务结构暴露给客户端

3、允许重构微服务而不强制客户端重构消耗逻辑

4、可以集中安全、监控、速率限制等交叉问题

三、Zuul简介

1、Zuul是网关大军中的一员,目前市场使用频率比较高

2、Zuul除了实现请求转发和过滤,一般还作为鉴权和容错使用

3、Zuul可以无缝衔接Ribbon和Hystrix

四、请求转发

1、请求路由

1)Zuul可以通过配置完成请求路由配置

2)Zuul服务路由默认支持serviceId作为上下文

3)ignored-services可以禁用serviceId

2、请求路由表达式

1)? -> 匹配任意单个字符

2)* -> 配置任意数量的字符

3)** -> 配置任意数量的字符,支持多级目录

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

#properties:
#开启重试机制
zuul.routes.user-api.retryable=true

#忽略ServiceID(访问接口两种方式:path和serviceId,ignored-services可以禁用serviceId)
zuul.ignored-services="*"

#饥饿模式配置(作用:预加载使得启动时慢,加载时快)
zuul.ribbon.eager-load.enabled=true

zuul:
  prefix: "/meetingfilm/"
  routes:
    meetingfilm-user:
      path: /userapi/**
      serviceId: user-service
      retryable: true
    meetingfilm-cinema:
      path: /cinemaapi/**
      serviceId: cinema-service
      retryable: true
    meetingfilm-film:
      path: /filmapi/**
      serviceId: film-service
      retryable: true
    meetingfilm-hall:
      path: /hallapi/**
      serviceId: hall-service
      retryable: true

 五、请求过滤

1、自定义Filter

1)继承ZuulFilter并实现相应的方法

2)设置Filter类型(filterType)、级别(filterOrder)和是否启用(shouldFilter)

3)开发具体的业务逻辑(run方法)

2、预定义Filter

1)Pre routing filters(ServletDetectionFilter、FormBodyWrapperFilter、DebugFilter、PreDecorationFilter)

2)Routing filters(RibbonRoutingFilter、SimpleHostRoutingFilter、SendForwardFilter)

3)Post Routing filters(SendErrorFilter、SendResponseFilter)

public class ServletDetectionFilter extends ZuulFilter {
    public ServletDetectionFilter() {
    }

    public String filterType() {
        return "pre";
    }

    public int filterOrder() {
        return -3;
    }

    public boolean shouldFilter() {
        return true;
    }

    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        if (!(request instanceof HttpServletRequestWrapper) && this.isDispatcherServletRequest(request)) {
            ctx.set("isDispatcherServletRequest", true);
        } else {
            ctx.set("isDispatcherServletRequest", false);
        }

        return null;
    }

    private boolean isDispatcherServletRequest(HttpServletRequest request) {
        return request.getAttribute(DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null;
    }
}

六、Zuul和Zuul2(BIO和NIO的区别)

1、Zuul使用的是阻塞式线程完成业务调用(BIO)

2、Zuul2使用的是异步线程完成(NIO)

七、Zuul与Hystrix整合

降级:继承FallbackProvider,重写其中方法

八、Cookie和头信息处理

Zuul帮助我们过滤了一些非安全的信息,诸如cookie、set-cookie和authorization等,可以通过设置senSitiveHeaders来修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

z.haoui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值