微服务网关GateWay
2021-03-15 本文已影响0人
TZX_0710
-
网关的作用
- 针对所有请求进行统一鉴权、限流、熔断、日志
- 协议转化
- 统一错误码处理
- 请求转发
Spring Cloud Zuul
Zuul是Netflix开源的微服务网关,它的主要功能是路由转发和过滤。Zuul的核心是由一系列过滤器组成,它定义了4种标准类型的过滤器,这些会对应请求整个生命周期。
* Pre Filters:前置过滤器,请求被路由之前调用,可以用于鉴权、限流等 * Routing Filters:路由过滤器,请求路由到后端的微服务 * Post Filters:后置过滤器,路由过滤器中远程调用结束后执行,可以用于做统计、监控、日志等 * Error Filters:错误过滤器,任意一个过滤器出现异常或者远程服务调用超时会被调用
SpringCloud Gateway
- zuul1.x采用的是传统的 thread preconnection方式来处理请求,也就是针对每一个请求,会为这个请求专门分配一个线程来进行处理,直到这个请求完成之后才会释放线程,一旦后台服务器响应较慢,就会使得该线程被阻塞
- Zuul本身存在一些性能问题不适合高并发的场景,虽然后面升级了zuul2x,但是2x的发布时间一直不确定,所以SpringCloud并没有打算集成进来。
GateWay的原理分析:- 路由: 网关的基本组件,由ID、目标URL、Predicate集合、Filter集合组成
- 谓语(Predicate):java8引入的函数式接口、提供了断言的功能。它可以匹配Http请求中的任何内容。如果Predicate未true则表示当前路由可以赚翻
- 过滤器(Filter):为请求提供前置和后置的过滤
SpringCloud Gateway启动时基于Netty Server监听一个指定的端口,当客户端发送一个请求到网关时,网关会根据一系列Predicate的匹配结果来决定访问哪个路由,然后根据过滤器链进行请求的处理。过滤器链可以在请求发送到后端服务器之前和之后执行,也就是根据首先执行Pre过滤器链,然后将请求转发到后端服务器。
SpringCloud Gateway集成Sentinel网关限流
- 从Sentinel1.6版本开始,提供了SpringCloud Gateway模块 支持两种维度限流\
- Route限流
- 自定义维度限
网关限流原理
- 通过GatewayRuleManager加载网关限流规则GatewayFlowRule时,无论是否针对请求进行限流,Sentinel底层都会将网关流控规则GateWayFlowRule转化为热点参数规则ParamFlowRule 存储在GatewayFlowManager中,与正常的热点参数规则进行隔离。在转化时候,Sentinel会根据请求属性配置,为网关流控规则设置参数索引idx,并添加到热点参数规则中
- 在外部请求进入API网关时候,会先经过SentinelGatewayFilter,在该过滤器一次进行Router ID/API分组匹配,请求属性解析和参数组装
- Sentinel根据配置的网管限流规则来解析请求属性,并依次参照索引顺序组装参数数组。最终传入SphU.entry中
- 在Sentinel Api Gateway AdapterCommon模块中在Slot Chain中添加了一个GatewayFlowSlot,专门处理房管限流规则的检查
- 如果当前限流规则并没有指定限流参数,则Sentinel会在参数最后一个位置置入一个预设的常量,最终实现普通限流