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 5,Project Reactor, Spring Boot 2.0
Project Reactor 流的形式
② 可根据任意request的属性进行路由匹配
③ 集成了断路器
④ 集成了Spring Cloud DiscoveryClient
⑤ 支持请求频率限制(Rate Limit)
⑥ 支持重写Path
2、SCG VS zuul
Zuul 基于servlet,需要依赖servlet容器,使用BIO模式,不支持如websocket之类的长链接。BIO连接数量大的时候,性能消耗大。
SCG通过使用netty+webflux,使用NIO模式。
3、SCG核心
1)Route
规则,一个request进来,predicate决定当前route是否匹配。
1个URL决定跳转的路径
包括n个filter
2) Filter
基于filter chain(责任链模式) 模式
根据代码写法分pre&post两种形式
Pre 我在转发之前做一些东西;
Post 发完请求,得到response后做一些事情;
可以修改requst 和response;
4、SCG整体架构
主要是玩儿Route 和 filter
5、Predicates
SCG 的Predicates 是用工厂模式实现的,内置好多默认工厂类;
6、Gateway Filter
可以去官网查看
Gateway Filter是针对一个Route,Global 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.
另外一种是:通过编程的形式去配
8、Filter顺序
Pre和post执行顺序相反。
9、令牌限流
令牌以恒定速度放入令牌,如果桶放满就不再放入,访问需要消耗令牌,没有令牌拒绝访问。
如果放入令牌的速度比消费快,桶满了,如果突然来一个大促,最高峰值就是桶的令牌数量。
Spring Cloud Gateway - Redis rate limiter
• redis-rate-limiter.replenishRate 每秒放入令牌的速度
• redis-rate-limiter.burstCapacity 桶大小
• redis-rate-limiter.requestedTokens 每次消耗多少token(基本不用)
问题:限流可以只限制某些API接口吗?
可以,使用Route实现
Lunix压测
ab是apache自带的压力测试工具。ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试。比如nginx、tomcat、IIS等。
ab -c 10 -n 100 http://a.ilanni.com/index
-c10表示并发用户数为10
-n100表示请求总数为100
10、自定义GlobleFilter
通过Predicates 选择Route,Route下面的Filter 和GlobalFilter 混在一起,然后排序执行。
实现步骤:①实现GlobleFilter接口,并注入自身;
②决定pre/post类型
三、重要源码解析
NettyRoutingFilter
真正的发送请求去TargetService
蓝绿发布和金丝雀发布怎么选择?
蓝绿发布:一刀切,测试没有问题切过去;
金丝雀发布:先发布一小部分,如果没有问题再都切过去;
Weight Route Predicate Factory
通过配置可以配置流量比例;