Interview preparation -- spring cloud gateway

文章介绍了API网关的作用,如统一入口、鉴权、限流等,并比较了Zuul1.x和2.x的差异,以及Nginx+Lua的方案。重点讲述了SpringCloudGateway的特点,包括高性能、内置功能和可扩展性,并详细解析了其路由、Predicate(断言)和Filter(过滤器)的概念及工作原理。此外,还提到了Sentinel在网关限流中的应用。
摘要由CSDN通过智能技术生成
网关解决的问题
  • API网关,就是指系统的统一入口,提供内部服务的一个路由中转,为客户端提供统一服务,在网关模块中,是流量统一入口,因此我们可以在网关中进行
    • 统一鉴权,限流,日志,缓存。
    • 统一错误处理
    • 请求转发,并且可以基于网关实现内,外网隔离。
网关对比
  • Zuul 1.x

    • Netfix开业的网关,基于Servlet框架构建,用java开发,易于二次开发,问题:一个线程处理一个请求,这种方式在内部延迟严重,当接口延迟较多情况下会引起存活的连接增多和线程增加的情况
  • Zuul 2.x

    • Zuul 2 采用了Netty实现异步非阻塞编程模型,每一个CPU核心对应一个线程,处理所有请求和响应,请求和响应的生命周期是通过事件和回调处理的,减少了线程数量,因此开销更少
  • Nginx + lua

    • 使用nginxx 的方向代理 + 负载均衡也可以实现对APi服务器的负载均衡和高可用,lua是脚本语言,可以用来编写简单逻辑,nginx支持lua脚本,问题:无法融入到微服务架构中。
  • gateway

    • 基于Spring Boot2.x,Spring WebFlux,和project Reactor,目的在于为微服务提供一种简单有效的统一api理由管理方式,他目标是替代Netlix zuul,不仅提供统一路由,而且基于Filter 链提供网关基本功能。
    • 性能强:是zuul的1.6倍
    • 功能强:内置很多实用功能,例如转发,监控,限流
    • 设计优雅,容易扩展
gateway 原理分析
  • spring cloud gateway 请求处理过程有几个非常重要概念:
    • 路由(route):他说网关基本组件,由ID,目标URL,Predicate集合,Filter集合组成
    • 断言(Predicate):Javam8引入的函数时接口,提供断言功能,可以匹配Http请求中任何内容,如果断言Predicate判断结果为true才可以继续转发,可以同时定义多个
    • 过滤器(Filter):为请求提供前置或者后置过滤。

在这里插入图片描述

