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

用最新的这个版本

在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. 神经网络(8)---如何求神经网络的参数:cost function的表达

    两种分类问题: binary & multi-class 下面的是两种类型的分类问题(一种是binary classification,一种是multi-class classificatio ...

  2. ASP.NET MVC 5 入门-2控制器、路由

    一.创建项目: 上起始页,选择新项目. 在中新的项目对话框中,右侧语言类别选择C# ,然后项目类型选择Web,然后选择ASP.NET Web 应用程序 (.NET Framework) 项目模板. 将 ...

  3. python之钉钉机器人zabbix报警

    转自:https://blog.51cto.com/m51cto/2051945 首先在钉钉群聊里添加一个自定义的机器人 并复制webhook的内容 https://oapi.dingtalk.com ...

  4. The 2018 ACM-ICPC CCPC 宁夏 A-Maximum Element In A Stack

    题意 对一个栈有入栈和出栈两种操作,求每次操作后栈的最大值的异或. 题目链接 分析 类似于单调栈,但是还没有那么复杂. 只需保持栈顶为最大值,如果入栈元素小于栈顶元素,则重复一次栈顶元素入栈:否则,直 ...

  5. php自定义函数之匿名函数

    所谓匿名,就是没有名字. 匿名函数,也就是没有函数名的函数.直线电机参数 匿名函数的第一种用法,直接把赋数赋值给变量,调用变量即为调用函数. 匿名函数的写法比较灵活. 1.变量函数式的匿名函数 < ...

  6. 《挑战30天C++入门极限》新手入门:C++中堆内存(heap)的概念和操作方法

        新手入门:C++中堆内存(heap)的概念和操作方法 堆内存是什么呢? 我们知道在c/c++中定义的数组大小必需要事先定义好,他们通常是分配在静态内存空间或者是在栈内存空间内的,但是在实际工作 ...

  7. centos安装浏览器【备份】

    chrome(谷歌)  添加源:sudo wget http://repo.fdzh.org/chrome/google-chrome-mirrors.repo -P /etc/yum.repos.d ...

  8. SQL题(子文章)(持续更新)

    -----> 总文章 入口 文章目录 [-----> 总文章 入口](https://blog.csdn.net/qq_37214567/article/details/90174445) ...

  9. Vue编程基础

    一.依赖环境搭建: 添加镜像 # 安装好node.js后,使用淘宝镜像 npm install -g cnpm --registry=https://registry.npm.taobao.org 项 ...

  10. ubuntu18.04 首次登录mysql未设置密码或忘记密码解决方法

    1.首先输入以下指令: sudo cat /etc/mysql/debian.cnf运行截图如下: 2. 再输入以下指令: mysql -u debian-sys-maint -p//注意! //这条 ...