限流,有个现成的开源项目可以帮助我们来做网关上的限流

用最新的这个版本

在pom.xml加入引用。

在限流的过程中需要存一些信息,可以存在数据库里 也可以存在redis里。这里我们演示存到数据库里
比如说配置1分钟内只能有100个请求。那么当前已经有多少个请求过去了 ,这个是需要记下来的,下一个请求来了 ,把保存的信息再拿出来,然后再去看当前这个请求能不能过。所以需要有存储。在生产上还是用redis。redis的并发能力比数据库要高很多。
这里为了看到数据用数据库

数据库相关的配置复制过来。

改下名字

下面来做限流相关的配置。


这里也可以缓冲层redis

配置的时候,可以针对这些服务来限流,例如针对token服务,或者针对order服务。

这里是针对所有的请求的默认策略

plicy-list就是针对 某个服务去单独的限流。

下面配置了针对token的限流规则

order没有配置,所以按照默认的规则

每个规则下都有四个属性
refresh-interval:规定时间的窗口,写1 就是1秒之内可以过多少请求。
limit就是可以过的请求数
quota:这些请求加在一起消耗的时间是多少
下面这样配置起来就是 1秒之内只能有2个请求。然后这两个请求的处理时间加起来不能超过1秒。
虽然你请求的次数没超限,但是你的服务压力大导致你的服务处理慢的时候,他也会给你把流量限制住。就是这样一个策略
z

type是根据什么去控制流量。

最简单的就是根据-url来控制流量

例如 发两个请求,a的话 1秒内只能有两个请求,b也是1秒内只能有2个请求。就是这个意思。

如果发一个/user的请求 同样的路径,get和post请求意思是不一样的,get是查询,post是创建。

这样就需要这个type:-httpmethod来判断了。这样就会把这两个参数的值混在一起。

同样是/a的请求 get和post是分别流控。单独记1秒内过了多少请求。

还有其他的type 例如 -user根据用户来流控,需要security的支持,一般情况下 不会用。为什么不用,后面再说。

origin,根据ip。每个ip在一秒钟只能只能发2个请求。这些是可以组合起来交叉用的 。

最终会根据配置生成一个key放到数据库中。只需要做配置就可以完成流控,大部分情况下不用写代码

最终我们用这个默认的

之前在授权的时候50%的几率不过,这里改成true 每次都过

重新启动网关

连续多点击几次。

429就是请求太多了。我们配置的限流是3秒内只能有2个。

扩展点

数据库内多了个rate的表

rate_key按照一定规则来生成的。
gateway是网关的名字
order是策略的名字
/orders:POST是请求的路径和方法

特殊的场景,和业务业管的 可能满足不了 需求。
例如 优惠券的服务,在使用优惠券的时候,有优惠券的类型。券a的业务处理逻辑比较简单 一秒钟可以处理100个。券b的业务逻辑复杂每秒只能处理10个。这时候在同一个服务里面 也就是这个 优惠券的服务里面
需要通过优惠券的类型来决定怎么限流。这个时候上面那种原始的限流就满足不了  需求了。


限流归根揭底是你那个key怎么生成的
下面例如 这里配置的是url和mehtod来限流,那么生成的就是根据url和method的生成的key

自己来定义生成的规则,让这个key生成的时候,可以按照请求中的某一个参数来生成这个key

它的构造函数有两个参数,我们在子类里面写上构造函数 也是需要两个参数,并在构造函数内调用父类的构造函数。super()

覆盖掉它的key方法。request是请求,route是zuul的路由,policy就是配置的策略。

 
有了这三个参数,就可以在这里 写自己的生成key的逻辑,自己来做限流

另外一个可扩展

就是错误的处理。默认情况下只要限流生效。就是返回429并返回一些错误信息。

在有些情况下 我们需要去做一些记录。有可能被人攻击了。如果什么都不做 后面就查不到谁攻击的
继承DefaultRateLimitErrorHandler


里面有三个方法。上面两个是跟限流的数据存取相关。限流的数据要存到数据库里。然后每个请求进来的时候,拿出来根据规则看这个请求能不能过。
handleSaveError就是往存储里面去存这个限流的当前信息的时候如果报错怎么处理。
handleFetch就是从数据库里面读出来的时候报错怎么处理。一般情况下 上面两个方法 不会去覆盖它

主要就是handleError这个方法。这个是限流过程中发生了错误都会到之类来处理。
可以覆盖这个方法 自己写日志等处理

注意

在网关上做限流是有一些问题的
第一:就是耦合的问题,例如优惠券类型的问题,如果后面服务的业务逻辑变了。那么网关的规则也也要改变。网关就要重新部署。例如优惠券的类型 多了一个类型。

应该做到 业务逻辑怎么变,网关不能跟着变,

限流的重量问题。限流只处理从网关进来的请求,不处理微服务之间的请求。

所以在网关这里不要做很细粒度的限流。网关这块做的是争对硬件设备的限流。

限流这里的配置类型 有user和role。根据用户和角色做限流,这些最好不要在网关上做。虽然是可以做。但是最好不在网关上去做。
因为这些东西都涉及到业务。一旦你的业务变化,网关也要跟着变。这个是很麻烦的事

网关上的限流就讲这些。

结束

