美文网首页
Spring Cloud 中 Zuul 网关原理及其配置,看它就

Spring Cloud 中 Zuul 网关原理及其配置,看它就

作者: 阿里高级码农 | 来源:发表于2021-03-01 15:06 被阅读0次

    Zuul是spring cloud中的微服务网关。网关:是一个网络整体系统中的前置门户入口。请求首先通过网关,进行路径的路由,定位到具体的服务节点上。

    Zuul是一个微服务网关,首先是一个微服务。也是会在Eureka注册中心中进行服务的注册和发现。也是一个网关,请求应该通过Zuul来进行路由。

    Zuul网关不是必要的。是推荐使用的。

    使用Zuul,一般在微服务数量较多(多于10个)的时候推荐使用,对服务的管理有严格要求的时候推荐使用,当微服务权限要求严格的时候推荐使用。

    一、Zuul网关的作用

    网关有以下几个作用:

    统一入口:未全部为服务提供一个唯一的入口,网关起到外部和内部隔离的作用,保障了后台服务的安全性。

    鉴权校验:识别每个请求的权限,拒绝不符合要求的请求。

    动态路由:动态的将请求路由到不同的后端集群中。

    减少客户端与服务端的耦合:服务可以独立发展,通过网关层来做映射。


    二、Zuul网关的应用

    1、网关访问方式

    通过zuul访问服务的,URL地址默认格式为:http://zuulHostIp:port/要访问的服务名称/服务中的URL

    服务名称:properties配置文件中的spring.application.name。

    服务的URL:就是对应的服务对外提供的URL路径监听。

    2、网关依赖注入

    3、网关启动器

    4、网关全局变量配置

    4.1 URL路径匹配

    4.2 服务名称匹配

    服务名称匹配也可以使用简化的配置:

    4.3 路由排除配置

    4.4 路由前缀配置

    5. Zuul网关配置总结

    网关配置方式有多种,默认、URL、服务名称、排除|忽略、前缀。

    网关配置没有优劣好坏,应该在不同的情况下选择合适的配置方案。扩展:大公司为什么都有API网关?聊聊API网关的作用

    zuul网关其底层使用ribbon来实现请求的路由,并内置Hystrix,可选择性提供网关fallback逻辑。使用zuul的时候,并不推荐使用Feign作为application client端的开发实现。毕竟Feign技术是对ribbon的再封装,使用Feign本身会提高通讯消耗,降低通讯效率,只在服务相互调用的时候使用Feign来简化代码开发就够了。而且商业开发中,使用Ribbon+RestTemplate来开发的比例更高。

    三、Zuul网关过滤器

    Zuul中提供了过滤器定义,可以用来过滤代理请求,提供额外功能逻辑。如:权限验证,日志记录等。

    Zuul提供的过滤器是一个父类。父类是ZuulFilter。通过父类中定义的抽象方法filterType,来决定当前的Filter种类是什么。有前置过滤、路由后过滤、后置过滤、异常过滤。

    前置过滤:是请求进入Zuul之后,立刻执行的过滤逻辑。

    路由后过滤:是请求进入Zuul之后,并Zuul实现了请求路由后执行的过滤逻辑,路由后过滤,是在远程服务调用之前过滤的逻辑。

    后置过滤:远程服务调用结束后执行的过滤逻辑。

    异常过滤:是任意一个过滤器发生异常或远程服务调用无结果反馈的时候执行的过滤逻辑。无结果反馈,就是远程服务调用超时。

    3.1 过滤器实现方式

    继承父类ZuulFilter。在父类中提供了4个抽象方法,分别是:filterType, filterOrder, shouldFilter, run。其功能分别是:

    filterType:方法返回字符串数据,代表当前过滤器的类型。可选值有-pre, route, post, error。

    pre - 前置过滤器,在请求被路由前执行,通常用于处理身份认证,日志记录等;

    route - 在路由执行后,服务调用前被调用;

    error - 任意一个filter发生异常的时候执行或远程服务调用没有反馈的时候执行(超时),通常用于处理异常;

    post - 在route或error执行后被调用,一般用于收集服务信息,统计服务性能指标等,也可以对response结果做特殊处理。

    filterOrder:返回int数据,用于为同filterType的多个过滤器定制执行顺序,返回值越小,执行顺序越优先。

    shouldFilter:返回boolean数据,代表当前filter是否生效。

    run:具体的过滤执行逻辑。如pre类型的过滤器,可以通过对请求的验证来决定是否将请求路由到服务上;如post类型的过滤器,可以对服务响应结果做加工处理(如为每个响应增加footer数据)。

    3.2 过滤器的生命周期

    3.3 代码示例


    四、Zuul网关的容错(与Hystrix的无缝结合)

    在spring cloud中,Zuul启动器中包含了Hystrix相关依赖,在Zuul网关工程中,默认是提供了Hystrix Dashboard服务监控数据的(hystrix.stream),但是不会提供监控面板的界面展示。可以说,在spring cloud中,zuul和Hystrix是无缝结合的。

    4.1 Zuul中的服务降级处理

    在Edgware版本之前,Zuul提供了接口ZuulFallbackProvider用于实现fallback处理。从Edgware版本开始,Zuul提供了ZuulFallbackProvider的子接口FallbackProvider来提供fallback处理。

    Zuul的fallback容错处理逻辑,只针对timeout异常处理,当请求被Zuul路由后,只要服务有返回(包括异常),都不会触发Zuul的fallback容错逻辑。

    因为对于Zuul网关来说,做请求路由分发的时候,结果由远程服务运算的。那么远程服务反馈了异常信息,Zuul网关不会处理异常,因为无法确定这个错误是否是应用真实想要反馈给客户端的。

    4.2 代码示例

    五、Zuul网关的限流保护

    Zuul网关组件也提供了限流保护。当请求并发达到阀值,自动触发限流保护,返回错误结果。只要提供error错误处理机制即可。

    Zuul的限流保护需要额外依赖spring-cloud-zuul-ratelimit组件。

    5.1 全局限流配置

    使用全局限流配置,zuul会对代理的所有服务提供限流保护。

    5.2 局部限流配置

    使用局部限流配置,zuul仅针对配置的服务提供限流保护。

    5.3 限流参数简介

    六、Zuul网关性能调优:网关的两层超时调优

    使用Zuul的spring cloud微服务结构图:

    从上图中可以看出。整体请求逻辑还是比较复杂的,在没有zuul网关的情况下,app client请求app service的时候,也有请求超时的可能。那么当增加了zuul网关的时候,请求超时的可能就更明显了。

    当请求通过zuul网关路由到服务,并等待服务返回响应,这个过程中zuul也有超时控制。zuul的底层使用的是Hystrix+ribbon来实现请求路由。结构如下:

    zuul中的Hystrix内部使用线程池隔离机制提供请求路由实现,其默认的超时时长为1000毫秒。ribbon底层默认超时时长为5000毫秒。如果Hystrix超时,直接返回超时异常。如果ribbon超时,同时Hystrix未超时,ribbon会自动进行服务集群轮询重试,直到Hystrix超时为止。如果Hystrix超时时长小于ribbon超时时长,ribbon不会进行服务集群轮询重试。

    那么在zuul中可配置的超时时长就有两个位置:Hystrix和ribbon。具体配置如下:

    Spring-cloud中的zuul网关重试机制是使用spring-retry实现的。工程必须依赖下述资源:

    相关文章

      网友评论

          本文标题:Spring Cloud 中 Zuul 网关原理及其配置,看它就

          本文链接:https://www.haomeiwen.com/subject/ywdafltx.html