0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

分布式网关介绍及动态路由实现

jf_78858299 来源:牧羊人的方向 作者:大唐小少 2023-05-04 17:37 次阅读

服务网关作为分布式系统对外服务的统一入口,设计功能上具有路由转发、熔断限流、安全认证以及监控等功能。本文简要介绍服务网关的基本概念,以及动态路由的实现方式,以加深了解。

1、什么是分布式服务网关

1.1 服务网关的基本概念

网关是客户端访问系统请求及系统响应所要经过的网络关口,网关封装了系统内部功能架构,为每个客户端访问提供不同的接口。网关在功能上主要是进行请求过滤,具体包括请求路由转发、安全认证、流量控制、负载均衡、日志、监控等功能。

在分布式系统尤其是微服务架构中,一个应用系统被拆分为多个服务,但是像路由请求、安全认证、流量控制、日志和监控等功能对每个服务来说都是标准的功能模块。如果没有服务网关,那么每个服务就需要单独实现一套这样的模块,功能重复并且不利于统一管理。另外,多个微服务可能部署在不同的服务器上,传统的直接访问应用服务的方式增加了客户端的复杂度,因此需要一个统一的客户端访问入口进行标准化管理。

图片

1.2 服务网关的作用及功能

服务网关作为客户端请求的统一入口,具备以下功能:

  1. 动态路由 :根据请求路由到对应的服务上去,如果服务不可用还会有重试机制
  2. 负载均衡 :多服务器提供同一种服务,网关会从配置中心拉取各服务注册信息,然后将请求负载到这些服务器进行处理
  3. 流量控制 :限制并发请求的流量,避免内部系统受到冲击
  4. 安全认证 :网关对相关权限验证、脱敏和流量清洗、签名和黑名单功能
  5. 熔断降级 :当服务不可用或者访问量过大,网关可以将请求做降级,将流量打到其他服务器或者做其他处理,提示用户暂时不可用
  6. 灰度发布 :先进行小部分服务器升级,通过网关将少量的服务路由到已升级的服务器用来测试服务是否正常,大部分请求依旧在老版本服务器上处理
  7. 日志服务 :服务访问情况监控和统计报表,请求的吞吐量、并发数、流量监控、性能监控和日常告警等
1.3 常见的分布式服务网关

常见的分布式服务网关有以下几种:

  1. Nginx+Lua :基于Nginx的服务端网关方案,实现web服务器、反向代理、负载均衡、动静分离等功能;
  2. Kong :基于OpenResty实现,是一款高性能、云原生、可扩展的网关系统;
  3. SpringCloud Zuul :基于Netty实现了异步IO,可自定义过滤器来处理请求,同时提供了动态路由、监控、弹性负载和安全功能
  4. SpringCloud Gateway :基于Spring WebFlux,提供统一的路由方式,并且基于Filter链的方式提供了网关的基本功能,如安全、限流、监控等
1.3.1 Nginx+Lua实现

在《简单聊聊Nginx实现原理》中对Nginx的功能做了简单的介绍,可以实现反向代理、负载均衡、动静分离等功能。

图片

1.3.2 Kong

Kong基于OpenResty实现 ,OpenResty是基于Nginx的库,它将Nginx进行封装,使用Lua脚本就可以对Nginx进行插件化管理。

  • 使用PostgreSQL或Cassandra来对其配置文件进行持久化存储,使得可以进行集群管理
  • 提供了插件模型,使用 Lua脚本来对Nginx整个生命周期进行扩展 。实现了一些常用插件( 限流、熔断、验权等 )
  • 提供了Http/Rest的接口来实现配置,使得其可以更简单的构建图形化界面进行动态配置

图片

1.3.3 Spring Cloud Zuul

Zuul是来自Netflix的基于JVM的路由器和服务器端负载均衡器,为微服务架构提供了前门保护的作用,同时将权限控制这些较重的非业务逻辑内容迁移到服务路由层面,使得服务集群主体能够具备更高的可复用性和可测试性。官方定义如下:

Zuul是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。即Zuul为微服务集群提供代理、过滤和路由等功能。

