目录
概况
Git:https://github.com/Netflix/zuul
Zuul是netflix开源的一个API Gateway服务器,本质为web servlet应用,但在SpringCloud组件中已经停止更新。
启动类注解:@EnableZuulProxy
pom:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
配置:
zuul:
# 一些比较敏感的请求头,不想通过zuul传递过去, 可以通过该属性进行设置
sensitiveHeaders: ''
#添加代理头
add-proxy-headers: true
# debug:
# request: true
# include-debug-header: true
retryable: false
servlet-path: / # 默认是/zuul , 上传文件需要加/zuul前缀才不会出现乱码,这个改成/ 即可不加前缀
ignored-services: "*" # 忽略eureka上的所有服务
# prefix: /api #为zuul设置一个公共的前缀
# strip-prefix: false #对于代理前缀默认会被移除 故加入false 表示不要移除
routes: # 路由配置方式
authority: # 其中 authority 是路由名称,可以随便定义,但是path和service-id需要一一对应
path: /authority/**
serviceId: authority-server
oauth:
path: /oauth/**
serviceId: oauth-server
demo:
path: /demo/**
serviceId: demo-server
内部架构
工作原理
1、过滤器机制
Zuul核心为一系列的filters。filter之间没有直接的相互通信,通过一个RequestContext的静态类来进行数据传递的。RequestContext类中有ThreadLocal变量来记录每个Request所需要传递的数据。Zuul的过滤器是由Groovy写成,这些过滤器文件被放在Zuul Server上的特定目录下面,Zuul会定期轮询这些目录,修改过的过滤器会动态的加载到Zuul Server中以便过滤请求使用。
Zuul中定义了四种标准过滤器类型,这些过滤器类型对应于请求的典型生命周期:
- PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。
- ROUTING:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。
- POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
- ERROR:在其他阶段发生错误时执行该过滤器。
内置的特殊的过滤器,分别为:StaticResponseFilter和SurgicalDebugFilter
StaticResponseFilter:StaticResponseFilter允许从Zuul本身生成响应,而不是将请求转发到源。
SurgicalDebugFilter:SurgicalDebugFilter允许将特定请求路由到分隔的调试集群或主机。
还可以自定义的过滤器
除了默认的过滤器类型,Zuul还允许我们创建自定义的过滤器类型。
2、过滤器生命周期
源码分析
//TODO
应用
- 动态路由
- 安全验证
- 监控审记
- 负载分配
- 弹性限流