springcloud网关代理(码住SpringCloudGateway企业级网关详解及实践分享)
Spring Cloud Gateway是Spring官方基于Spring5.0、SpringBoot2.0、Netty和Project Reactor等技术开发的网关,旨在为微服务框架提供一种简单而有效的统一的API路由管理方式,统一访问接口。
Spring Cloud Gateway作为Spring Cloud生态体系中的网关,目标是替代Netflix的Zuul,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全、监控/埋点和限流等等。
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 Gateway是一款非常好的衔接器。首先是衔接内部网络与外部应用,让所有访问内部网络的流量需经过网关的访问控制,统一提供给外部应用,避免不受控的非法访问,增强系统安全性。作为实现内外部的衔接的组件,网关首先建立内部微服务纳管的协议,无论协议是否相同,技术栈是否匹配,都可以通过技术手段纳管到网关中。
其次网关与外部微服务也建立起统一的访问协议,来对外提供访问。
在整个访问的过程中,网关核心在于将请求流量由上游发起经过网关到下游的微服务,在流量出入的过程中,网关在路由策略,协议转换、过滤、API组合等方面构建网关的核心能力。
微观层面
SpringCloud内部有Route,同样也是一个非常紧密的左手拉右手的效果,一方面Route通过Predicate来匹配来自外部应用的访问流量,另一方面通过Route来找到目标微服务。
从宏观到微观,网关起到了将外部应用的访问,按照一定的访问策略,访问目标微服务的中间件的作用。
以一次请求看SpringCloud Gateway的调用流程:
- RoutePredicateHandlerMapping:通过lookupRoute方法,遍历所有路由列表,一个路由一个路由的正则匹配,指导找到第一个可以匹配的Route路由。
- FilteringWebHandler:创建过滤器链,按顺序调用Filter,filter又分为PreFilter前置过滤器和PostFilter后置过滤器。
- 整个请求过ServerWebExchange作为上下文贯穿启动,对于一次请求的信息从ServerWebExchange获取,修改则保存在ServerWebExchange中,注意基于Reactive特性,ServerWebExchange是只读的,修改Exchange需重新builder
04
SpringCloud Gateway
路由条件匹配器
SpringCloud Gateway路由条件匹配器是一个断言,根据Http Request中的请求报文来进行匹配,当满足条件则路由生效。
- 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 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 Gateway默认使用逐个路由匹配的方式进行路由的查找,对于每一次请求都会逐个匹配路由的断言规则,直到匹配到第一个路由找到调用的目标服务。所以对于在路由非常多的场景,路由的断言匹配严重影响来访问效率。
针对路由断言匹配我们进行来性能优化,首先通过增加BusyRouteList,采用MRU的算法来维护一个最近常用的繁忙队列,将最常用的路由可以快速匹配出来;其次对于路由列表我们增加来按照路由路径进行分组,往往不同路径代表着不同的微服务,路由是路由中最具有区分力的元素,通过按路径分组,可以进一步大大提升查询路由的效率。
动态路由
动态路由作为网关控制分离的重要实现方式,支持集中管理路由规则,弹性扩展实例。我们将网关拆分为console的控制面,负责维护管理下发控制策略,broker数据面负责作为网关接入业务服务执行路由规则。动态路由通过拓展RouteLocator组件实现CachingRouteLocator,允许每个网关实例到“配置中间件”获取路由定义信息,配置中间件可以是Nacos、Redis、Zookeeper等。
弹性架构
弹性架构:针对网关broker数据面进行组织分化形成共享微服务网关、专有微服务网关、特性微服务网关,实现企业级业务系统的网关集中化管理,实现网关分布式化,避免单点故障,又满足不同业务系统不同路由策略、协议、业务流量情况的需求,同时以特性微服务网关来提供对nginx、kong、envoy的适配。
服务发现
服务发现:服务发现模块拓展SpringCloud Gateway现有的LoadBalancerClientFilter实现,通过便携轻量级的NacosClient、EurekaClient、K8sClient、OpenshiftClient统一多种注册中心的服务发现模式,并支持灵活配置,通过GatewayDiscoveryClient抽象统一返回ServiceList。
多协议转换
多协议转换:协议转换需要将Gateway进入的Http协议进行转换,适配支持dubbo、webservice、grpc协议,将协议转换拆分为三个组件来实现,如对于dubbo协议由Http2Dubbo转换器,DubboInvoker调用器,DubboWriteResponse响应适配器组成。
网关鉴权
网关鉴权:网关在微服务架构中是鉴权的最佳实现方式,具有非侵入易维护的特点。将鉴权可分为Token校验、权限验证、数据权限验证、操作记录几步骤,轻松实现业务系统的安全增强。
标准接口定义
- 接口调试:网关数据面Broker代理内部微服务,承接来自外部流量的请求;对于接口调试场景,Console服务将用户请求翻译成标准Http格式协议,Broker实时感知请求并调试目标服务,返回调试结果。
- 流量录制:对于网关经过的请求,在网关通过请求转换接口定义来获得接口定义录制下来,随后可以随时发起流量回放,用来排查问题,或者自动化测试。
- 流量复制:对于网关经过的请求,在网关如果开启流量复制策略,则首先将流量转换为接口定义,在下发转发到对应的微服务。
07
谐云HC-Gateway
API网关
谐云HC-Gateway是基于Java开发的API网关平台,提供高性能、高可用、易扩展的统一API网关解决方案。具有以下特点:
- API网关全生命周期管理
- 支持对接口生命周期过程中的开发、调试、发布、授权、接口文档、日志分析、下线的管理,保证各个阶段的稳定进行。
- 易扩展性
- 提供了丰富的系统组件完成鉴权、限流、监控等能力,能够满足大部分的业务需求;支持自定义插件满足个性化需求、便于调整或替换已有集成功能,不必频繁对网关层代码进行改动,确保网关层的稳定性。
- 高可管理性
- 匹配企业的各种管理特性,包括多租户、多权限、多环境的管理。
- 丰富的可观测性
- 提供网关、应用、路由、服务级别的监控能力,支持链路追踪,将监控数据输出到控制台,提供图像化的展示,帮助用户监控与定位问题。
- 全面的安全防护
- 提供API认证、访问控制、流量控制、IP黑白名单等多种安全机制,避免潜在的安全风险。
- API门户
- 支持将接口上架到API门户,提供给第三方开发者采购与使用。
谐云HC-Gateway整体架构图
在控制面,HC-Gateway可提供完善的网关管控,完成服务、接口、应用的相关管理以及配置下发工作;在数据面,可多实例扩展,支持多种类型的微服务接入,包括Nacos、Eureka、Kubernetes微服务、自定义服务;负责网关具体策略的执行,如路由策略、灰度策略、流控策略、安全策略等。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com