springcloud网关代理(码住SpringCloudGateway企业级网关详解及实践分享)

Spring Cloud Gateway是Spring官方基于Spring5.0、SpringBoot2.0、Netty和Project Reactor等技术开发的网关,旨在为微服务框架提供一种简单而有效的统一的API路由管理方式,统一访问接口。

Spring Cloud Gateway作为Spring Cloud生态体系中的网关,目标是替代Netflix的Zuul,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全、监控/埋点和限流等等。

springcloud网关代理(码住SpringCloudGateway企业级网关详解及实践分享)(1)

01

SpringCloud Gateway

特点

SpringCloud Gateway是一款业务友好型的网关,适应于业务网关场景,具有以下特点:

  • 非阻塞IO
  • 采用非阻塞 IO 网络框架支撑,reactor 模式,采用更少的资源完成请求
  • SC组件无缝集成
  • 与 Spring Cloud生态组件无缝集成,符合大部分业务系统的集成需求,集成成本低
  • Reactive编程
  • 基于WebFlux响应式Web模型,事件驱动与非阻塞 IO 结合,满血使用 CPU 性能,性能吞吐量更优秀
  • 简单易开发
  • 只需掌握Route原理,会编写Filter即可上手网关开发
  • 开箱即用监控机制
  • 基于SpringBoot Actuator提供完整开箱即用的生产级监控

02

SpringCloud Gateway

构成

SpringCloud Gateway由三部分组成:Route、Predicate、Filter。
  • 路由Route:即一套路由规则,是集URI、predicate、filter等属性的一个元数据类。
  • 断言Predicate:Java8函数断言,这里可以看做是满足什么条件的时候,route规则进行生效。允许开发者去定义匹配来自于Http Request中的任何信息,如请求头和参数。
  • 过滤器Filter:filter针对请求和响应进行增强、修改处理。filter可以认为是Spring Cloud Gateway最核心的模块,熔断、安全、逻辑执行、网络调用都是filter来完成的,其中又细分为gateway filter和global filter,区别在于是具体一个route规则生效还是所有route规则都生效。

03

SpringCloud Gateway

整体架构

springcloud网关代理(码住SpringCloudGateway企业级网关详解及实践分享)(2)

宏观层面

SpringCloud Gateway是一款非常好的衔接器。首先是衔接内部网络与外部应用,让所有访问内部网络的流量需经过网关的访问控制,统一提供给外部应用,避免不受控的非法访问,增强系统安全性。作为实现内外部的衔接的组件,网关首先建立内部微服务纳管的协议,无论协议是否相同,技术栈是否匹配,都可以通过技术手段纳管到网关中。

其次网关与外部微服务也建立起统一的访问协议,来对外提供访问。

在整个访问的过程中,网关核心在于将请求流量由上游发起经过网关到下游的微服务,在流量出入的过程中,网关在路由策略,协议转换、过滤、API组合等方面构建网关的核心能力。

微观层面

SpringCloud内部有Route,同样也是一个非常紧密的左手拉右手的效果,一方面Route通过Predicate来匹配来自外部应用的访问流量,另一方面通过Route来找到目标微服务。

从宏观到微观,网关起到了将外部应用的访问,按照一定的访问策略,访问目标微服务的中间件的作用。

springcloud网关代理(码住SpringCloudGateway企业级网关详解及实践分享)(3)

以一次请求看SpringCloud Gateway的调用流程:

  • RoutePredicateHandlerMapping:通过lookupRoute方法,遍历所有路由列表,一个路由一个路由的正则匹配,指导找到第一个可以匹配的Route路由。
  • FilteringWebHandler:创建过滤器链,按顺序调用Filter,filter又分为PreFilter前置过滤器和PostFilter后置过滤器。
  • 整个请求过ServerWebExchange作为上下文贯穿启动,对于一次请求的信息从ServerWebExchange获取,修改则保存在ServerWebExchange中,注意基于Reactive特性,ServerWebExchange是只读的,修改Exchange需重新builder

