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来修改