一、需求
深入了解系统中使用的zuul网关工作原理,对后续系统组件升级、zuul网关异常解决提供技术支撑,优化zuul网关的配置参数
二、实现原理
2.1Zuul介绍
Zuul是netflix开源的微服务网关,它可和Ribbon、hystrix等组件配合使用,
Zuul可以为微服务系统提供动态路由、流量监控、接口安全等功能
Zuul作为微服务的入口,网关可以将集群的服务隐藏在后面,而对于外部客户端来说只需请求网关,不需要关系微服务的内部调用关系。
2.2Zuul组件实现原理
Zuul组件的核心运行机制是一系列可配置的过滤器(filters),过滤器之间没有直接通信,它们是通过一个RequestContext(类似于上下文)的静态类来进行数据传递的,处理的请求的每个处理器都共享一个RequestContext,RequestContext是基于ThreadLocal线程变量来记录共享数据的。
Zuul过滤器是由Groovy写成,Zuul会定期轮询指定目录,动态编译加载有修改的过滤器
Zuul过滤器可分为:前置过滤器(PRE)、路由过滤器(ROUTING)、后置过滤器(POST)、异常过滤器(ERROR)
Zuul运行逻辑图如下:
2.3Zuul路由机制
Zuul组件中有RibbonRoutingFilter路由过滤器用来处理网关路由功能,RibbonRoutingFilter是通过service-id及URL将请求转发到后端对应的微服务。
核心源码如下图:
buildCommandContext方法作用是创建RibbonCommandContext对象,用户后续路由,RibbonCommandContext包含serviceId、method、uri等必须参数
forward方法通过是在HystrixCommand内部执行Ribbon负载均衡调用,使用请求路由功能的
- 请求是如何路由到后端的?
通过ribbonCommandFatory工厂构建OkhttpRibbonCommand,创建RibbonCommand过程中会OkHttpLoadBalancingclient对象,该client对象在HystrixCommand的execute方法下执行路由转发操作,网关路由最终执行者还是httpClient对象
- 路由请求地址如何加载的?
通过Ribbon的ILoadBalancer接口加载、刷新、下线服务列表
BaseLoadBalancer类继承ILoadBalancer接口,在BaseLoadBala
ncer中实现了serviceid对应服务ip关系,BaseLoadBalancer对象中存在Timer定时器支持定时刷新注册列表,可用服务列表存储在一个List<server>集合中
Server对象如图: