风也温柔

计算机科学知识库

令牌桶算法 java实现 Spring Cloud Gateway微服务网关教程

  配套资源:

  网盘链接:/s/dJw

  提取码:mzo1

  配套视频:

  一、 【前言】API 网关1 什么是API网关

  API网关作用就是把各个服务对外提供的API汇聚起来,让外界看起来是一个统一的接口。同时也可在网关中提供额外的功能。

  总结:网关就是所有项目的一个统一入口。

  令牌桶算法 java实现_java 令牌桶算法_令牌桶算法 java实现

  2 网关组成

  网关 = 路由转发 + 过滤器(编写额外功能)

  2.1 路由转发

  接收外界请求,通过网关的路由转发,转发到后端的服务上。

  如果只有这个一个功能看起来和之前学习的Nginx反向代理服务器很像,外界访问nginx,由nginx做负载均衡,后把请求转发到对应服务器上。

  2.2 过滤器

  网关非常重要的功能就是过滤器。

  过滤器中默认提供了25内置功能还自持额外的自定义功能。

  对于我们来说比较常用的功能有网关的容错、限流以及请求及相应的额外处理。

  3 Cloud中提供的网关解决方案3.1 Cloud Zuul

  属于 Cloud 下一个组件,具有灵活、简单的特点。在早期 Cloud中使用的比较多。

  其版本更新都依赖于 Zuul。

  3.2 Cloud

  由 自己推出的网关产品,完全依赖自家产品。符合战略意义令牌桶算法 java实现,其更新版本等都由自己把控。

  目前很多项目中都是使用替代Zuul。

  在本套课程中讲解的也是

  二、 Cloud 介绍1 简介

   Cloud 是 Cloud 的二级子项目,提供了微服务网关功能,包含:权限安全、监控/指标等功能。

  2 名词解释

  在学习时里面有一些名词需要提前了解,这对于后面的学习是很有帮助的。

  2.1 Route

  Route中文称为路由,里面的Route是主要学习内容,一个项目可以包含多个Route。

  一个路由包含ID、URI、集合、集合。

  在Route中ID是自定的,URI就是一个地址。剩下的和学习明白了,Route就学习清楚了。

  2.2

  中文:谓词。

  谓词时学习比较重要的一点,简单点理解谓词就是一些附加条件和内容。

  2.3

  所有生效的都是的实例。在运行过程中负责在代理服务“之前”或“之后”去做一些事情。

  2.4 流程

  java 令牌桶算法_令牌桶算法 java实现_令牌桶算法 java实现

  2.4.1 流程文字解释

  网关客户端访问网关中 对请求URL进行处理。处理完成后交换Web ,Web 会被进行过滤。中前半部分代码是处理请求的代码。处理完成后调用真实被代理的服务。被代理服务响应结果,结果会被中后半部分代码进行操作,操作完成后把结果返回给Web ,在返回给 ,最终响应给客户端。

  三、 入门案例1 准备内容1.1

  因为依赖,需要从中获取真实代理项目地址后,在进行访问。

  所以需要准备一个 (示例中是非集群),端口设置为8761。

  2 新建项目

  一个普通的 项目,重点关注应用程序名和控制器即可,其他代码省略。

  2.1 配置文件

  :

  :name: demo-one

  2.2 控制器

  令牌桶算法 java实现_令牌桶算法 java实现_java 令牌桶算法

  3 新建项目.1 编写pom.xml

  java 令牌桶算法_令牌桶算法 java实现_令牌桶算法 java实现

  3.2 新建配置文件

  谓词中Path一般会给每个项目前面起一个无意义的别名。

  如 Path = /abc/** 当看到abc是知道路由转发到项目abc,后面的内容才是真实要访问abc的内容

  如Path=/jqk/** 表示需要转发到jqk项目。

  要明白:uri中第一部分就是为了防止各个项目中出现重名路径导致路由转发失败。

  java 令牌桶算法_令牌桶算法 java实现_令牌桶算法 java实现

  3.3 新建启动器

  新建com.bjsxt.

  令牌桶算法 java实现_java 令牌桶算法_令牌桶算法 java实现

  4 访问测试

  访问项目。

  :9000/demo/one

  页面会显示

  通过结果可以看出,用户虽然访问的网关项目,但是最后真是访问的是项目中/one 控制器

  5 修改配置参数

  修改项目中配置文件的路由参数,把的值由1改成0后,重启项目

  : =0

  再次访问:9000/demo/one会发现

  令牌桶算法 java实现_java 令牌桶算法_令牌桶算法 java实现

  四、 谓词

  谓词:当满足条件在进行路由转发。

  在 Cloud 中谓词实现接口。其中类名符合:tory,其中XXX就是在配置文件中谓词名称。在上面示例中Path=/demo/** 实际上使用的就是ctory

  令牌桶算法 java实现_令牌桶算法 java实现_java 令牌桶算法

  所有的谓词都设置在属性中,当设置多个谓词时取逻辑与条件,且一个谓词只能设置一组条件,如果需要有个多条件,添加多个相同谓词。

  1 .1 设置必须包含的参数名。

  下面两种写法等效。都表示路径满足/demo/**同时包含参数abc。

  Path和Query是谓词。abc是请求参数名称。

  在浏览器中输入::9000/demo/one?abc=jqk

  : Path=/demo/**,Query=abc

  :

  - Path=/demo/** - Query=abc

  1.2 设置参数的值

  abc请求参数名称。jqk. 是abc的值,是一个正则表达式。在正则表达式中点(.)表示匹配任意一个字符。所以当请求参数abc=jqka或abc=jqkw能满足谓词条件。

  在谓词中赋值使用逗号(,)赋值因为Query后面已经有等号,在值内容中在出现等号语法说不过去了。

  :

  - Path=/demo/** - Query=abc,jqk.

  2

  表示请求头中必须包含的内容。

  注意:

  参数名和参数值之间依然使用逗号

  参数值要使用正则表达式

  如果只有一个值表示请求头中必须包含的参数。如果有两个值,第一个表示请求头必须包含的参数名,第二个表示请求头参数对应值。

  :

  - Path=/demo/** - Query=abc,jqk+ - =,keep-alive

  如果设定请求头中需要包含多个参数及值。设置多个。在此处演示多个相同谓词配置,其他谓词中就不在强调可以配置多个谓词。

  :

  - Path=/demo/** - Query=abc,jqk+ - =,keep-alive - =Cache-,max-age=0

  3

  表示请求方式。支持多个值,使用逗号分隔,多个值之间为or条件。

  :

  - Path=/demo/** - =GET,POST

  4

  允许访问的客户端地址。

  要注意使用127.0.0.1而不要使用。

  :

  - Path=/demo/** - =127.0.0.1

  5 Host

  匹配请求参数中Host参数的值。满足Ant模式(之前在 中学习过)可以使用

  ? 匹配一个字符

  * 匹配0个或多个字符

  ** 匹配0个或多个目录

  :

  - Path=/demo/** - Host=127.0.0.1:9000

  6

  要求请求中包含指定名和满足特定正则要求的值。

  必须有两个值,第一个包含的参数名,第二个表示参数对应的值,正则表达式。不支持一个参数写法。

  :

  - Path=/demo/* - =age,.

  7

  在指定时间点之前

  :

  - Path=/demo/** - =2020-01-31T18:00:00.000+08:00[Asia/]

  8 After

  在指定时间点之前

  :

  - Path=/demo/** - After=2020-01-31T18:00:00.000+08:00[Asia/]

  9

  请求时必须在设定的时间范围内容,才进行路由转发。

  注意:时间的格式

  :

  - Path=/demo/** - =2020-01-31T18:00:00.000+08:00[Asia/], 2020-02-01T00:00:00.000+08:00[Asia/]

  10

  多版本服务发布的时候,偶尔使用。v1.0+v1.1两个版本同时发布服务。内容一致,实现机制不同。发布两个不同命名的服务集群。使用做负载均衡。

  负载均衡中权重。同一个组中URI进行负载均衡。

  语法:=组名,负载均衡权重

  在中注册两个服务,这个服务(项目)是相同的,应用程序名分别叫做demo-one和demo-two。

  在路由匹配时demo-one将占20%,demo-two将占80%

  java 令牌桶算法_令牌桶算法 java实现_令牌桶算法 java实现

  五、

  作用:在路由转发到代理服务之前和代理服务返回结果之后额外做的事情。执行了说明谓词条件通过了。

  在 Cloud 的路由中分为:

  内置,都是实现类

  自定义

  1 内置

  之前使用就是内置,所有内置都实现接口。使用时属性中过滤器名为ory的类对应的名称为XXX。

  当过滤器包含参数

  令牌桶算法 java实现_令牌桶算法 java实现_java 令牌桶算法

  下面所有基本都是支持单个值,如果需要设置多个,需要写多个对应

  1.1

  添加请求头参数,参数和值之间使用逗号分隔

  :

  - =1 - =,jqk

  1.2

  添加请求表单参数,多个参数需要有多个过滤器。

  :

  - =1 - =name,bjsxt - =age,123

  1.3

  添加响应头

  1.4

  对指定响应头去重复。

  语法:=响应头参数 响应头参数,

  可选参数可取值:

   默认值,保留第一个

   保留最后一个

   保留唯一的,出现重复的属性值,会保留一个。例如有两个My:bbb的属性,最后会只留一个。

  - =My -Type,

  1.5

  实现熔断时使用,支持和两种

  1.6

  可以添加降级时的异常信息

  1.7

  匹配所有前缀满足条件的URI

  1.8

  限流过滤器。

  1.9

  重定向。有两个参数,和url。其中应该300系列重定向状态码

  1.10

  删除请求头参数

  1.11

  删除响应头参数

  1.12 er

  删除请求参数

  1.13

  重写请求路径

  1.14 r

  重写响应头参数

  1.15

  如果项目中使用 和 整合时,此属性特别重要

  1.16

  具有权限验证时,建议的头信息内容。

  1.17

  功能和有点类似。语法更贴近

  当前请求路径为/red/blue时会将/blue发送给下游。

  令牌桶算法 java实现_令牌桶算法 java实现_java 令牌桶算法

  1.18

  替换请求参数头数。不是添加

  1.19

  替换响应头参数

  1.20

  设置响应状态码

  1.21

  跳过路由uri中前几段后发送给下游

  1.22 Retry

  设置重试次数

  1.23

  请求最大大小。包含参数,可以有单位“KB”或“MB”默认为“B”

  1.24

  修改请求体内容

  1.25

  修改响应体

  六、 使用实现限流

  可以利用中实现限流。

  1 常见的限流算法1.1 计数器算法

  以QPS(每秒查询率-per-)为100举例。

  从第一个请求开始计时。每个请求让计数器加一。当到达100以后,其他的请求都拒绝。

  如果1秒钟内前200ms请求数量已经到达了100,后面800ms中500次请求都被拒绝了,这种情况称为“突刺现象”

  1.2 漏桶算法

  漏桶算法可以解决突刺现象。

  和生活中漏桶一样,有一个水桶,下面有一个”漏眼”往出漏水,不管桶里有多少水,漏水的速率都是一样的。但是既然是一个桶,桶里装的水都是有上限的。当到达了上限新进来的水就装不了(主要出现在突然倒进来大量水的情况)。

  令牌桶算法 java实现_java 令牌桶算法_令牌桶算法 java实现

  1.3 令牌桶算法

  令牌桶算法可以说是对漏桶算法的一种改进。

  在桶中放令牌,请求获取令牌后才能继续执行。如果桶中没有令牌,请求可以选择进行等待或者直接拒绝。

  由于桶中令牌是按照一定速率放置的,所以可以一定程度解决突发访问。如果桶中令牌最多有100个,qps最大为100

  令牌桶算法 java实现_令牌桶算法 java实现_java 令牌桶算法

  2 中限流

  是基于Redis和Lua脚本实现的令牌桶算法。

  2.1 添加依赖

  java 令牌桶算法_令牌桶算法 java实现_令牌桶算法 java实现

  2.2 编写配置文件

  新建配置文件.yml。

  参数说明:

  key-: 使用SpEL获取容器中实例。

  :每秒放入令牌的数量。

  :容量

  令牌桶算法 java实现_java 令牌桶算法_令牌桶算法 java实现

  2.3 新建实例

  新建.。

  just()方法参数表示根据什么进行限流。实例中是根据主机名进行限流。参数值影响Redis中key中红色部分。

  令牌桶算法 java实现_令牌桶算法 java实现_java 令牌桶算法

  2.4 新建启动类

  令牌桶算法 java实现_java 令牌桶算法_令牌桶算法 java实现

  2.5 使用测试

  会发现前3个请求是成功的,后面很多失败的令牌桶算法 java实现,1秒后的请求是成功了。

  七、 使用实现服务降级

   Cloud 可以利用实现服务降级等功能。

  当进行路由转发时,如果发现下游服务连接超时允许进行服务降级。

  实现原理:当连接超时时,使用自己的一个降级接口返回托底数据令牌桶算法 java实现 Spring Cloud Gateway微服务网关教程,保证程序继续运行。

  1 添加依赖

  在中额外添加

  org..-cloud---

  2 新建控制器

  新建com.bjsxt..添加降级控制器方法,方法中根据需求编写自己的逻辑。

  @

   class {@("/")@ (){ "托底数据";}}

  2 修改配置文件

  在配置文件中属性添加。

  其中args.name 取值是任意的,最终会被设置为的。但是不能省略,省略会导致org..cloud.....的为null,因为没有设置的等内容时就没有执行的构造方法。

  令牌桶算法 java实现_java 令牌桶算法_令牌桶算法 java实现

  令牌桶算法 java实现_令牌桶算法 java实现_java 令牌桶算法

  八、

  全局过滤器不需要工厂,也不需要配置,直接对所有的路由都生效。

  可以使用实现统一的权限验证、日志记录等希望对所有代理的项目都生效的内容都可以配置在全局过滤器中。

  且在项目中可以配置多个的实现类。都可以自动执行

  java 令牌桶算法_令牌桶算法 java实现_令牌桶算法 java实现

  九、 自定义

  可以定义针对于的。

  注意:

  1. 类名必须叫做ory.注入到容器后使用时的名称就叫做XXX。

  2. 类必须继承

  3. 所有需要传递进来的参数都配置到当前类的内部类中

  1 新建类

  java 令牌桶算法_令牌桶算法 java实现_令牌桶算法 java实现

  2 在配置文件中配置

  .name : 过滤器的名称。

  .args.name 为.配置的属性。

  java 令牌桶算法_令牌桶算法 java实现_令牌桶算法 java实现

  文章来源:https://zhuanlan.zhihu.com/p/327686172