Zuul会把外部的请求过程分为不同阶段,每个阶段提供一系列的过滤器。这些过滤器实现了以下功能:

  1. 身份验证和安全性 :对需要身份验证的资源进行过滤,拒绝处理不符合身份认证的请求。
  2. 观察和监控 :跟踪重要的数据,为我们展示准确的请求状况
  3. 动态路由 :将请求动态路由到不同的服务集群
  4. 负载均衡 :设置每种请求的处理能力,删除那些超出限制的请求
  5. 静态响应处理 :提供静态的过滤器,直接响应一些请求,而不将它们转发到集群内部
  6. 路由多样化 :除了将请求路由到Spring Cloud集群内部,还可以将请求路由到其他服务

图片

Zuul的 核心原理是一系列filters ,在请求路由合并到用户处理逻辑的过程中,这些过滤器参与验证、加载等过滤处理。zul定义了四种标准过滤器类型,用于请求的典型生命周期。

  1. PRE:这样的过滤器在请求被路由之前被调用 。可以利用这样的过滤器实现认证,选择集群内要求的微服务器,记录调试信息。
  2. ROUTING:该过滤器将请求路由到微服务 。此过滤器用于生成发送到微服务的请求,并使用Apachehttp客户端或Netfilx Ribbon请求微服务。
  3. POST:在路由到微服务之后执行该过滤器 。使用此过滤器可以将标准HTTP Header添加到响应中,收集统计信息和指标,以及将响应从微服务器发送到客户端。
  4. ERROR:如果在其他阶段发生错误 ,则执行该过滤器。
1.3.4 Spring Cloud Gateway

Spring Cloud Gateway是Spring官方基于Spring5.0,Spring Boot2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供简单,有效且统一的API路由管理方式。 Spring Cloud Gateway作为Spring Cloud 生态系统中的网关 ,目标是替代Netflix Zuul,其不仅提供统一的路由方式,并且还基于Filter链的方式提供了网关基本的功能,例如:安全,监控、埋点,限流等。

图片

1)Spring Cloud Gateway特性

  • 基于Spring Framework 5、Reactor和Spring Boot 2.0框架。
  • 根据请求的属性可以匹配对应的路由。
  • 集成Hystrix。
  • 集成Spring Cloud DiscoveryClient。
  • 把易于编写的Predicates和Filters作用于特定路由。
  • 具备一些网关的高级功能,如动态路由、限流、路径重写。

2)Spring Cloud Gateway核心概念

  • Filter(过滤器) :和Zuul的过滤器在概念上类似,可以使用Filter拦截和修改请求,实现对上游的响应,进行二次处理,实现横切与应用无关的功能,如安全、访问超时设置、限流等功能。
  • Route(路由) :网关配置的基本组成模块,和Zuul的路由配置模块类似。一个Route模块由一个ID、一个目标URI、一组断言和一组过滤器组成。如果断言为真,则路由匹配,目标URI会被访问。
  • Predicate(断言) :Predicate来自Java 8的接口,它可以用来匹配来自HTTP请求的任何内容,例如headers或参数。接口包含多种默认方法,并将Predicate组合成复杂的逻辑(与、或、非),可以用于接口参数校验、路由转发判断等。

3)Spring Cloud Gateway核心处理流程

图片

  1. Gateway的客户端回向Spring Cloud Gateway发起请求
  2. 请求首先会被HttpWebHandlerAdapter进行 提取组装成网关的上下文 ,然后网关的上下文会传递到DispatcherHandler。
  3. DispatcherHandler是所有请求的分发处理器,DispatcherHandler主要 负责分发请求对应的处理器 ,比如将请求分发到对应RoutePredicateHandlerMapping(路由断言处理器映射器)。
  4. 路由断言处理映射器 主要用于路由的查找 ,以及找到路由后返回对应的FilteringWebHandler。
  5. FilteringWebHandler主要 负责组装Filter链表并调用Filter执行一系列Filter处理 ,然后把请求转到后端对应的代理服务处理,
  6. 处理完毕后,将Response 返回到Gateway客户端
1.3.5 Zuul和Gateway对比

