1 Zuul
通过Servlet来实现,通过定义的ZuulServlet来对请求进行控制,主要做了:preRoute(前置路由)、route(路由)、postRoute(后置路由)、异常处理。
整个调用链由ZuulFilter组成。底层利用各种filter实现各种功能。过滤器分以下四种
1.pre:请求被路由前调用。身份验证、安全验证、在集群中选择请求的微服务、记录调试信息
- routing:这种过滤器将请求路由到微服务。构建发送给微服务的请求,用用httpclient或者Ribbon请求微服务。
3.post:过滤器会在路由到微服务之后执行。可以用来为响应添加标准的HTTP header、收集统计信息和指标、将相应从微服务发送给客户端。
- error:发生错误时执行
作用:
验证和安全保障;
审查与监控;
动态路由
压力测试
负载分配
静态响应处理:自定义过滤器(继承ZuulFilter,然后编写对应处理逻辑),直接在zuul中生成响应,而不将请求转发到后端微服务。
(启动类里加上@EnableZuulProxy)
2 Gateway
是spring cloud的一部分,用于构建基于SpringBoot的微服务网关。提供了类似于Zuul的功能,如路由、负载均衡、请求过滤、安全性等。使用了Spring WebFlux(是基于响应式流的,可以建立异步的、非阻塞的、事件驱动的服务,底层是Netty提供的异步支持,两种开发模式:类似于SpringMVC的@Controller和@RequestMapping的注解方式,;java8得lambda风格的函数开发模式)框架和Reactor库实现异步非阻塞的处理模型。并且内嵌了Hystrix断路器。
(想了解WebFlux的可以去看看(5)Spring WebFlux快速上手------响应式Spring的道法术器_spring webflux的项目-CSDN博客)
2.1 GateWay三大组件:
路由Route
id:路由标识,要求唯一,名称任意(默认uuid)
uri:请求最终被转发道德的目标地址
order:路由优先级,数字越小优先级越高
predicates:断言数组,即判断条件,如果返回值是true,则转发请求到uri指定的服务
filters:过滤器,请求过程中可以做一些额外的逻辑处理
断言Predicates
表示路由的匹配条件,用来匹配请求的各种属性,如请求路径、方法、hearder等。用来判断参数检验,返回一个boolean值。一个Route可以包含多个Predicates
过滤器 Filter
过滤器包含了处理请求和响应的逻辑,可以分为pre 和post两个阶段。多个Filter在pre阶段会按照优先级从高到低(数字从小到大)顺序执行,post则是反向的。Filter分两种:
全局filter:每种全局filter在gateway只有一个实例,对所有Route生效;
路由Filter:真多Route进行配置,不同的Route使用不同的参数,因此会创建不同的实例
2.2 具体流程
gateway的本质就是一个springboot应用,它通过webflus框架处理请求和响应,而webflux底层是基于Netty。
①当gateway启动的时候:
- Spring 会装载GatewayAutoConfiguration 中配置的必要组件Bean。比如:
GatewayProperties,配置信息(包含路由配置信息)
GlobalFilter:默认全局过滤器
RouteDefinitionLocator:通过加载路由配置(如yaml文件)拿到RouteDefinition,里面是对路由的定义
RouteLocator:负责组装Route对象,里面全是路由相关信息。
2.启动Netty Server 负责监听请求
②当Gateway接收到请求
webflux经过一层层过滤会调用HandlerMapping接口,拿到对应的Handler。最后调用Handler的handle方法进行业务处理(是不是很熟悉啊,想想SpringMVC)。
gateway通过实现HandlerMapping和Handler两个接口处理请求的任务拿到手里。根据请求信息从路由集合中找到匹配的路由,路由信息中包含了一个过滤器链。
在Handler。handle方法中,请求经历上一步的过滤器链后转发到对应服务中
3 zuul、GateWay 和 Nginx的区别
zuul是Netflix开源的服务网关,主要用于构建微服务框架中的边缘服务。基于servlet实现,阻塞式api,不支持长连接。只能同步不支持异步。通过配置路由规则将请求路由到合适的后端服务。内部没有实现限流和负载,通过与Eureka+Ribbon结合使用,可以扩展至其他为服务框架。
Gateway是SpringCloud的一部分,基于Spring WebFlux ,能够实现响应式非阻塞的api,支持长连接,支持异步。内部内嵌了Hystrix,实现了限流、负载均衡等,内部有很多开箱即用的功能。本质上就是一个springboot应用,但仅仅适用于spring cloud套件
Nginx,C语言编写,通过服务器实现负载均衡,是一个高性能的HTTP反向代理web服务器。适合做服务器端的负载均衡,zuul和gateway是本地负载均衡,适合在微服务里实现网关。
在微服务框架中,选微服务网关首选GateWay,首先他是spring官方的,zuul是Netflix的,GateWay推出的原因就是因为Zuul更新维护不理想。而且GateWay使用Spring WebFlux框架Reactor库,采用异步非阻塞的处理模型,性能会好一些。