04

SpringCloud Gateway

路由条件匹配器

SpringCloud Gateway路由条件匹配器是一个断言,根据Http Request中的请求报文来进行匹配,当满足条件则路由生效。

springcloud网关代理(码住SpringCloudGateway企业级网关详解及实践分享)(4)

  • After:匹配在指定日期时间之后发生的请求。
  • Before:匹配在指定日期之前发生的请求。
  • Between:需要指定两个日期参数,设定一个时间区间,匹配此时间区间内的请求。
  • Cookie:需要指定两个参数,分别为name和regexp(正则表达式),也可以理解Key和Value,匹配具有给定名称且其值与正则表达式匹配的Cookie。
  • Header:需要两个参数header和regexp(正则表达式),也可以理解为Key和Value,匹配请求携带信息。
  • Host:匹配当前请求是否来自于设置的主机。
  • Method:可以设置一个或多个参数,匹配HTTP请求,比如GET、POST
  • Path:匹配指定路径下的请求,可以是多个用逗号分隔
  • Query:需要指定一个或者多个参数,一个必须参数和一个可选的正则表达式,匹配请求中是否包含第一个参数,如果有两个参数,则匹配请求中第一个参数的值是否符合正则表达式。
  • RemoteAddr:匹配指定IP或IP段,符合条件转发。
  • Weight:需要两个参数group和weight(int),实现了路由权重功能,按照路由权重选择同一个分组中的路由

05

SpringCloud Gateway

路由过滤器

springcloud网关代理(码住SpringCloudGateway企业级网关详解及实践分享)(5)

SpringCloud Gateway过滤器针对HTTP请求报文中的Header、Body、Param等元素进行操作。最新的SpringCloud Gateway版本内置了32种Filter拓展。

过滤器的应用:

  • 对于请求报文(header、path、param、body)进行设值、添加、修改、删除、缓存等操作,根据修改的环节又分为请求与响应
  • 对网关流量计数,实现熔断限流功能
  • 设置请求重定向地址
  • 设置请求状态
  • 保存Session
  • 请求重试
  • 设置请求大小
  • Token传递

SpringCloud Gateway过滤器是最常用的开发方式,支持两种自定义Filter模式:GlobalFilter、GatewayFilter,GlobalFilter是全局过滤器,面向全局生效,GatewayFilter是局部过滤器对于特定的Route生效。

06

SpringCloud Gateway

优化实践

基于SpringCloud Gateway我们有深入的使用,为了让它能够更好地适应企业级的业务场景需求,我们对它的性能和功能上做了很多优化。

路由匹配性能优化

springcloud网关代理(码住SpringCloudGateway企业级网关详解及实践分享)(6)

SpringCloud Gateway默认使用逐个路由匹配的方式进行路由的查找,对于每一次请求都会逐个匹配路由的断言规则,直到匹配到第一个路由找到调用的目标服务。所以对于在路由非常多的场景,路由的断言匹配严重影响来访问效率。

针对路由断言匹配我们进行来性能优化,首先通过增加BusyRouteList,采用MRU的算法来维护一个最近常用的繁忙队列,将最常用的路由可以快速匹配出来;其次对于路由列表我们增加来按照路由路径进行分组,往往不同路径代表着不同的微服务,路由是路由中最具有区分力的元素,通过按路径分组,可以进一步大大提升查询路由的效率。

动态路由

springcloud网关代理(码住SpringCloudGateway企业级网关详解及实践分享)(7)

动态路由作为网关控制分离的重要实现方式,支持集中管理路由规则,弹性扩展实例。我们将网关拆分为console的控制面,负责维护管理下发控制策略,broker数据面负责作为网关接入业务服务执行路由规则。动态路由通过拓展RouteLocator组件实现CachingRouteLocator,允许每个网关实例到“配置中间件”获取路由定义信息,配置中间件可以是Nacos、Redis、Zookeeper等。

弹性架构

