嘉宾 | 高家祺 整理 | 黄文勤
出品 | CSDN云原生
【资料图】
时下,网关作为微服务架构的组成部分,发挥着举足轻重的作用。Spring Cloud Gateway是Spring官方基于Spring5.0、SpringBoot2.0、Netty和Project Reactor等技术开发的网关,旨在为微服务框架提供一种简单而有效的统一的API路由管理方式,统一访问接口。
2022年7月26日,在CSDN云原生系列在线峰会第14期“Spring Cloud峰会”上,谐云产品总监高家祺分享了《企业级Spring Cloud Gateway网关优化实践》。
Spring Cloud Gateway和其他网关对比,展现出五个核心特点:
采用非阻塞IO网络框架支撑;
与Spring Cloud生态组件无缝集成,符合大部分业务系统的集成需求,成本低;
基于WebFlux响应式Web模型,事件驱动与非阻塞IO结合,满血使用CPU性能,性能吞吐量更优秀;
只需掌握Route原理,会编写Filter即可上手网关开发;
基于Spring Boot Actuator提供完整开箱即用的生产级监控。
由此可见,Spring Cloud Gateway是一款定位面向业务友好的网关。
Spring Cloud Gateway主要由三部分组成:
Route(路由):即一套路由规则,是集URI、Predicate、Filter等属性为一体的元数据类;
Predicate(断言):可以参考Java8函数断言,看作是满足什么条件时,Route规则生效,它允许开发者去定义匹配来自于Http Request中的任何信息,如请求头或者请求参数;
Filter(过滤器):Filter针对请求和响应进行增强、修改处理。Filter可以认为是Spring Cloud Gateway最核心的模块,熔断、安全、逻辑执行、网络调用都是Filter来完成的,其中又细分为Gateway Filter和Global Filter。
Spring Cloud Gateway的核心原理,可以从宏观和微观两个方面进行分析。
从宏观上看,SpringCloud Gateway作为内部网络与外部应用的衔接器,是所有访问内部网络流量必须统一经过网关的入口,以此避免外部不受控的非法访问,增强内部安全性。在实现内部衔接的过程中,首先,需要建立内部微服务纳管的协议。其次,网关与外部微服务也建立起统一的访问协议。在整个访问过程中,网关在路由策略、协议转换、过滤、API组合等方面发挥着重要作用。
从微观上看,在整个过程中,有一个SeverWebExchange的上下文,将Header、Path、RequestBody、RequestParam、Status、Response放入后,即可从SeverWebExchange内拿到想要的信息。
如上图所示,通过一次请求的调用流程来看Spring Cloud Gateway的核心原理。
RoutePredicateHandlerMapping:通过lookupRoute方法,对路由逐个正则匹配,找到第一个可以匹配的Route路由。
FilteringWebHandler:创建过滤器链,按顺序调用Filter。Filter分为PreFilter前置过滤器和PostFilter后置过滤器。
整个请求的调用流程,通过ServerWebExchange作为上下文贯穿启动。对于一次请求的信息从ServerWebExchange获取,修改则保存在ServerWebExchange中。但基于Reactive特性,ServerWebExchange是只读的,修改Exchange需重新builder。
Spring Cloud Gateway路由条件匹配器是一个断言,根据Http Request中的请求报文来进行匹配,当满足条件则路由生效。它提供了12种路由匹配方式,分别是After、Before、Between、Cookie、Header、Host、Path、Method、Query、RemoteAddr、Weight、XForward。
Spring Cloud Gateway的路由过滤器针对HTTP请求报文中的Header、Body、Param等元素进行操作。最新的Spring Cloud Gateway版本内置了32种Filter拓展。
过滤器的应用主要体现在八个方面:
对于请求报文(Header、Path、Param、Body)进行设值、添加、修改、删除、缓存等操作,根据修改的环节又分为请求与响应;
对网关流量计数,实现熔断限流功能;
设置请求重定向地址;
设置请求状态;
保存Session;
请求重试;
设置请求大小;
Token传递。
Spring Cloud Gateway的优化实践,可以从路由匹配性能优化、动态路由、弹性架构、服务发现、多协议转换、网关鉴权、标准接口定义这七个方面来看。
在路由匹配性能优化方面:
采用MRU算法维护一个最近常用的繁忙队列,先在常用路由匹配路由规则。引入路由层级逐层进行匹配,即先进行第一级路径匹配,再逐个匹配。
在动态路由方面:
通过拓展RouteLocator组件实现CachingRouteLocator,允许每个网关实例到“配置中间件”获取路由定义信息,配置中间件可以是Nacos、Redis、Zookeeper等。动态路由作为网关控制分离的重要实现方式,支持集中管理路由规则,弹性扩展实例。
在弹性架构方面:
针对网关Broker数据面进行组织分化形成共享微服务网关、专有微服务网关、特性微服务网关,实现企业级业务系统的网关集中化管理的同时实现网关分布式化,避免单点故障,又满足不同业务系统不同路由策略、协议、业务流量情况的需求,同时以特性微服务网关来提供对Nginx、Kong、Envoy的适配。
在服务发现方面:
服务发现模块拓展Spring Cloud Gateway现有的LoadBalancerClientFilter实现,通过便携轻量级的NacosClient、EurekaClient、K8sClient、OpenshiftClient统一多种注册中心的服务发现模式,并支持灵活配置,通过GatewayDiscoveryClient抽象统一返回ServiceList。
在多协议转换方面:
协议转换需要将Gateway进入的Http协议进行转换,适配支持Dubbo、WebService、gRPC协议,将协议转换拆分为三个组件来实现,如对于Dubbo协议由Http2Dubbo转换器、DubboInvoker调用器、DubboWriteResponse响应适配器组成。
在网关鉴权方面:
网关在微服务架构中是鉴权的最佳实现方式,具有非侵入、易维护的特点。鉴权可分为Token校验、权限验证、数据权限验证、操作记录几个步骤,实现业务系统的安全增强。
在标准接口定义上:
API网关里有一些较常用的功能。
接口调试。网关数据面Broker代理内部微服务,承接来自外部流量的请求;对于接口调试场景,Console服务将用户请求翻译成标准Http格式协议,Broker实时感知请求并调试目标服务,返回调试结果。
流量录制。对于网关经过的请求,在网关通过请求转换接口定义来获得接口定义录制,随后可以随时发起流量回放,用来排查问题或者自动化测试。
流量复制。对于网关经过的请求,网关如果开启流量复制策略,则首先将流量转换为接口定义,再下发转发到对应的微服务。
场景一:微服务网关
主要作用体现在:
通过API网关,将所有微服务接入网关,并实现微服务之间的互通互访;
微服务系统所有API接口服务的请求接入点,统一流量入口;
统一由网关进行路由转发、认证鉴权安全工作;
提供微服务间、微服务与外部访问的负载均衡、限流、熔断等治理功能。
场景二:业务系统集成
主要作用体现在:
业务服务的接入聚合点;
规范化、标准化纳管各业务系统接口,快速完成企业内部系统的解耦及前后端分离;
对不同系统接口进行协议适配和转化,满足不同客户端需求;
复用已有能力,避免重复性开发;
实现可观可控的相互访问。
场景三:企业能力开放
主要作用体现在:
通过API网关将企业内部服务能力以标准API的形式开放给合作伙伴、开发者;
与外部用户可管可控地共享服务、能力和数据,达成深度合作,共建新生态。
场景四:接口生命周期管理
主要作用体现在:
解决开发团队面临的协作开发、接口文档管理、在线测试等问题;
定义Mock接口,使得接口调用方与接口开发者解耦,实现同步工作;
实现软件开发的标准化,提升交付质量,并确保软件可迭代。
场景五:架构治理
主要作用体现在:
解决企业级服务治理问题,管理微服务调用关系、接口定义、服务分层;
在UAT环境,服务需统一注册在API网关,经过网关调用目标服务,服务调用关系需经过申请;
架构管理员可以进行服务访问审批、接口定义审批、拓扑分析复查;
实现软件开发的标准化,分层清晰合理,从源头实现微服务架构治理。
总的来说,如今Spring Cloud Gateway经过优化迭代后,应用场景日益丰富,不断满足开发者的需求,已经成为应用开发中的一柄利器。
本片文章整理来自@黄文勤,由CSDN修订完成 。
想要参与到专家技术分享的一手整理过程中并获得相应权益吗?关注【CSDN云原生】公众号并回复关键词“志愿者”了解详情,我们期待你的加入~