zuul
微服务网关是后台所有外部请求的前门,可配置服务路径到服务的映射,可做认证鉴权,限流,屏蔽服务接口,过滤敏感头信息
可以和 eureka, ribbon 配合使用实现负载均衡,和 hystrix 配合实现服务隔离
由 servlet 和一系列 filter 责任链组成
zuul 从 eureka 拉取服务的时候, 默认配置用服务名作为映射路径
核心类
ZuulHandlerMapping
lookupHandler
注册 url --> controller 映射关系到 SpringMVC 中, 由 ZuulController 来处理
ZuulController 将请求交给 ZuulServlet 来处理
-----------------------------------------------
RouteLocator
根据 path 获取 Route
SimpleRouteLocator
从 ZuulProperties 中加载路由数据
DiscoveryClientRouteLocator
路由数据来自 properties 中的静态配置 和 DiscoveryClient 从注册中心获取的数据
动态添加 Route
同步把路由信息添加到 ZuulProperties
刷新路由
以 service1 为例,配置 /api/service1/** -> service1
存储的路由信息为
/api/service1/** -> service1
/service1/** -> service1
/service1/** -> service1
就是利用 DiscoveryClient 提取后根据默认规则生成的路由信息,用处不大
-----------------------------------
CompositeRouteLocator
具备组合多个 RouteLocator 的能力,用 Collection 存储多个 RouteLocator,调用 getRoutes() getMatchingRoute() refresh() 时都会逐一调用每个 RouteLocator 相应的方法
-----------------------------------
ZuulServlet
定义了各种 filter 执行先后顺序,和执行的时机
RequestContext
在 filter 之间通过 RequestContext 来通信,RequestContext 内部通过 threadlocal 来保存每个请求的一些信息,包括 request,response,请求路由,错误信息
Zuul 大部分功能都是通过过滤器来实现的,Zuul 定义了 4 种标准的过滤器类型
pre filter
在请求被路由之前调用,如认证鉴权,限流
PreDecorationFilter
会根据路由信息进行预处理,决定使用哪个 route 类型 ZuulFilter 来实际处理请求
route filter
路由请求
RibbonRoutingFilter
根据 ServiceId 路由,通过 http 客户端 / ribbon / hystrix 发送请求
SimpleHostRoutingFilter
根据 url 路由, 通过 HttpClient 发送请求
SendForwardFilter
通过 servlet 转发请求
post filter
在转发请求以后执行, 可对返回信息做一些处理,如设置异常返回信息,可为响应添加标准的 http header,收集统计信息和指标,将微服务的响应发送给客户端
SendResponseFilter
默认,将代理请求的响应写入当前响应,返回给客户端
error filter
在整个生命周期,如果发生异常就进入 error filter
SendErrorFilter
如果 RequestContext.getThrowable() 不为空,则转发至 error.path 配置的路径
FilterProcessor
执行 zuulfilter 的处理器, 通过 filterloader 获取 zuulfilter
@EnableZuulProxy
1.整合了 hystrix
2.初始化类 ZuulProxyAutoConfiguration 继承自 ZuulServerAutoConfiguration
注册了 RibbonRoutingFilter, SimpleHostRoutingFilter
@EnableZuulServer
注册了 ZuulController, ZuulHandlerMapping, ZuulServlet 及 filter
微服务网关优点
易于监控
可在微服务网关收集监控数据并将其推送到外部系统进行分析
易于认证
可在微服务网关上进行认证,再将请求转发到后端的微服务