Route Predicate Factories
  • spring cloud gateway 中predicate提供了路由匹配规则,如下代码中,通过Path匹配Url前缀是server的请求
 predicates: # 断言
     - Path=/server/**
  • gateway提供了很多类型的 Predicate,比如,Cookie,Header,Method,Path等,在gateway中可以自定义这些规则来达到一些规则判断的目的。

  • 指定时间规则匹配路由:更具配置的时间来匹配路由规则,

    • BeforeRoutePredicateFactory,在指定时间之前路由生效
    • AfterRoutePredicateFactory,请求在指定日期之后
    • BetweenRoutePredicateFactory,在指定日期之间
  • Cookie匹配路由

    • 判断携带的Cookie中是否有匹配规则的数据
  • Header匹配路由

    • 判断Header中对应的name和value于匹配规则是否一致,支持正则
  • Host匹配路由:

    • Http请求会携带一个Host,表示请求的服务器地址,这个规则可以匹配请求Host路由来做筛选
  • Method,请求方法匹配路由:

    • Http请求的Method属性,比如POST,GET等
  • Path,路由匹配,用的最多的:

    • 利用通配符等匹配现有业务的一些URL来做转发筛选
Gatewy Filter Factories
  • Gateway内置的Filter生命周期分两种: pre(业务逻辑之前),post(业务逻辑之后)
  • Gateway本身自带的Filter分两种,GateWayFilter(单一,只对配置的路由生效),GlobalFilter(全局,对所有请求生效)
  • Gateway中自定义了比较多的Filter,单一的有32,全局9个
  • 用的比较多的:
    • LoadBalanceClientFilter: 实现请求负载均衡过滤器
    • Retry GatewayFilter:请求重试过滤器,当后台服务不可用,网关会根据配置发起重试。
自定义Filter
  • 自定义Filter 用的才是最多的,需要实现Ordered,GlobalFilter,在使用中用到的一些处理
  • RewritePathGatewayFilterFactory:
    • 因为对于spring-cloud-gateway来说, 请求: //foo/* 跟请求 /foo/* 是不一样的. 而实际上一般web服务的处理都会把多个斜杠等同为一个斜杠, 包括之前的老网关的zuul就是这么处理的.而我们的应用中确实有某些请求是用了两个斜杠的.
  • AccessLoggingGatewayFilterFactory:
    • 日志处理
  • CacheRequestBodyGlobalFilter:
    • 因为spring-cloud-gateway存在一个坑: request里面body只能读取一次, 如果某个filter, 读取了一次body,将导致后面的filter无法再次读取, 转发的filter无法读取就无法正常转发. 在某些情况下, 我们的headUa是放在body的form表单里面的, 为了读取headUa, 就必须读取body.为了解决这个问题, 需要把body先copy一份并cache起来, 读取的时候直接用cache的body.
  • DeviceFingerprintValidatorGatewayFilterFactory:
    • 请求验证过滤器, 主要验证设备指纹信息, 或获取指纹列表
  • IpListInterceptorGatewayFilterFactory:
    • IP名单过滤
  • RequestValidatorGatewayFilterFactory:
    • 请求验证过滤器, 主要验证HeadUa的签名,exp:mobile/5.6.0/18/8.4.1/iPhone/0f607264fc6318a92b9e13c65db7cd3c/902684/2/0/1334/750/6F212B1F-4FFF-4189-82ED-B657E62F2084/3/e7ea59f18379035f386f883f0a59ac10adcf664c/test
  • Retry2GatewayFilterFactory:
    • 请求重试
  • TokenValidatorGatewayFilterFactory:
    • 主要验证token格式是否正确,例如环境信息,za的token会带环境信息test or online,带appid
gateway 集成Sentinel网关限流
  • 原理:
  • 通过GatewayRuleManager加载网关限流规则GatewayFlowRule时候,无论是否针对请求属性限流,Sentinel底层都会将网关流控规则GatewayFlowRule 转为热点参数规则ParamFlowRule存储到GatewayFlowManager中,于正常热点参数规则相互隔离。转化时候,Sentinel会根据请求属性配置,为网关流控规则设置参数索引,并添加到深处的热点参数规则中。

在这里插入图片描述

  • 外部请求进入api网关,经过SentinelGatewayFilter,子过滤器中依次进行Route ID/api分组匹配,请求属性解析,参数组装

  • Sentinel更具配置的网关限流规则来解析请求属性,并按照参数索引顺序组装参数数组,最终传入SphU.entry中

  • 在Snetinel Api gateway Adapter common 模块中slot chain中添加了一个GatewayFlowSlot,专门用来处理网关限流规则的检查

  • 如果当前限流规则并没有指定限流参数,Sentinelhi会在参数最后一个位置设置一个预设的常量$D最终实现普通限流

  • 实际上,网关限流,我们所配置的规则最终都会转为热点参数限流规则,通过ParamFlowChecker.passCheck进行热点参数限流规则检查。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《深入理解系统设计面试》是一本非常有用的系统设计面试指南。该指南深入讲解了系统设计的关键概念、原则和最佳实践。它适用于那些准备参加系统设计面试或想要提高系统设计技能的人群。 这本指南分为两部分。第一部分主要介绍了系统设计的基本概念和术语。它解释了系统设计面试的常见问题类型,并提供了解决这些问题的方法和技巧。此外,该指南还详细介绍了常用的系统设计模式和架构,让读者能够更好地理解和应用这些概念。 第二部分是一系列实际的面试问题和解答。这些问题覆盖了各种不同的系统设计场景,包括分布式系统、缓存、数据库设计、消息队列等等。每个问题都提供了详细的解答和相应的讨论,读者可以从中学习到如何有效地分析问题、提出解决方案以及权衡不同的设计选择。 整本书的风格非常实用和易懂。它通过清晰的说明、图表和示例来解释概念,让读者能够更好地理解和掌握内容。此外,每个问题都有详细的解答和讨论,帮助读者深入思考和理解系统设计的各个方面。 总之,《深入理解系统设计面试》是一本非常有价值的系统设计指南。它提供了全面的知识和实践经验,帮助读者掌握系统设计的核心概念和技巧,从而在面试或实际工作中取得成功。无论你是准备参加系统设计面试还是提升个人技能,这本书都会对你有很大的帮助。 ### 回答2: 《Grokking the System Design Interview》是一本关于系统设计面试的书籍,旨在帮助读者掌握系统设计的技巧和策略。这本书通过详细的案例分析和解答常见面试问题的方法,帮助读者建立起解决复杂系统设计问题的能力。 这本书首先介绍了系统设计面试的背景和重要性,强调了良好的系统设计能力在面试中的价值。然后,书中逐步介绍了解决系统设计问题的一般方法和步骤,包括需求分析、整体设计、数据库设计、缓存设计、分布式系统设计等方面。 《Grokking the System Design Interview》的亮点在于它通过真实世界的案例分析来解释不同的系统设计问题和解决方法。每个案例都包含了问题背景、需求、约束条件和解决方案。通过阅读这些案例,读者可以了解不同类型问题的思考方式和解决方案,并能够将这些方法应用到自己的系统设计问题中。 此外,书中还提供了一些常用的设计方案和优化技巧的讨论,例如使用缓存来提高系统性能、使用负载均衡来增加系统可扩展性等。这些技巧对于读者在面试中展示自己的技术能力和解决问题的能力非常有帮助。 总而言之,《Grokking the System Design Interview》是一本系统全面的系统设计面试指南,通过案例分析和实践经验,帮助读者掌握系统设计的核心原则和技巧。阅读这本书可以帮助读者在系统设计面试中脱颖而出,并取得成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值