Spring cloud Zuul和Spring Cloud Gateway处理的都是http请求,底层是serverlet服务。不同之处有以下几点:

  • 内部实现
    • gateway对比zuul多依赖了spring-webflux,在spring的支持下,功能更强大,内部实现了限流、负载均衡等,扩展性也更强,但同时也限制了仅适合于Spring Cloud套件
    • zuul则可以扩展至其他微服务框架中,其内部没有实现限流、负载均衡等
  • 是否支持异步
    • Zuul 1.x只支持同步。Zuul 2.x基于Netty实现了异步IO
    • Gateway支持异步。 理论上gateway则更适合于提高系统吞吐量(但不一定能有更好的性能),最终性能还需要通过严密的压测来决定
  • 扩展性
    • Gateway具有更好的扩展性,稳定性也是非常好的
  • 性能
    • Spring webflux 有一个全新的非堵塞的函数式 Reactive Web 框架,可以用来构建异步的、非堵塞的、事件驱动的服务,在伸缩性方面表现非常好
    • Zuul 1.x,是一个基于阻塞io的API Gateway。Zuul已经发布了Zuul 2.x,基于Netty,也是非阻塞的,支持长连接,但Spring Cloud暂时还没有整合计划

在实际生产使用中,Zuul 1.x虽然使用的是同步io,但是可以通过参数优化提高性能理论上可以达到极限性能,而springcloud gateway使用的是异步io,不需优化既可以达到接近极限的性能。

2、分布式网关动态路由实现

相比较静态路由,动态路由的好处是对路由配置的修改、新增或者删除,可以动态生效,不需要重启网关服务。这里主要介绍 基于Spring Cloud Gateway的动态路由几种实现方式 ,包括:

  • 基于Nacos
  • 基于数据库
  • 基于内存
2.1 基于Nacos的动态路由

Nacos集成在Spring Cloud中,提供了快速实现动态服务发现、服务配置、服务元数据及流量管理等功能。基于Nacos动态路由是通过Nacos更新修改路由配置,通过接口调用动态更新到本地缓存中。

图片

1)加载配置和监听路由

configInfo = configService.getConfig(NACOS_ROUTE_DATA_ID, NACOS_ROUTE_GROUP, DEFAULT_TIMEOUT);
configService.addListener(dataId, group, new Listener()

2)路由的动态添加和删除

routeDefinitionWriter.delete(Mono.just(id)).subscribe()
routeDefinitionWriter.save(Mono.just(definition)).subscribe();

3)路由信息刷新到本地缓存

publisher.publishEvent(new RefreshRoutesEvent(this));
2.2 基于数据库的动态路由

基于数据库的动态路由实现,是 将路由信息写入数据库中 ,再通过接口读取路由配置信息以及更新路由信息,最后刷新到本地缓存中。

图片

2.3 基于内存的动态路由

基于本地内存的方式比较简单,Spring Boot已经提供了两个组件Spring Boot Admin和Spring Boot Actuator。 通过调用接口更新路由信息,再刷新即可完成路由更新

o.s.c.g.a.GatewayControllerEndpoint:
{GET /routes/{id}}: route(String)
{GET /routes}: routes()
{GET /routedefinitions}: routesdef()
{GET /globalfilters}: globalfilters()
{GET /routefilters}: routefilers()
{GET /routepredicates}: routepredicates()
{GET /routes/{id}/combinedfilters}: combinedfilters(String)
{DELETE /routes/{id}}: delete(String)
{POST /routes/{id}}: save(String,RouteDefinition)
{POST /refresh}: refresh()

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 网关
    +关注

    关注

    9

    文章

    4447

    浏览量

    51058
  • 路由
    +关注

    关注

    0

    文章

    278

    浏览量

    41837
