Spring Cloud Gateway

Spring Cloud Gateway

一、网关理论介绍

1、定义

把暴露在service之前的组件,都可以叫网关。是service前置的架构。

2、BFF(backend for frontend)

专门为前端定制的一个后端接口,

一个页面即在手机、web等页面中显示。不同的展示需要访问不同的service,导致每个前端的逻辑就比较复杂。在这种情况下引入BFF

专门为一种UI模板去定制。

 

BFF推动了网关的概念。网关是基于它的物理位置决定的。在service前面做一个前置。

3、Gateway的作用

1)负载均衡

2)协议转换

3)安全(认证,黑白名单验证)

4)日志记录

5)流量控制和熔断

6)API facade(BFF)

7)缓存

8)逻辑路由

①金丝雀部署(灰度发布的一种形式)

②蓝绿部署

A/B test

二、Spring Cloud gateway

1、简介

① 基于Spring 5Project Reactor, Spring Boot 2.0

Project Reactor 流的形式

② 可根据任意request的属性进行路由匹配

③ 集成了断路器

④ 集成了Spring Cloud DiscoveryClient

⑤ 支持请求频率限制(Rate Limit

⑥ 支持重写Path

2SCG VS zuul

Zuul 基于servlet,需要依赖servlet容器,使用BIO模式,不支持如websocket之类的长链接。BIO连接数量大的时候,性能消耗大。

SCG通过使用netty+webflux,使用NIO模式。

3SCG核心

1Route

规则,一个request进来,predicate决定当前route是否匹配。

1URL决定跳转的路径

包括nfilter

2) Filter

基于filter chain(责任链模式) 模式

根据代码写法分pre&post两种形式

Pre  我在转发之前做一些东西;

Post 发完请求,得到response后做一些事情;

可以修改requst response

4、SCG整体架构

主要是玩儿Route filter

5、Predicates

SCG Predicates 是用工厂模式实现的,内置好多默认工厂类;

6、Gateway Filter

可以去官网查看

 

Gateway Filter是针对一个RouteGlobal Filter是全局的。

LoadBalancerClientFilter 选择一个服务具体的instance,改写,进入

NettyRoutingFilter做真正的转发。

7、SCG负载均衡

1)过程

① 通过DiscoveryClient 获取所有service列表

② DiscoveryClientRouteDefinitionLocator根据列表生成按path为service名为path的route,并且该route使用lb://XX 作为uri

③ LoadBalancerClientFilter 根据LoadBalancerClient选择结果来改写request uri

2)定义Route

两种形式可以定义Route

一种是:通过配置文件

 

这个配置了可以帮助我们生成一系列的route.

另外一种是:通过编程的形式去配

8Filter顺序

Prepost执行顺序相反。

9、令牌限流

令牌以恒定速度放入令牌,如果桶放满就不再放入,访问需要消耗令牌,没有令牌拒绝访问。

如果放入令牌的速度比消费快,桶满了,如果突然来一个大促,最高峰值就是桶的令牌数量。

 

Spring Cloud Gateway - Redis rate limiter

• redis-rate-limiter.replenishRate 每秒放入令牌的速度

• redis-rate-limiter.burstCapacity 桶大小

• redis-rate-limiter.requestedTokens 每次消耗多少token(基本不用)

问题:限流可以只限制某些API接口吗?

可以,使用Route实现

Lunix压测

abapache自带的压力测试工具。ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试。比如nginxtomcatIIS等。

ab -c 10 -n 100 http://a.ilanni.com/index

-c10表示并发用户数为10

-n100表示请求总数为100

10、自定义GlobleFilter

通过Predicates 选择RouteRoute下面的Filter GlobalFilter 混在一起,然后排序执行。

实现步骤:①实现GlobleFilter接口,并注入自身;

          ②决定pre/post类型

三、重要源码解析

NettyRoutingFilter

真正的发送请求去TargetService

蓝绿发布和金丝雀发布怎么选择?

蓝绿发布:一刀切,测试没有问题切过去;

金丝雀发布:先发布一小部分,如果没有问题再都切过去;

Weight Route Predicate Factory

通过配置可以配置流量比例;

 

 

 

 

 

 

 

 

 

posted @ 2021-05-14 13:50  majingyun  阅读(680)  评论(0编辑  收藏  举报