Spring cloud微服务安全实战-4-11Zuul网关安全开发(四)的更多相关文章

  1. 《Spring Cloud微服务 入门 实战与进阶》

    很少在周末发文,还是由于昨晚刚收到实体书,还是耐不住性子马上发文了. 一年前,耗时半年多的时间,写出了我的第一本书<Spring Cloud微服务-全栈技术与案例解析>. 时至今日,一年的 ...

  2. Spring Cloud微服务安全实战_00_前言

    一.前言: 一直以来对服务安全都很感兴趣,所以就学习.这是学习immoc的 jojo老师的 <Spring Cloud微服务安全实战课程>的笔记,讲的很好. 课程简介:  二.最终形成的架 ...

  3. Spring cloud微服务安全实战_汇总

    Spring cloud微服务安全实战 https://coding.imooc.com/class/chapter/379.html#Anchor Spring Cloud微服务安全实战-1-1 课 ...

  4. Spring cloud微服务安全实战-4-9Zuul网关安全开发(二)

    把在微服务里面写的安全的相关逻辑挪到网关里面来.这样把安全逻辑和业务逻辑解耦开.那么这些问题就都解决了. 先来看下之前的安全的代码,首先在之类做了认证,认证服务器去认证,拿这个token去换用户信息. ...

  5. Spring cloud微服务安全实战-4-8Zuul网关安全开发(一)

    安全相关的代码和业务逻辑相关的代码实际上是在一个应用里面的,在这个应用里面,我们需要去,这个应用本身的处理逻辑里面需要去处理令牌和用户信息之间的转换. 然后我们需要去知道认证服务器的地址,这些都是耦合 ...

  6. Spring Cloud微服务安全实战_4-5_搭建OAuth2资源服务器

    上一篇搭建了一个OAuth2认证服务器,可以生成token,这篇来改造下之前的订单微服务,使其能够认这个token令牌. 本篇针对订单服务要做三件事: 1,要让他知道自己是资源服务器,他知道这件事后, ...

  7. Spring Cloud微服务安全实战_4-3_订单微服务&价格微服务

    实现一个场景: 订单微服务: POM: <?xml version="1.0" encoding="UTF-8"?> <project xml ...

  8. Spring cloud微服务安全实战 最新完整教程

    课程资料获取链接:点击这里 采用流行的微服务架构开发,应用程序访问安全将会面临更多更复杂的挑战,尤其是开发者最关心的三大问题:认证授权.可用性.可视化.本课程从简单的API安全入手,过渡到复杂的微服务 ...

  9. Spring cloud微服务安全实战-6-8sentinel限流实战

    阿里2018年开源的. 简单来说就是干三件事,最终的结果就是保证你的服务可用,不会崩掉.保证服务高可用. 流控 先从最简单的场景来入手. 1.引用一个依赖, 2,声明一个资源. 3.声明一个规则 注意 ...

  10. Spring cloud微服务安全实战-6-4权限控制改造

    授权,权限的控制 令牌里的scope包含fly就有权限访问.根据Oauth的scope来做权限控制, 要让@PreAuthorize生效,就要在启动类里面写一个注解. 里面有一个属性叫做,就是在方法的 ...

随机推荐

  1. vetur 和 npm run lint 格式化不一致

    vetur 的 template(html) 默认使用的格式化插件是 prettyhtml,虽然可以选 prettier,和 npm run lint 的格式化保持一致,但是有时候会影响到 scrip ...

  2. C++左移运算符重载

    函数定义期望 通过cout<<对象,打印出复数的实部和虚部,这样一来,就需要重载cout类的位移<<运算函数,但是我们并不能拿到cout源码,在visual studio我们看 ...

  3. Dominating Patterns (AC 自动鸡模版题, 出现次数最多的子串)

    传送门 题意: 给你n个模式串, 再给你一个 文本串,问模式串在文本串中出现次数最多是多少. 出现次数最多的模式串有哪些. 解: 模版题. #include <bits/stdc++.h> ...

  4. PHP 鸟哥:我也曾经是“不适合”编程的人

    网名:雪候鸟,大家尊称鸟哥,惠新宸 @Laruence, 是国内最有影响力的 PHP 技术专家,PHP 开发组核心成员,PECL 开发者,Zend 公司外聘顾问.他曾供职于雅虎,百度,现在新浪微博任平 ...

  5. codevs 4028 EZ系列

    4028 EZ系列之愤怒的一天   题目描述 Description 有一天,在某某教学楼某某课室某某课桌旁,某某某大声尖叫起来. 在那一瞬间,勇敢的丁畅大大站了出来,向某某某讨好,结果被揍得半死. ...

  6. spark,hadoop集群安装注意

    安装步骤严格参看厦门大学数据实验室教程 Spark 2.0分布式集群环境搭建(Python版) 安装Hadoop并搭建好Hadoop集群环境 遇到的问题 1.ubuntu 安装后升级.python是3 ...

  7. AtCoder Grand Contest 006 题解

    传送门 \(A\) 咕咕 const int N=105; char s[N],t[N];int n; inline bool eq(R int k){fp(i,1,k)if(s[n-k+i]!=t[ ...

  8. 超炫酷的 Docker 终端 UI lazydocker

    A simple terminal UI for both docker and docker-compose, written in Go with the gocui library. https ...

  9. 读取中文文件到CString

      CString strFileName = _T("D:\\ai\\100.json"); CFile file; file.Open(strFileName, CFile:: ...

  10. 第12组 Alpha冲刺(1/6)

    Header 队名:To Be Done 组长博客 作业博客 团队项目进行情况 燃尽图(组内共享) 展示Git当日代码/文档签入记录(组内共享) 注: 由于GitHub的免费范围内对多人开发存在较多限 ...