springcloud网关代理(码住SpringCloudGateway企业级网关详解及实践分享)(8)

弹性架构:针对网关broker数据面进行组织分化形成共享微服务网关、专有微服务网关、特性微服务网关,实现企业级业务系统的网关集中化管理,实现网关分布式化,避免单点故障,又满足不同业务系统不同路由策略、协议、业务流量情况的需求,同时以特性微服务网关来提供对nginx、kong、envoy的适配。

服务发现

服务发现:服务发现模块拓展SpringCloud Gateway现有的LoadBalancerClientFilter实现,通过便携轻量级的NacosClient、EurekaClient、K8sClient、OpenshiftClient统一多种注册中心的服务发现模式,并支持灵活配置,通过GatewayDiscoveryClient抽象统一返回ServiceList。

springcloud网关代理(码住SpringCloudGateway企业级网关详解及实践分享)(9)

多协议转换

多协议转换:协议转换需要将Gateway进入的Http协议进行转换,适配支持dubbo、webservice、grpc协议,将协议转换拆分为三个组件来实现,如对于dubbo协议由Http2Dubbo转换器,DubboInvoker调用器,DubboWriteResponse响应适配器组成。

springcloud网关代理(码住SpringCloudGateway企业级网关详解及实践分享)(10)

网关鉴权

网关鉴权:网关在微服务架构中是鉴权的最佳实现方式,具有非侵入易维护的特点。将鉴权可分为Token校验、权限验证、数据权限验证、操作记录几步骤,轻松实现业务系统的安全增强。

springcloud网关代理(码住SpringCloudGateway企业级网关详解及实践分享)(11)

标准接口定义

  • 接口调试:网关数据面Broker代理内部微服务,承接来自外部流量的请求;对于接口调试场景,Console服务将用户请求翻译成标准Http格式协议,Broker实时感知请求并调试目标服务,返回调试结果。
  • 流量录制:对于网关经过的请求,在网关通过请求转换接口定义来获得接口定义录制下来,随后可以随时发起流量回放,用来排查问题,或者自动化测试。
  • 流量复制:对于网关经过的请求,在网关如果开启流量复制策略,则首先将流量转换为接口定义,在下发转发到对应的微服务。

springcloud网关代理(码住SpringCloudGateway企业级网关详解及实践分享)(12)

07

谐云HC-Gateway

API网关

谐云HC-Gateway是基于Java开发的API网关平台,提供高性能、高可用、易扩展的统一API网关解决方案。具有以下特点:

  • API网关全生命周期管理
  • 支持对接口生命周期过程中的开发、调试、发布、授权、接口文档、日志分析、下线的管理,保证各个阶段的稳定进行。
  • 易扩展性
  • 提供了丰富的系统组件完成鉴权、限流、监控等能力,能够满足大部分的业务需求;支持自定义插件满足个性化需求、便于调整或替换已有集成功能,不必频繁对网关层代码进行改动,确保网关层的稳定性。
  • 高可管理性
  • 匹配企业的各种管理特性,包括多租户、多权限、多环境的管理。
  • 丰富的可观测性
  • 提供网关、应用、路由、服务级别的监控能力,支持链路追踪,将监控数据输出到控制台,提供图像化的展示,帮助用户监控与定位问题。
  • 全面的安全防护
  • 提供API认证、访问控制、流量控制、IP黑白名单等多种安全机制,避免潜在的安全风险。
  • API门户
  • 支持将接口上架到API门户,提供给第三方开发者采购与使用。

springcloud网关代理(码住SpringCloudGateway企业级网关详解及实践分享)(13)

谐云HC-Gateway整体架构图

在控制面,HC-Gateway可提供完善的网关管控,完成服务、接口、应用的相关管理以及配置下发工作;在数据面,可多实例扩展,支持多种类型的微服务接入,包括Nacos、Eureka、Kubernetes微服务、自定义服务;负责网关具体策略的执行,如路由策略、灰度策略、流控策略、安全策略等。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页