00:01
前面我们介绍使用了注册中心和配置中心,那在分布式开发中呢,我们还需要一个API网关,它扮演着至关重要的作用。举一个例子,我们后台管理系统呢,要经常给商品服务等各个服务来发送请求,我们现在想要做一个商品的增删改查,那我们发请求呢,就需要知道我们商品服务所在的地址。假设我们写了一个一号机器的1万端口,那一号机器掉线了以后呢?难道我们要在前端系统里边又把它改成二号机器的1万端口?关键我们这个商品服务可能十几台机器同时上线,某一个用不了,还要动态的能切换到一个能用的状态,我们不可能天天去我们的后台管理系统代码里边来改我们各个服务所在的端口,这样编写呢,太麻烦了,那我们希望呢,后台管理系统以后给任何服务发送的请求都先经过网关,网关帮我们动态的路由的各个服务,而且网关呢,也能从注册中心中实时的感知某一个。
01:01
的服务上线还是下线,总是能帮我们把请求正确的路由到指定位置,这是我们说的第一种需求,那第二种需求,每一个请求过来呢,可能后期我们要给它加上权限,我们要健全,包括呢我们要监控等等,那我们去每一个服务都要做这事儿,我们如果我们把这些功能写在各个服务上,那这样就出现了很多重复开发,那我们呢,就可以让我们的这个客户端不去来直接请求各个服务,让各个服务来做这些事情,比如健全限流日志输出,那我们让客户端呢,比如我们的后台管理系统浏览器先来请求我们的API网关,我由我们的网关呢代转给其他服务,那我们可以在网关层将这些统一的功能进行处理。那我们呢,就使用spring cloud为我们提供的get外组件来做网关功能,那网关呢,是所有请求流量的一个入口,在我们网关呢,我们经常会做一些路由的转发权限校验、限流控制等等各种功能,而且我们这个spring cloud get外这个网关是我们spring cloud官方推出的,相当于第二代网关框架,我们以前呢,大家可能使用过spring cloud的这个zoo网关,这个zoo网关呢还是Netflix公司为我们提供的,但是呢,由于种种原因,Z2.0版本还没有被应用到spring cloud里边,Spring cloud官方呢也自己来做了一个网关叫gety。
02:28
而且它也拥有非常优秀的设计以及强悍的性能,比如呢,网上就有一个简单的这个测试,在spring cloud get外,它每秒呢大概能处理3万多的请求,而zoo网关这一块测试的应该是zoo的第一代产品,Zoo的第二代产品也是性能很高的,当然在zoo的第一代产品呢,只有2万多的请求,包括呢非常流行的linkor这个网关,它也只有两万八的每秒请求处理速率。
03:00
那学习我们spring cloud getway呢,大家全部以我们官方文档为准,我们搜索spring cloud getway可以来到它的官方,我们在这learn里边来主要找到它的这个稳定发布版,我们点到它的文档进行学习,而我们以前zoo网关组件都是spring cloud Netflix旗下的,大家可以去Netflix旗下学习zoo相关的东西。那我们现在呢,主要来说getway官方文档这一块呢,也对它做了简要介绍,我们这个spring cloud get外,它是来构建一个API网关的,它呢拥有非常多的特性,比如呢,它是使用SPRING5框架构建的,支持我们SPRING5最新的响应式编程,包括能无缝整合spring boot2.0,那么spring cloud get呢,它还支持我们使用任何的请求属性来进行路由匹配,也就是功能强大呗,然后呢,每一种路由还会有自己独特的。这种断言规。
04:00
则以及过滤器等等支持,当然这些东西我们用了才能知道,包括它能无缝整合hycentricx。来做熔熔断,包括整合我们服务注册发现要做负载均衡以及完成路径重写请求速率限制等等功能,包括我们呢,即使去来编写spring cloud get外,里边的这些断言以及过滤器也会非常简单。当然还是那句话,它拥有这么多优秀的功能特性,我们只有在用完以后才能体会到这一块呢。还有官方的一大段快速示例代码,那我们就来详细的来看官方文档到底该怎么使用spring cloud getway。好,我们点击single HTML,那要使用spring cloud get y呢,我们首先得了解一下它的几个基本概念,在grocery章节,首先我们看这么三大概念,第一个叫root,就是我们说的路由,那路由呢,顾名思义就是呢,我们发一个请求给网关,那我们网关呢,要将这个请求路由到指定的我们这些服务或者指定的地址,那这个路由呢,就包含几个重要的东西,首先呢,有一个标识性的ID,也就是每一种路由跟路由之间是用这个ID来进行区分,还有一个目的地的uri,也就是我们当次请求到底要路由去哪,我们得有一个指定的地址,还有collection,这就是集合,还有我们这个断言的集合,断言是什么意思?还有我们这个过滤器的集合,那过滤器是什么意思?那我们下边呢,都有说,那简而言之就是一句话。
05:41
我们这个路由啊,只要匹配了这个断言,我们这个断言为帧,我们这个路由就匹配了,就能到达指定位置,也就是说我们请求发给API网关,到底要不要路由到某一个地方,我们得有一个条件判断,这个条件判断就叫断言,那断言又是什么呢?我们可以来看一下,它呢,其实是我们JAVA8里边的这个断言函数,在我们网关里边的这些断言呢,就是允许我们这些开发人员去来匹配当次请求的任何信息,比如我们请求头或者请求参数,诶那简单来说可是这样子的,我请求发过来发给网关,我网关呢,可能会根据你的请求参参数,请求头等各种信息的不同,我来判断你到底要路由到哪个服务,那我们这个判断呢,就叫断言,只要我们这个判断成功了,比如按照你的请求路径判断成功了。
06:41
我去这,那我们断言成功,我们就路由到指定位置,当然想路由到这个指定位置,我们这还多了一个叫filter这个概念,这个呢就是我们说的过滤器,那过滤器呢,就是我们这块说的spring框架里边提供的这个网关过滤器这些组件,这过滤器的功能,那跟我们以前理解的过滤器肯定都是一样了,请求过来我们先要过滤,诶那到达以后呢,请求再要抵达回来,那还要过滤,就像官方文档说的,诶在我们这个过滤器里边呢,我们这些请求或者这些响应啊,都可以被修改。
07:19
在我们请求抵达目标之前,或者呢,在我们请求啊到达完成这个响应之后,这都能进行处理,那整个他的工作流程呢,其实是这样的,我们有一个客户端想要呢,发请求给我们目标服务,那我们中间呢,加了一层API网关,我们这个网关呢,就是拿这个get外做的,那它的流程呢,是客户端先将请求发给我们网关,也就是我们的spring cloud get外,那这个get外呢,通过它里边的handler map,相当于我们这些映射信息,来看一下我们当前请求能否被路由或者被处理,如果能被处理的话呢,它就会交给这些handleler处理器,那处理器呢,要处理给这些请求就会经过一系列的filter,那当我们这个处理器处理结束了以后呢,我们就会把这个请求路由给指定的服务,我们这一系列filter处理结束。
08:20
住以后就路由给指定服务,那指定服务处理完了,还是这一系列再返回过来,最终再返回给我们客户端,这是这么一个流程。这个流程呢,结合这三个概念,其实总结起来就是一句话,当我们请求到达网关,网关先利用断言来判定我们这次请求是否是不是符合某个路由规则,如果符合了,就按这个路由规则把它路由到指定地方,但要去这些指定地方,就要经过一系列的filter进行过滤。
09:00
大家掌握这个核心流程,那我们spring cloud getway这个网关用起来就非常简单了。那么其实它最终的所有难点都集中在我们该如何定义一些路由规则,包括这些断言是怎么判定成功失败,我们该怎么配置或者怎么写,包括我们要使用哪些filter,我们得自己心里清楚。而且呢,其实我们spring cloud getway里边到底能怎么用断言,有多少种断言规则,包括有多少种filter,官方文档也写的非常清楚,我们可以一直往上翻看目录这一块。这里呢,就给我们说明了,我们这个路由的这个断岩工厂,也就是说它有这么多种断盐,断盐的作用呢,就是只要满足了我们指定的这个条件,那我们就给你去路由到指定的位置,这是断言,包括能有多少种filter,在这一块呢也写的非常清楚。
10:01
其实呢,听这些名字我们可能大概就有点感觉,比如这有一个filter叫and request header filter,那它的作用呢,就是添加请求头的。那也就是可能是当我们请求一过来,来到网关的时候,在抵达目标服务之前,网关给他添加一个我们指定的请求头。那来到我们目标服务,我们目标服务就能获取到我们网关刚填的这些请求图了,包括还有各种其他的filter,那我们来编写网关相关的代码之前呢,我们可以先看一个非常简单的配置事例,比如呢,我们来点进来。我们网关呢,最终你可以写在配置文件里边,配置各种网关的规则,其实呢,就这么几大块配置,第一个我们会看到spring cloud get外,那这就是配置cloud网关的,网关里边呢,有一个东西叫roots,诶一天加了个S,这叫路由规则,所有的路由规则呢,都能写在这儿,所以说呢,我们在压面中配置先是一个杠杠呢,右边这一堆,那其实是一个完整的对象,这都是雅马尔的语法,那到底有多少种路由规则我们都可以在这写,那路由规则呢,就是一个数组,这儿呢只有一个示例,我们可以继续往下写,继续往下写,那我们就来看一下这个示例,每一种路由规则呢,首先都得有一个ID,就是呢,当前路由规则的一个名字,不跟别人重复就行了,那这个uri的意思就是我们想要去哪个地方,我们看到呢,这又有一个叫predict。
11:43
这叫断言杠。这种写法又是一个数组,也就是我们可以满足很多的断言,断言的意思就是只有我们下边的东西条件判断成功了,我们才给你路由到指定地方。那我们这个事例是什么意思呢?我们能看到这是一个叫afterroot predict factory,这是一个叫什么之后的这个断言工厂,它的作用是什么?官方文档都说的非常清楚,说这个工厂它需要一个参数,这个参数呢是一个时间,然后呢,这个断言就是用来匹配当前请求,是不是在我们指定的这个时间之后,每发一个请求呢,都有一个时间,你在我指定的时间之后发的,那相当于满足了我这个判断,我才给你去这个地方,这其实呢,就是一个简单的配置实例,那我们想要看更多的这些实例,每一种断言规则的这些配置样例在官方文档都有,包括我们过滤规则,我们都可以看,我们往下翻,比如呢,我们就看刚才的and request header来看它是怎么用的。
12:54
还是这段配置spring cloud get外,我们要配置路由规则,我们现在呢,只配了第一种路由规则,给它呢,随便起了一个名字,但是这一块呢,没有写断言,那就是任何请求一上来都给你路由到这个地方,那路由到这个地方呢,要经过这些filter,要经过哪些filter?我们看到filters下边呢,写了一个杠,又是一堆数组,经过哪个filter呢?这是我们当前的filter的名字,相当于他把filter的名字给这一写,要经过这个filter,然后呢,这又写了这两个参数,什么意思,文档也说的非常清楚,这两个参数呢,是一个name y6名值对这个名值对的作用,举一个例子,我们写了一个X request for,把它呢,将会添加这么一个请求头,那请求头的名就是它,值就是它。
13:50
这个呢,就是我们spring cloud get一些最基本的简单用法,那我们下一节课呢,就来创建这个网关,我们来测试一下。
我来说两句