一、需求

深入了解系统中使用的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对象如图:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注