收藏 人收藏

    评论

    相关推荐

    分布式软件系统

    降到最低。负载在各处理机之间分担,可以避免临界瓶颈。 4、当现有机构中已存在几个数据库系统,而且实现全局应用的必要性增加时,就可以由这些数据库自下而上构成分布式数据库系统。 5、相等规模的分布式
    发表于 07-22 14:53

    关于分布式系统的全面介绍

    操作系统-----分布式系统概述
    发表于 07-25 06:59

    如何设计分布式干扰系统?

    ”的电子战系统,共同完成对敌信号的探测、定位、干扰任务。因此,嵌入网关分布式干扰系统研究的关键技术之一。目前国内对分布式干扰系统的研究还停留在理论基础上,而对其关键技术的研究不多。
    发表于 08-08 06:57

    HarmonyOS应用开发-分布式设计

    设计理念HarmonyOS 是面向未来全场景智慧生活方式的分布式操作系统。对消费者而言,HarmonyOS 将生活场景中的各类终端进行能力整合,形成“One Super Device”,以实现
    发表于 09-22 17:11

    如何高效完成HarmonyOS分布式应用测试?

    对HarmonyOS分布式应用测试解决方案,具体方案介绍如下。二、分布式应用测试解决方案DevEco Testing是一款全新的HarmonyOS测试解决方案。如图2所示,是DevEco Testing测试能力
    发表于 12-13 18:07

    分布式软总线实现近场设备间统一的分布式通信管理能力如何?

    现实中多设备间通信方式多种多样(WIFI、蓝牙等),不同的通信方式使用差异大,导致通信问题多;同时还面临设备间通信链路的融合共享和冲突无法处理等挑战。那么分布式软总线实现近场设备间统一的分布式通信管理能力如何呢?
    发表于 03-16 11:03

    基于ZigBee的分布式井盖监控系统

    随着我国现代经济发展水平的不断提高,城市井盖数目逐渐增加。由于较多井盖被盗,致使路面形成陷阱,危害到过往车辆和行人安全。本文提出了一种基于 ZigBee无线网络的智能安全监控系统,解决分布式布控困难
    发表于 09-18 08:46

    WebGIS动态匹配分布式设计

    针对WebGIS 在税务系统应用中遇到的对地图数据要求动态更新和动态匹配的问题进行了分析,给出了纳税户到街道动态匹配的方法,结合分布式对象技术,对纳税户到街道
    发表于 06-16 09:27 10次下载

    F0rCES路由分布式事务研究

    研究了分布式事务在ForCES路由器中的应用及实现机制。首先对ForCES中分布式事务的需求做了详细分析,在此基础上将修改的2PC机制引入ForCES,之后提出了一种基于状态机的
    发表于 09-26 15:24 17次下载
    F0rCES<b class='flag-5'>路由</b>器<b class='flag-5'>分布式</b>事务研究

    基于Dijkstra算法的分布式电能路由策略的实现

    拓扑;以Dijkstra为基础,节点仅根据其相邻节点的状态调节其自身状态,搜寻最短路径,完成电能路由实现电能的分布式管理和协调控制,使系统运行在优化状态。多代理系统(multi-agent system,MAS)技术为
    发表于 12-22 11:46 5次下载
    基于Dijkstra算法的<b class='flag-5'>分布式</b>电能<b class='flag-5'>路由</b>策略的<b class='flag-5'>实现</b>

    分布式无纸化交互系统的实现原理

    维讯维分布式无纸化交互系统的实现原理主要是基于IP分布式网络,将分布式系统、无纸化系统、会议智慧屏、显示大屏幕等有机融合,实现数据的
    的头像 发表于 09-04 16:11 620次阅读

    springcloud如何实现分布式

    Spring Cloud是基于Spring Boot开发的一套分布式系统解决方案,它主要包括了多个子项目,如服务注册与发现、配置中心、负载均衡、断路器、路由等等。通过使用Spring Cloud
    的头像 发表于 11-16 11:01 679次阅读

    如何实现Redis分布式

    机制,下面将详细介绍如何实现Redis分布式锁。 一、引言 在分布式系统中,多个节点可能同时读写同一共享资源。如果没有实现互斥访问和同步机制
    的头像 发表于 12-04 11:24 700次阅读

    分布式锁的三种实现方式

    ,下面将分别介绍三种常见的实现方式。 一、基于数据库实现分布式锁 在分布式系统中,数据库是最常用的共享资源之一。因此,可以通过数据库的特性
    的头像 发表于 12-28 10:01 896次阅读

    Redis实现分布式多规则限流的方式介绍

    市面上很多介绍 Redis 如何实现限流的,但是大部分都有一个缺点,就是只能实现单一的限流,比如 1 分钟访问 1 次或者 60 分钟访问 10 次这种,但是如果想一个接口两种规则都需要满足呢,我们的项目又是
    的头像 发表于 02-26 10:07 490次阅读
    Redis<b class='flag-5'>实现</b><b class='flag-5'>分布式</b>多规则限流的方式<b class='flag-5'>介绍</b>