好,同学们,刚刚我们学习了 nice 的一种负载均衡的规则, nice 它可以做到集群优先的负载均衡。 不过呢,我们部署的时候啊,可能会存在这么一种情况,因为企业里服务器设备啊,会更新迭代,有一些机器呢,性能比较好,还有一些呀,属于是祖传设备了,那性能啊, 非常的差,可以说是老弱病残。这个时候呢,我们肯定是希望这些性能好的机器,他承担更多的用户请求,而那些性能差一点的,自然是承担少一点的请求,正所谓能者多劳吗? 但是我们目前看来, nx 柱做到的是集群优先而后坐,随机,当用 请求来了以后,他可不管你是性能好的还是差的,是这个身强力壮的还是老弱病残,拉过来啊,就一顿造。那这个时候,那些个性能差的肯定就会出问题了。 那么我们该怎样去控制不同服务他的一个请求量呢?哎,奈克斯呢,给我们提供了一个权重的配置,通过修改服务实力的权重可以控制访问频率,权重越大,访问到的频率就越高, 那我们就可以把性能好的机器权重式的大一点,性能差的机器呢,权重式的小一点,那么该怎么来配呢?我们的 ppt 上呀,给出了这样一个案例,比方说我们在这里在控制台找到实力列表,点击编辑,而后就可以 去修改权重了,比如说我把他值修改到零点一,那么这样呢,他的权重就变得很小了啊,因为权重值呢,一般是配零到一之间的。那么下边呢,我们就按照这个呢去试一下。来,我们找到 nico 控制台,打开浏览器, 我们刷新服务列表,可以看到呢,目前有一个 offerris, 他在杭州集群, 还有一个是 ufosusus, 里边有八零八幺和八零八二,都在杭州集群,上海集群,这个我们就不管了。现在呢,八零八幺,八零八二的默认权重值都是一,所以他们权重是一样的,被访问到的概率也是一样的。 现在假设八零八幺啊是一个,哎,祖传机器性能啊,有点差了,那么八零八二 性能较好的机器,我们呢,给八零八幺的权重降低一点,我们给他调到零点一试一下, 好确定。那现在呢,他俩的权重比呢?就是一,呃,就是十比一了,那理论上讲啊,八零八幺被否认到的概率就会是这个八零八二的十分之一。下边呢,我们继续做一个测试,我提前已经把 id 二控制台的日志清空了, 我们呢通过浏览器去做一下测试,我在这呢刷个十次或者二十次,我们来看一看啊,来,一二三四五六七八九十十一,十二,十三,十四,十五,十六十七十八十九,二十。 来,我们找到 id 控制台看一看,八零八幺被访问了一次,两 两次,八零八二啊,无数次,怎么样?总共二十次,八零八幺分了两次,是不是十比一啊?所以从这个角度来讲,我们的 权重配置确实是生效了吧,他能够做到啊,根据你的权重大小来分配用户请求,权重越高,用户请求 频率也就会越高,那么我们来试一试啊。我们回到浏览器控制台,我们找到奶口,如果把权重调成零会怎样呢?同学们,来,我们试一下, 我们把这改成零,然后点击确定下边呢,我们再一次去做一个测试啊,哎,不过四十之前,我们先将控制台清空一下,我们回答 id 二控制台,把八零一 控制台清空,八一八控制台清空,然后我们再次回到浏览器去做一个测试,打开这个访问页面,刷新实测, 好十次了,我们现在回到爱迪尔控制台查看一下,我们发现八零八二也非常多次,然后再来看八零八幺,一次都没有。 同学们,也就是说权重调成零时,他压根就不会被访问,哎,这有什么作用啊?大家想想, 那同学们,在我们以前一个服务,我们想要对他做一个版本的升级,我们得怎么办?我们是不是要把它重启啊?但是你光天化日之下,你去重启一个服务器, 你好意思吗?你的用户都还在访问呢,你一重启,别人访问不了,哎,你这服务怎么挂了?这就有问题了 对不对?所以说呢,我们是不能随便去重启了,往往呀,每次版本升级都是搞的跟这个什么迭战片一样,要找一个月黑风高无人之夜是吧?然后等用户都下线了,我们偷偷的把服务停机,然后呢去做版本的一个升级, 但是你想看,如果我现在有了这个权重,我可不可以这么做呢?我有多个服务器,八零八幺,八零八二,八零八三,我先将八零八幺这个服务的权重调成零,然后呢, 大白天也没事啊,这个时候呢,渐渐的八零八幺是不是不承担用户请求了?那这个时候我对他做停机,用户会有感知吗?没有吧, 那么这个时候我对八零八幺停机完了以后,我去做一些这个版本的升级,升级完成以后我再重启,我给他权重啊,先别着急调太大,我调小一点,调个零点多,零点零一什么之类的。这个时候呢,我们放出 少数用户进来做个测试,看看行不行?如果没什么问题,我们是不是就可以逐渐扩大比例,依次升级?这个时候用户是无感知的,你可以做到平滑升级 啊,非常优雅。那么这样呢,这种升级方式啊,其实就是比较呃比较顺滑的一种升级方式了啊,你就不用去大半夜去加班着去搞了,对不对? 好,所以呢,这是我们这个呃权重啊,它的一些作用啊。那我们回到 ppt 啊,来做一个 总结。那么奈克斯控制台啊,可以设置实力的权重值,一般是在零到一之间设置成小数, 而当我们的集群内多个视力权重不同时,权重越高的被防的频率呢,也就越高。而如果你把权重调成零,则这个服务压根就不会被访问。好,那么这节课的内容就到这里。
粉丝7.8万获赞29.3万

好的,同学们了解了网关的基本作用,这节课我们就来动手搭建一个网关。那网关呢,是一个独立的服务,因此搭建网关要做的第一件事情就是去创建一个全新的 model, 然后做一个独立的服务。 那在这个服务当中啊,他需要引入两个依赖。第一个呢是网关的 statter 依赖,也就是自动装配,那这里边会为我们提供网关的各种各样的功能。 第二个依赖呢,是 nice 的服务发现依赖。因为网关本身也是个微服务啊,他也需要把自己注册的 nice 或者从 nice 上拉去服务,所以必须得有这样一个服务注册发现的依赖。 好,这是第一步要做的事情。那不废话,我们先把这两个动作做一下啊,来,我们打开。第二, 现在呢,我们在这里去新建一个模块啊,在这新建 model, 然后选择 next, 这里我们起名为 get v finish。 好,创建完了以后,我们在这里边去引入依赖。按照刚才 ppt 总所说,我们需要引入两个依赖,第一个呢是 next 服务发现依赖, 当然这个不分先后啊,你先引谁都可以,我们先引服务发现吧。好,我们放大一点啊,这个是我们服务发现的依赖,我们写一下吧。 好,那么第二个表演呢,是网关依赖 spring cloud 干,嗯, get v star。 哎,看到了吗?最后一个 stat gt v 啊,来走走,好,打包。那这样呢,网关的两个依赖我们就引完了。 那当然,我们知道一个服务要想启动,他还需要闷函数吧,所以我们在下面给网关创建一个闷函数啊,我们新建一个类报名,还是 cn 点 it cost 好,那么其中类的名称呢?我们就叫 gateway uplay k 神。好,那么下边我们把它放大在这儿呢,我们第一要加 spring both 的 k 神,第二还需要编写闷函数,然后在这里通过 spring application 点儿一个 run, 通过 ktv app 的 k 神点克拉斯和阿克斯来传餐。那同学们网关的搭建就成功了。好, 那接下来我们要做什么呢?同学们,思考一下。我们的网关功能有很多,包括我们之前聊到过的身份的认证,还有请求的路由,还有请求的限流等等, 而其中最基本的功能就是陆游了,所以呢,我们接下来要做的事情就是在网关里实现一个请求的陆游。那怎么去做这个请求陆游呢?我们回到 ppt 来看一下啊, 好,那么请求陆游是通过配置来实现的,大家来看一下这个配置文件啊,在这配置文件里,我们第一步要配的呢是服务的端口,还有服务的名称,还有 nice 的地址。 同学们,这些配置其实是让我们的网关能够联系上 nicos, 实现服务注册和发现。 那么接下来才是网关的路由配置。网关路由配置呢,叫 get, 为 rose, rose 顾名思义就是路由,那加了 s 代表的就是有多个路由规则,所以这个地方是数组啊,可以配好多,比方说来这样杠, 这就是一个,那大家可以看到这个路由力,我先定义了一个 id, id 是路由的唯一标识,每一个路由规则都应该有自己的 id 啊,确保他唯一啊,不重复啊, 只要不重复,你就可以随便定义啊,比方说我这有点杠。 siris, 这就是我一个 id, 那路由除了 id 以外,还会有第二个配置,叫 uriuri, 是陆游的目标地址。那有两种写法啊,大家可以看到上面这种 被我注视掉的这个 http 什么什么的,这个他呢是像一个具体的 ip 和端口进行陆游, 那也就是把路由地址直接写死,那么将来全都往这个地址去发,这种呢,我们一般不去使用啊。而第二种路由规则呢,是下边这种, l b, you the service, l b 是一个单词的缩写,哪个单词呢? load balance, 那这个单词大家应该认识吧?复载均衡,它就是告诉我们的 ktv 这里,你这个转发的时候啊,你在做漏油的时候,你要做复载均衡啊, 那后面跟上的是个服务名,那因此网关要怎么做呀?是不是应该拿这个服务名去有瑞卡里找到服务列表啊,而后去做复载均衡,实现 请求漏油,是这样一个过程啊,好,那当前这个配置的意思就是 我要把请求陆游到用户服务啊,就这么个意思。那问题来了,我把什么样的请求陆游到 用户服务呢?你得有一个规则吧。所以第三个配置就来了,叫 predicate, predicate, 那么这里又加了个 s, 而且这里 predict 是什么东西? 那大家肯定不认识这个单词,对不对?我们通过有道词典来翻译一下啊, pride 给他呢,我这里查了一下,同学们可以看到他的意思啊,非常的诡异啊,叫谓语,谓语得有点像我们的一种语法的表示,是吧?什么名词动词, 什么喂鱼什么之类的。那如果说呀,大家这样来翻译,你肯定是越整越糊涂, 因为一些英文单词在不同的场合下要有不同的翻译。作为计算机领域,我们应该把翻译成断言, 大家来看啊,专业示意里边啊,计算机科学里边是吧?翻译成叫断言,数学当中也是如此。断言,那断言好像听起来也是有点奇怪,是吧?什么叫断言啊?就是断定的意思,那我们去搜索一下来,我们打开浏览器, 而这里呢,我已经百度百科搜好了一下,大家来看一下断言的意思啊。断言,百度百科的介绍是是一种变成术语,它表示为一些不耳表达式,所以断言是一种不耳表达。 是,那就是判断处或 pos 成立或不成立。好,我们回到 ppt 这个地方的断言,其实也就是一种判断,判断你的请求是否符合,那如果符合, 那我将来就会把你路由到 u 的 suris, 如果你不符合,那不好意思,我就不管你了,那你就看找别的路由去。那比方说下边这一列 杠就是其中一种漏油规则 plus 等于 uzer 杠星星这个漏油规则 pass。 漏油规则代表的含义是什么呢?就是只要你的路径是以 uzer 开头,那么就算你符合规则了, 我就会给你代理到 uzer service 服务区,明白这意思吧?哎,这个就是一套路由规则,里面包含三部分,路由 id、 路由的目标地址和路由的断言。好了,那我们下边就不废话,照这个去试一试呗。我们打开第二, 在这里新建一个 file, apple k 盛典 m, 这里呢,我们要配上服务端口,那么就按 ppt 吧,这写了幺零幺零,对吧?然后是服务名称, 比如说我们就叫 gateway, 二是 nacos 地址, local host, 八八四八。 然后呢,就轮到陆游了,陆游呢,叫 ktv 肉丝, 肉丝这个单词啊,就是陆游啊,好,那有很多很多陆游,对不对?那我们要多个要用杠啊,代表数组嘛,或者集合 路由里要配三个东西,第一是 id 唯一标识,比如说我就叫 uss, 好,这是路由标识, 好,必须唯一啊。而第二个呢,是陆游的目标地址 u r i。 这个地址我们可以写死,具体 ip 也可以写服务名称。那我们建议大家都写服务名称啊,写服务名称时,前面就不是 i g d p 了,而是 l b 代表 load balance。 后边跟上 这个 ip 地址啊,哎,服务名称就可以了,后边跟上服务名称就可以了,比如说 user 四维斯啊,啊,这是陆游的目标地址。 最后呢,我们还要加上一个断言,判断一下这个请求是否符合规则,如果符合规则,那我们就让 让他代理到 u 的 suris 去。所以我们来一个普瑞贝克斯, 其实就是判断请求是否符合规则啊。好,那么断言也可以有很多个,其中我们要写的是一个叫 pass 的断言, 这个断言后边跟上什么呢?你的判断规范,比如说杠 uzer 杠星星。这句话的意思就是啊,这是路径断言啊, 判断路径是否是以杠 user 开头啊,如果是,则符合规则, 那么就会代理到这个 u s 区了。好,漏油,规则就定义完成了。那同学们,我想问问大 大家,如果我现在还想代理一下 oder service, 漏油一道 older service, 我该怎么写?同学们,你们来说,我来写怎么做 id 后边呢? order service 吧,哎,当然,这个可以随便写。然后呢, u r i, 来也,来啥呀? l b, 当然,你这写 a gdp 可不可以啊? 没问题吧?好,然后呢? order service, 这里一定要写服务名称啊,好,然后呢? pedicus pedicus 后边跟上 又是一个杠八 plus, 等于什么?等于 out 吧! 啊?杠星星,那就以凹的打头,按照这个规则吧,非常好。同学们,好,那么到这呢,我们就写好了路由规则了,那不废话,咱们试一试吧,来,能找到网关直接启动。 然后呢,我们来访问一下这个幺零零幺零啊,同学们,好,幺零零幺零,访问到他以后,我后边跟上一个地址,对吧?比如说杠 user user 啊,杠一打回车, 同学们看,成功的查到了 uz 一的这样一个数据啊,那你会注意的是,我们的网关是没有做任何业务逻辑的对不对?但是我却能查到用户信息, 其实这就是把请求从网关路由到了有点的微服,那刚才我们还编写了 oder 的,也就是说你现在去访问 oder, 应该效果是一样的吧, 看是不是也没问题。好的,那我们回到 ppt 啊,这个路由我们就讲完了,刚才在整个路由的过程中,到底发生了什么呢?这里呢,我们给大家画了个流程图, 大家看,这是我们的服务,我们有两个 uzer service, 一个 out service, 还有一个 nice 注册中心,还有网关,我们微服务呢,都会去注册到 nice 注册中心。这个时候用户发起了这样一个请求,幺零零幺零杠一或者杠一, 那因为你的端口访问是幺零零幺零,而我们的网关恰好是这个端口,所以这个请求一定会进入网关,而网关呢,又无法处理这个业务,所以他只能 是基于路由规则去做判断。而我们刚刚定义了两个路由规则吧,哪两个呢?一个是把 uzer 请求开头的路径代理到 uzer service, 一个是把 ouder 开头的路径代理到 ouder service, 那么这个符合哪一条呢? 显然是符合第一条吧,这一条,所以呢,那按照这个, 我们就应该把请求代理到 uzer service, 那下一步网关自然就会拿着 uzir service 去注册中心里找到对应的地址,是吧?然后去做复载均衡,去挑一个,比方说挑到了八零八二,那么这个请求自然就会发到八零八二去了, 那么整个流程就完成。最后呢,我们来做一个总结。网关搭建的一个步骤呢,还是比较简单, 第一步呢就创建一个全新的项目,引入 nicos 和给的未依赖。第二步呢,稍显复杂,主要就是配置服务信息, led 地址,还有路由地址。配置路由的时候啊,东西有点多,但是总结下来主要有这么几点,第一是 vid, 一定要保证不重复。第二呢是路由的目标可以支持固定地址和负载均衡。 第三呢是这个断言,断言是一种规则的判断,符合请求规则了,我就给你转发到对应的服务,不符合你就去找别的路由去。 好,我们刚才的演示中啊,只有这三个对不对?但其实在路由东还可以再配一个东西,叫过滤器, 过滤器可以对进入的请求或者是进入到的响应做一些处理。那么这个呢?我们就会在后续课程中去学习了。好,那我们这节课就到这里。

好,同学们,接下来我们就开始第一章啊, next 配置管理的一个学习,在这一章当中啊,我们会了解一下什么是统一配置管理,以及啊为什么需要这个东西和怎么样去用。 然后呢,我们会了解一下同一配置管理当中啊,怎么样去实现配置的热更新,还有不同微服务之间,微服务不同环境之间的配置如何共享。最后啊,我们会带大家去搭建一个生产环境可用的 nice 集群啊, 好的,这就是我们这一张的一个内容了,下面我们就进入第一部分啊,统一配置管理的一个使用啊, 好,那什么是统一配置管理呢?我们先来回顾一下目前为止我们的微服务结构,在昨天的学习当中啊,我们搭建了两个微服务,每个微服务里的业务啊,都 不需要去完成数据购物查询,并且呢,我们服务之间还会有一个相互调用,而要完成相互调用呢,我们的做法是让服务注册到注册中心, 然后消费者呢就可以从这个中心里完成服务的发现,实现这个服务获取和负载均衡,完成远程调用。 那么随着我们的微服务越来越多,我们在生产环境中啊,可能会达到哎,数十上百甚至上千台服务器的这种情况。 这个时候同学们想象一下这么一个问题啊,我现在的一个配置文件需要去做一些修改,而这个配置文件呢,可能啊跟我们的数十个为服务都有关系。同学们,那这个时候我是 是得逐个微服务的去调整这个配置啊,是不是很麻烦?第二,我调整完了配置以后,这些个关联的服务是不是都得重启啊? 那么在生产环境下,一个服务重启带来的这个影响还是挺大的吧,所以说呢,我们的需求是什么?哎,我们希望啊,这些个配置文件能够实现一种统一的管理, 比如说我现在有数十个服务的配置需要修改,我不需要逐个去修改,而是在一个地方完成这个感动就行了。 并且呢,改动完了以后,我希望啊,这个服务不用去做重启,这些配置就立马能够生效,这就叫配置的热更新。而要实现它怎么才能做到呢?哎, 我们就需要一个配置管理的服务,这个服务的作用是什么呢?他上面会去记录我们微服务中的一些核心的配置啊,放到上面去,那么 我们的微服务启动的时候,就可以去读取它上面的配置,再和本地的配置结合,作为完整配置去使用了。 将来呢,这些个核心配置如果说要发生一些修改,我们呢,不用去逐个服务改动,而是找到这个配置管理的服务在它上面啊,把需要变化的配置给它改一改, 我们的配置管理服务啊,非常的智能啊,他发现改动了以后,他会立即去通知我们的,为服务说,哎,瞧一瞧,看一看了啊,我这配置变了啊,那么 这个时候我一听说,哎呦,配置变了,新的来了,是吧?我们赶紧去吧,干什么去啊?完成配置的读取,并且后续还能完成配置的热更新,也就是不用重启自动声效,你看看这样一来,我们的需求是不是就达到了 啊?当然了,在我们今天要讲的时候呢,我们用的是 nicos 的配置管理啊,而我们知道呀, nicos 呢,他已经有注册中心功能了吧, 所以呢,我们的配置管理也好,注册中心也好,同时都是由 nikes 去实现的,所以我们将来为付出的发现是去找他,然后我们做配置的一个读取还是去找他? 当然了,你说我们公司里财大气粗,我整了两套 nice 集群,一套用来做注册发现,一套用来做配置管理,行不行?没问题啊,没毛病啊 老铁对吧,你有钱你说了算,你想弄多少我都无所谓啊,都是可以的啊。好的,那么我们就不废话,下边呢,一起演示一下如何由 nice 来完成配置的管理, 那么我们一起来找到浏览器,打开 nice 控制台,在这呢,我们以前玩的是这个服务管理吧,下边呢,我们来玩一玩配置管理,在这有个配置列表,点进来以后可以发现这里是空的,什么都没有。这个时候呢,我们需要去添加配置,交给 nice 去做管理,我们点击这个加号, 他会弹出一个表单啊,在这个填写表单的过程中,我把它放大一点,方便拿下来看。 那么这呢,第一个要填写的叫 data id, data id 呢,其实就是配置文件的名称, 但是你注意了,这个名字,你不能像咱们 id 二里边都起叫 application yam, 因为你叫这个的话就有一个问题了呀, 将来我们所有的微服务都来找 nicos 管理,大家都叫这个名字,那不就冲突了吗?所以呢,我们 data id 必须得唯一啊,不能冲突,那怎么办呢? 同学们,微服的名称是不冲突的吧,所以呢, data id 的命运方式一般是这样子的,第一部分,服务名称,比方说 user 三维斯,这是我的服务名称。第二部分,同学们注意了, 第二部分我们称之为叫 profile。 profile 是什么? profile 就是我们当前这个项目的运行环境。在学习 surpentbook 的时候,我们讲过多环境配置切换,咱们是不是有 dv test, p l o d 不同环境啊?那么所以呢,这个地方的环境啊,我们可以根据自己的这个需求去体验,比方说开发环境就第一位就行了。 最后呢,是后缀名,后缀名我们一般是写 y m l 嘛,但 y m l 是叫做简称,呃,那么它的全称叫 y a m l y a m l em, 对吧?那么我们的 nicos 呢,支持 yam 和 propris 这两种格式啊,常用格式,但我们这里肯定选择 yam。 那么这个地方的后置名呢,不建议大家写 y m l, 我们写 y a m l 这个全称啊,因为这里写的是 y m l 嘛。好了,这样服务名称啊,或者说叫 dait, id 就定下来了啊。 那么配置文件名称确定了以后呢,分组这一块,我们一般就不用去动他了啊,就默认就行了。这秒 数呢,就是你介绍介绍你这个配置文件是干什么的,对吧?那这里比方说有点思维思的,呃,开发环境配置文件就行了。然后呢,在这呢,去填写配置文件的内容。配置文件内容怎么填呢? 是不是说我把 idair 当中以前写在 apple k 盛典眼膜中的所有内容全部粘过来就行了? 哎,不是这样啊,同学们,你可不要这样滥用 nice 啊, nice 是配置管理,那么将来这些配置是不是来做热更新的这些配置啊?那你想想看啊,是不是所有的配置都有这样的需求啊? 显然不是吧,你像你的数据户地址,一般情况下是不用去变的吧?还有很多的配置啊,都不需要去变。那需要变的是什么需要变的呢?都是一些 开关类型的一些配置啊。什么叫开关类型的?比方说我给了出,他按照 a 业务逻辑处理,我给了 faws 按照 b 业务逻辑处理 啊,比如说我们这个,呃,一个什么样一个活动,这个活动开启或不开启,哎,这不就行了吗?像这种类型的,你要做热更新就可以用它来做了。比如说,我这里还有一种情况啊,是一些这种呃模板类型的,比方说我这里有一个叫呃 pattern pass, 不就模板吗?我这有一个是模板,叫 day for mark deaf mark, 是不是这个日期格式模板的意思?那么我在这里,日期格式模板我现在定义成 yyy 杠 mm 杠 ddhhmmss, 但是比如说我在生产过程中,我,我想改一下,我不想用这个,我想改成年月日,行不行?那这是不是就是有热更新需求的了?哎,这就 举个例子来讲啊,所以大家切记,这里边不是把 apple k 盛典夜猫中的一切配置都挪过来啊,只是有热更新需求的挪过来。好的,那么我们现在呢,点击发布这个配置可就发布成功了, 看到吗?那现在我们点击返回,是不是已经得到了这样的一个配置了?好,那么点击详情还可以查看呢,没问题吧? 好,那么现在呢,我们已经完成了配置的统一管理了,同学们注意了啊,这只是第一步,把配置交给 nicos 去做管理,至于 微服务该怎么样读取这个配置,我们会在下一节课中来学习。那么好,大家跟我一起来看一下,我们总共做了几件事啊,回顾一下,第一件事,我们 是在 nice 中啊,点击配置列表,在这点击加号。第二件事呢,在弹出的表单当中啊,我们填写了服务的 data id, 也就是配种件名称。配种件名称有三部分组成,服务名称 profile, 也就环境和后缀名 分组这个不用管,然后描述可以随便填。 em 呢,是我们的文件格式,一般情况下我们都选他 这里边呢,填写内容,注意内容不要填写 app 使用的一切配置,而是核心的啊,将来会有变化的这些配置。好的,那么这节课内容就到这里。

好,同学们,接下来我们就进入第二章的学习啊,在这一章里,我们会学习一个新的 http 客户端, 我们会先了解一下 ready 的存在的问题,而后用 fand 去替代我们的 resty 的。 当然我们还会了解一下粪当中的一些自定义的一个配置,以及使用时的一些性能优化。 最后我们还会学习分他在企业当中一种最佳实践方案。好了,我们不废话,开始第一部分的学习, 了解一下 resty 他呀他的问题。我们先来看一段 resty 的请求,这个请求 是通过 usl 地址指明要访问的服务名称,还有请求路径以及请求的参数信息,请求方式 合法一致类型,而后由 reddowe 帮我们向这个指定地址发起请求,再把结果转成对应类型的。那么这个代码已经是在日本的基础上做了优化的了,但是呢,他依然存在一些问题。 第一个问题呢,是代码的可读性差,变成了体验呢?还不统一这段代码呀,他是一个 htv 请求的代码,又有 ur 路径,又有复杂的请求方式。那么对于一个从来没接触过远程调用的同学来讲,这个代码 完全可以说是天书,根本看不懂。而且我们正常写代码都是在写方法,这里突然冒出来一个 url, 他的编程体验来讲的话也不够统一,这是他的 第一个问题啊。而第二个问题呢,是我们有的时候会有一些参数比较复杂的 uir, 如果用这种方式来讲,他根本就难以维护。有多复杂呢?我举个例子,比方说打开浏览器看一下我们以前对奈克斯的访问, 大家不陌生吧,我们在那个时候的时候可以看到脑袋上有这么一串 ur 路径,你说这个东西它复杂不?大概有七八个参数吧,你再来看一下百度,百度里边你去搜索一个东西,比如我搜一个加吧,你看看这参数有多恐怖。 同学们,这样的参数你也在加瓦代码中去维护起来,你觉得现实吗?将来参数一旦变化,你得怎么改代码呀?所以 以啊,这种代码,这种方式,他不够优雅,就是刚才说的这几点 好,那么因此呢,我们下边就会学习一种更加优雅的方式啊,谁啊?分分呢?是一个声明式的 hdp 客户端。 什么叫生命事,这个大家应该不陌生吧,我们以前在学习事物的时候已经接触过这个概念了,早期事我们怎么做的呀?是不是手动自己去开启事物,提交事物呀?那简直就是灾难。 后来有了什么东西啊? surry, surry 的声明是事物,只需要你简单的在配置文件里告诉 surry 我要对谁家事物把规则定义好,行了,不用你管了 后,所有的事物都有 surry 帮你做。那么声明是 http 客户端也是如此。你不是要发 htv 请求吗? 发起来不好发呀,那怎么办?你把发请求所需要的信息声明出来,剩下的事你别管了,由粪帮你来做,这就是粪的作用, 帮助我们优雅的实现 app 请求的发送,解决前面提出的问题。 好,那具体怎么来做呢?我们不废话,看一看,第一步呢,我们需要引入一个依赖,这个依赖一看名字就知道了,属于一个斯巴特嘛,显然是自动装配,这里面的各种配置都有, superme 帮我们做好了,第二步呢 是加注解,注解就是开关开启自动装配的相关功能。好,那第三步我们就要开始做声明了。声明?什么声明?一个远程叫用,怎么声明呢?大家来看,这里是定义了一个接口叫 uriclant, 那么这个接口里边将来封装的就是所有对 uzizz 发起的远程调用,因此呢,在他的上边这个接口上面加了一个注解, 叫做 flant fland 客户端,并且啊,指明了服务的名称再往下呢。哎,有没有觉得这个东西很眼熟啊, 像不像我们以前写的卡出乐中的注解啊?没错,就是如此,这正是 是分,为了减少大家的学习成本啊。哎,他默认采用了 stylemc 的注解来去声明。声明什么声明了?请求的方式是 get 请求路径式杠 u 字 id, 请求参数是这个 id 路径找一幅返回指示啊 u 字, 那么也就是我们刚刚提到的服务名称,请用法律进行路径,请求参数和返回者类型。为什么分在声明时需要声明?这些信息 我们不是说了吗,分是声明式客户端,你只要把发 htv 请求所需要的信息写出来,你就不用管了。我们来看一看,原来发一个 ab 请求需要什么信息? 这是不是服名称?这是不是 usb 录音?这是不是请求参数?这是不是请求方式? 这是返回者类型?也就是说发一个 app 请求需要的信息恰好就是这五个信息,而这信息我们的线通过声明客户端的方式是不是声明出来了, 那不就好了吗,以后你就不用管了,你以后干嘛拿这个接口调这个方法就可以了,下边呢,我们就动手来试一试。我们打开 id, 找到我们的 alt sose。 第一步,找到他的依赖, 然后呢,我们在这里需要添加一个呢,呃, open fen 的依赖吧,粪扣段依赖。 注意这烟的名字名称叫 surpro 的。呃, fans wat 啊,看清楚了吧,这个名字啊,别搞错了, steat five, 大家还是 cv 啊。第二步呢,是开启自动装配功能,我们需要找到启动类添加注解,叫 alibo flax。 好,这个就是自动装配的开关了。第三步,我们就要来编写客户端做接口声明了,我们起个名字就叫克拉斯,叫 uriclant, 是一个接口。好的,那这个接口 他的脑袋上面需要加一个注解叫 flant, 并且指定服务名称是 uzi so 维斯,因为将来发送 ab 请求时需要知道服务名称,看到吧,所以把这个视频出来。 而后呢,我们在这里定一个方法,方法的返回值就是将来你想要的结果,所以叫悠字。方法 名称随便,比如说就叫范的吧, id 也是没问题的。方法参数不能乱写,参数就是将来你这里要传的参数显然是用户的 id, 那么这里呢,就是浪类型,叫 id。 而后我们在上面需要加上一个注解声明请求的方式,请求方式呢,是 get, 可以看到这里,所以我这是 get 买品。然后是请求的路径,请求路径呢,是 u 字开头加 id, 所以呢,这里是杠, u 字,后边呢,路径占位幅,因为这个东西是可变的,对吧? 那既然上面有陆军战役服了,下边是不是也要声明啊?所以加上一个 pass vivo, 然后加上 id 来去声明就行了,那么到这整个接口的声明就写好了。好,那客户端写完了以后啊,我们接下来就可以去使用这个客户端了吧, 来替代我们之前写的 resty 的,我们找到奥特斯维斯,这是我们之前写的代码啊,那我们把它给住掉。好吧,这不要了, resty 他也不要了,我们现在呢,重新来做这个代码改造了。这个代码完全不用 啊,我们现在改成用什么了?是不是用粪来远程调用啊?当然你得先把刚才写的客户端注进来, 叫 u z clant, 把这个接口注册进来啊。那我下边呢?我要实现人家用,我就用这个接口调这个三 n 八 id 的方法就行了。我把这个凹字里边的 一屋子 id 传给他,然后大家看防御值。走,你直接就是一屋子。同学们,代码到这 写完了,你自己对比一下看一下啊,哪个优雅?是不是这个 编程体验是不是很统一?这还是在调方法?这又是调方法?有没有看到什么?有 il? 根本没有吧。我不说你甚至于都不知道他是远程调用,你就以为我调借口中的方法,但把可读性是不是变得也很好? 好,所以我们之前所讲到的那个 red, 他的问题是迎刃而解了,非常优雅。 那将来有的说,如果有像百度那样超级复杂的 ul, 那怎么办?很简单呀,我们的份扣端是基于注解的形式来去写参数的。那你有几个参数,我就在这加几个方法列表不就好了吗?哎,将来 维护起来是不是也非常的方便呀,那别废话呀,咱试一试吧,来找到奥特曼 k 神启动一下, 轻松过程中我们却把日志清空啊,好,然后呢,我们打开浏览器去做一个测试,然后杠凹的杠幺零幺, 我们多刷两次,一次两次三四五六七八九十,好,全部都能成功吧,同学们。然后我们回到 id, 我们来看下八零八幺八零八二,这俩微服务是不是都被访问到了,说明我们不仅仅实现了远程调用,而且还实现了负载均衡,我们的粪非常的强大,他的内部已经集成了负载均衡的功能。哎,粪是怎么做到的呢? 我们打开泡沫文件,我们来看下,这是粪的依赖吧,我们这里看一下,这个是粪在粪的内部, 这是粪的核心。以来点开可以看到里边带上了谁啊?瑞本。所以呢,粪已经集成了瑞本,自动实现了四海均衡,根本不用我们去操心了。 好,到这先那个快速入门,我们就讲完了,我们来回答 ppt, 来做一个最后的总结啊, 我们用粪来代替 red, 使用方式非常的简单,第一步就是引入一个粪的起步依赖,第二个呢,是加一个雷博注解做一个开关。第三呢,是编写粪的接口,而这个接口的编写呢,没有新的东西啊,全都是我们 spamic 的注解, 来去声明请求方式,请求路径,请求参数,防御之类型就可以了。第四呢,我们用线接口去调方法的形式,代替 red 的那种 ul 的方式,那么编程方编程的体验更加的统一啊,更加的优雅。好了,这节课内容就讲到这里。

好,同学们,刚刚我们就完成了拉库斯的安装,下边呢,我们就可以尝试着在拉库斯里完成服务注册和发现了。不过在这之前,我们先来看一下 supreme 的官方网站,我们打开浏览器, 在 supreme clo 的这个组件当中啊,他又分成了很多的模块,其中啊,有一个非常重要的模块叫 supreme clue 的抠门,那这个模块既然叫抠门,就是通用的意思。其实啊,在他里边主要是定义接口规范的,比方说他里边啊,就定义了 d s 卡维克烂的也就是服务发现以及 sorry siri gasch 服务注册的借口。 那么因此呢,不管是有瑞卡也好,还是我们的耐克斯也好,他只要是做服务注册发现都会遵循这些接口。 那么我们在使用耐克斯或有瑞卡时,我们的服务提供者和消费者的代码是不用做什么变化的, 那变化的东西是什么呢?哎,第一呢,我们所要引用的依赖会改变,以前引有瑞卡,现在是不是该引奈克斯的客户端依赖了?第二呢,是服务地址,以前的地址配的是有瑞卡地址,现在改成配奈克斯地址就 ok 了。 所以呢,大家就能够想象我们等一会要做哪些动作了吧。下面呢,我们回到 ppt 来看一看, 我们要去完成服务注册和发现。第一,要改依赖,那么改依赖时呢,我们会先改副工程的依赖, 我们把 surpring clol 的阿里巴巴的管理依赖引进来以后,他有关的所有版本我们就不用再操心了。第二呢,我们 需要注调原来有瑞卡的依赖,添加这个耐克斯的迪斯卡瑞啊,也就是服务注册发现的一个客户端。依赖啊,也是一个启动器啊, spa 腿,然后他会把我们的所有功能自动装配 好。依赖处理好了以后,下一步就是地址了,那因此呢,我们接下来会去修改阴谋文件,把里边的这个地址改成啊,八八四八啊这个地址。那接下来呢,我们就到挨店里动手试一下。 首先呢,我们应该找到这个项目的副工程啊, pome 在副工程当中 已经有了 surprodod 的管理依赖了, surpro 的阿里巴巴比较特殊,他是后来才加入的,所以呢,他没有在这个里边,他需要单独去引入他。这个依赖比较长,大家应该记不住啊,我建议 大家呢,从我的笔记上去,靠,我们找到我们的刚才的马克档,打开,在最下边有一个耐克式依赖, 我们点过来以后呢,发现这里有一个复工程依赖,我们把它 ctrl c, 我们用的版本是二点二点五啊,然后我们进入 clodam, 然后呢把这个依赖啊直接粘过来就 ok 了啊,这块啊是 nico 字的管理依赖, ok, 他来管理版本的啊,管理版本的 ok。 那么这个有了以后,下边我们就可以动手来改造服务了,服务你要做的事情呢?第一,把有瑞卡依赖去掉,换成 nike 依赖,我们先来改造 uic sorrys, 那么我们把由瑞凯依赖住掉,然后把阿里巴巴的 nike 也来引进来,同样我们去麦克当文件里拷贝,我们找到他, ctrl c, 再找到 id, 然后呢把它粘起来就行了,好,依赖导入完成。那么接下来第二步呢,是修改音母文件,我们打开啊,不是 kiss 点音母 在这里呢,我们会把有瑞卡的配置住掉,往上找到 surme 这一块。 max 的配置呢,属于 supreme 的配置啊,所以可以直接在这写 n acosnx。 我们可以看到有非常多的配置啊,其中服务地址叫 siri add r sorry, 那么默认值就是 logo 好色,八八四八,也就是说即便你不配,其实啊,也能找到,那你说你配 配不配呢啊,你还是配对吧。那么因为将来我们的地址可能会发生改变,是不是啊,这也是耐克斯福地址,所以呢,我们还是配上吧。 到这呢,优点 sorry 的配置就完成了,那么此时如果我去启动优点服务,那理论上讲,他就会重新注册到我们的奈克斯了。我们启动, 那么在启动的过程中,我们顺便去把凹的设计也改一改吧,那同学们,凹的设计师要去做的话,是不是也应该相同的步骤啊?那你们来说,我来做,因为已经做过一遍了。第一步干什么? 哎,没错啊,找到奥德赛瑞斯的泡沫文件,引用依赖吧,我们先把优瑞卡依赖注掉,而后引入奈克斯依赖,如果不会写不要紧,我们 去拷贝,我们呢,可以找到麦克杖,然后呢,拷贝 nice 依赖,再回到我们的 id 粘贴过来打包。第二步干什么? 哎,很好,第二步去找啊啊,不来开心点,因为文件吧。然后呢,把有瑞卡的地址住掉吧,在 supreme 下边去配置 nico 的地址怎么写? n acus 吧, nx 下边是三 y 二转, 然后指示 logo hous 的八八四八。 ok, 那么到这呢,我们就完成了奥德 siris 的改造了,其他代码完全不用动啊,之前我们讲的瑞贝啊,什么都不用动,他都是 通用的,下边呢,我们启动,那么在启动 out 的过程中,我们把两个优点服务的日志清空一下,因为我们等一会要测试看他能不能真的是实现了啊。负载均衡和服务发现 好了,全部启动成功,我们回到浏览器查看奈克斯的库尔台,刷新一下,找到服务列表吧, 可以看到呢,目前奥德斯维斯和优德斯维斯都注册上来了,纳库斯控制台呢,比有瑞卡的控制台看起来是不是更加清爽一点啊?而且呢,我们点到这个服务师详情里边啊, 我们可以看到这里还有更详细的实力信息,实力的 ip 地址当口号是不是全部都有,而且这里真的显示的是 ip 啊,并不是那个之前那个计算机名啊,所以会更清爽一点。 好的,那我们返回,那既然已经服务注册成功了,我们下边就来测试一下服务的发现啊,我们来反问,欧嘚 sorry 色,我们从幺零幺开始,再从幺零二好,幺零三, 幺零四好,然后访完了以后呢,我们回到 id 查看日志,可以看到啊,无论是八零八幺还是八零八二,是不是都有这个信息证明我们刚刚的这些配置已经生效了吧。 哎,好了,那么负载均衡是没问题的啊。那么因此呢, nike 的这样一个服务注册我们也讲完了,我们回到 id 啊,我们这里服务注册 啊,那么耐克斯服务的搭建呢?步骤比较简单,下载安装包,解压,然后直接找并目录里启动就行了,如果有必要的情况下改下端口启动的时候采 单机启动啊。那么服务的注册发现呢?嗯,因为 siri 卡友的抠门呢,定义了通用的接口规范,所以我们只需要改依赖和地址信息就可以了。啊,还是比较简单的。好,那我们这节课的内容就讲到这里了。


好,同学们,在前面几节课里啊,我们已经学习了耐克斯的基本用法,不过 在之前我们一直都是使用的单点的奶口色,这种方式我们自己测试的时候玩一玩还行,如果是在企业生产环境下,你也这么搞,那可就要出大问题了, 因为在企业当中,我们更强调的是高可用,对吧?所以奈克斯一定要做成一个集群。这节课里,我们就来看一看怎么搭建一个奈克斯集群, 详细的玩法呢,已经写到了课间资料中的一个文档里了,奈克斯集群搭建下边呢,我们就来看一下这个资料, 我们把这文档打开,在文档当中详细的给出了集群搭建的一个方式啊,这是官方给 演出的集训大件图,用户请求进入以后,这有一个 slb 啊,就是负载均衡器,他呢将我们的请求分发到不同的 nax 结点啊,就形成一个集训结构了,不过呢,这个比较抽象啊,同学们看一下我这里画的这幅图, 我们有三个耐克的节点,当然你在企业中,你五台六台都行啊,只要你有钱,你就是老大。好,那现在呢,我们假设有三台, 那这三台耐克节点呢?第一个要实现的是数据共享,因为不管有几台,最终数据不共享,那么大家各自各的数据那就出问题了,所以呢,我们会怎么做呢?我们会整一个买 solo 的集群, 让多个奈克斯啊都来访问这个集群,在里边完成数据读写,这样数据不就共享了吗?而后呢,请求 进入以后,用户请求进入以后,我们还要让他能够分发的不同的代购节点,这个时候不叫做负载均衡啊,那么由谁来实现呢?我们可以用 n j x 来做,因为我们知道 n x 可以做到反向代理和负载均衡吧。那么这样呢,整个集群结构啊就有了, 那等一会呢,我们就按照这个结构去完成 nicos 集群的搭建。同学们要注意了,虽然我们要按照这个来做啊,但是呢,条件有限呢,我们就一台电脑对不对? 所以我也不会真的去做,就是三台机器给你演示啊,我们会在当前这一台电脑上去部署三个耐克式节点。呃,买烧烤呢,理论上讲应该是机群,我们也先弄个单点。好吧,那所以呢,我们在同一个机器上去做 做三个 nicos, 他们的 ip 地址就是一样的,不一样的是端口避免冲突吗?那这三个 nicos 分别是 nice, 一、二和三?集群搭建的步骤是这样子的,先完成数据库集群搭建,然后在里边呢,创建好 nicos 要用的数据库表结构,这些结构我们的 nicos 官方网站都已经提供给我们了。 第二件事情呢,是下载耐克斯安装包,这件事咱是不是也做过了?而后呢,我们就可以去配置耐克斯集群了,这个配置呢,会和传统配置略有差别啊。最后完成集群启动,利用 ngx 实现反向代理。 那我们来做第一步啊,搭建数据库集群。刚才已经聊过了,我们不打算真搭集群啊,明白,搜主从集群搭建起来还是挺繁琐的,恐怕也得花上半个小时以上,大家如果有兴趣可以看一下我们 传世教育的高手课里边应该会有满色口主从高考用机群的搭建啊,好的,那我们这节课呢,就先用一个单点模式的,那这样呢,我打开一个满色口的课后端,然后呢尝试把这些数据给他导进去,好吧, 呃,打开一个 logo, 这里呢已经有一个耐克斯的库了。呃,表也有,但是我把这些表先删掉,咱们要搞全新的,对不对?那我们呢,就把这里边的数据结构 ctrl 一个 c 拿过来, ctrl 一个 v 去运行一下,当然了,得在查询中运行 粘贴定型,这个时候呢,我们把它关掉,我们再来看这里刷新表来了,没错吧,有了表,我们接下来就可以去继续耐克死的答件了,我们回到文档。好,下一步 就是下载耐克斯,这件事咱也做过了吧,打开看一下,这是我们下载好的耐克斯安装包,再往下 配置耐克斯结局配置可就有点复杂了,我们不能按以前怎么来配了啊。并且呀,我们要做三个耐克斯就要有三次配置,那我的做法是这样子的,同学们,我会先夹一份, 解压完了以后我在这配,配完了,我复制三份作为三个耐克的解点,可以吧? 啊,那么我们先在这个里边来配吧。怎么配呢?首先要找到集群中的克拉斯点,砍费个点,一个 apple 把它改成克拉斯点抗费个。来吧,做一下,好,找到这个卡费文件夹 啊,来找到这个卡西卡菲给的一个自然炮,我们先重命名,把后缀名去掉,这玩意去掉啊,这不要了 是。好,接下来呢,我们来改内容。那这里边的配法呢,其实就是配集群中的每一个节点的信息, 来,我们看这 c, 因为在我这个机群里啊,我的三个机器都是在本机,所以都是幺二七零点零点幺,端口都是各自的端口,八八四五,八八四六和八八四七啊,如果你们是来生产环境下,那这三个都应该是三台真实机器的 ip 地址和端口号 保存一下,这样呢,我们就完成了集群的配置了,接下来呢,还要配置卖三口的信息啊,因为我们将来集群是要去访问买三口的,我们找到 看这个文件夹,找到啊,不来 k 是你 prpx, 然后编辑这里要改的信息,有以下几个啊,第一呢是这里要把这个数据源打开 啊,这样呢是告诉我们戴克斯我们用的是买三口集群,而不是其他集群,这里呢是问数据库的数量,就是你这个集群中有几台买三口,我们这里只有一台,对吧? 那么再往下呢,是数据库中的这个 url 啊,还有这个用户密码信息了啊,那这里呢要把井号删掉,井号是注视 再来再来。那这个账号密码也改一改,我是入他一二三。 然后呢,这个地方的数据库地址和数据库名,你要根据实际情况,你自己是什么就改成什么啊, 好,全部配完保存一下,关闭到这呢,我们就完成了整个集群的配置了,别着急,配好了以后,我们还要把它复制成三份,然后分别启动吧。所以呢,我们找到这个文件夹, 我们给他重命名奈克斯一,然后我们把他拖到这个雷神目录下吧,我们在这边来玩。好,我们把这个雷神一再复制一份, 再来一份三,好,那现在我们就三份了啊,但这三份的端口啊,还不对,我们要把它分别改成八八四五,八八四六八八四七,所以进去 找到砍这个,找到这个,打开八八四五,保存关闭好,再来。 来拿口丝二,再来看这个,再来 prods。 好,这个改成六, 保存关闭好,再来。找到耐克斯。三,找到卡这个找到啊,不雷 kiss pops 打开改成八八四七。 走到这呢,我们就完成了三个档口的配置了,下边就是启动了呗,启动就很简单了呀,找到并目录玩他不就好了。那么我们找到耐克思一,并目录。在这里,我们打开一个黑窗口,同学们注意了, 这个启动的命令略有变化,不再需要加杠 m 参数了,因为我们现在是集群启动,默认就是集群启动啊,直接回车就行了。那下边呢,我们再来去 启动耐克是二,同样呢,找到这个闭目录,我们在这呢, cd 过去,放大一点啊,四到二叉二,还有耐克三, 好,我们再打开一个新窗口,放大一点 cd 过去,然后 style, 现在我们的集群部署就成功了,同学们,你可以等一等看一看啊,看第一个吧,是不是奈克斯在集群模式下成功启动了?好,我们再来看第二个,没问题,第三个,第三个正在启动当中啊, 好,启动成功,现在三台奈克斯都启动成功了。下边 呢,我们要做的事情就是给他们三个做好负载均衡反向代理。那就是要去找 njax 了。同学们,那 njx 的配置大家以前是不是都学过呀?这里我就不再坠数了吧,直接找到安杰克斯的安装包,打开, 然后找到我们的安装目录,把这个 nx 拖过来,关掉压缩包, 关掉文件夹,找到按键三段目录了以后,点进去,找到卡菲格目录,我们在这打开 njxcome, 完成配置啊,同学们以前应该都配过吧,我们的配置内容是什么呢?先看一眼吧, 我们的配置内容是先配了一个 f s greme 的一个集群,集群里边啊有三个 ip 地址和道口号,其实就是集群中的三个耐克死亡 这里呢,我们的 nx 就会对这三个地址做负载均衡。而后下边是反阳代理的配置啊,监听八零端口 logo hous 的,也就是说以后你在访问的时候不用再加八八四八了,直接八零就可以了。 再往下是配上杠耐克斯,这个杠耐克斯了,是我们的一个耐克斯的默认路径,还记得吧,也就说只要你仿了这个路径,我就给你代理到上边这个集群去。好,我们把它配置 ctrl c, 找到 ngx 目录,打开 ngxconfe 编辑,然后把它粘起来。粘哪呢? 只要粘到 hddp 的内部,随便哪里粘一下都可以,就这吧粘贴保存就行了。然后我们去打开 n x。 好,嗯,我们在这里再次新建 那个黑窗口, cd 过去,然后退格吧,在这,在这个目录下直接 stop n, 这个是启动成功,同学们,下边不废话,打开浏览器访问一下访问的地址是什么,告诉我没错,直接 logo past nice 走,是不是成功了?同学们,到这集群搭建就成功了,其实你看着我现在好像访问的是一个,事实上他会在三个耐扣子之间做一个负载均衡。 那么问题来了,我的加瓦代码将来该怎么配呢?我现在是八八四八,你现在变八零了,我怎么配,哎,就八零,嗨,没你 你想的那么复杂。来,我们启动两个试试, 稍等片刻。 好的,我们打开浏览器,找到服务列表,看一下是不是成功注册新来了,来,再刷一下,现在显示的只有一个啊, 等一会应该就有多个了,哎,看是不是来了啊,这就是服务注册,先配置管理,咱也试试吧,现在配置你是空的吗?我加一个,咱来一个。那个 uzi 思尔维斯点滴微 就是塞瑞斯点夜猫吧,来,放大一点吧,大家看不见,这呢来描述就不写了吧,这直接夜猫。然后这里再写一个配置啊,我们以前配的什么?拍腾,呃,下边是什么来着?第一, 阿弥陀佛, mate, 喂喂喂,杠 mm 杠 dd h h mm ss 吧。好,来提交一个,发布成功返回,大家看配置是不是加起来了。这个时候我们打开数据库,那这个配置他已经是存到数据库里边的, 看到没有?有个塞尾斯,哎,看到没有,是不是存进来了?内容是不是也有, 哎,这就是说明我们的数据已经存储到满色口里边,完成持久化了啊。其实导致我们整个集群搭建就已经成功了,大家可以看到一旦搭建好,玩法跟以前没什么区别,对吧?好,我们回到 ppt 做个 总结, nicos 集群搭建的步骤呢?五步,第一步是完成买三口集群的一个步数,还有表的一个初始化,这个动作呢,还是比较简单的。第二步呢是下载和解压 nx, 但是解压完了你还要做一些配置,配置主要包括第一,集群配置,就是集群中的每一个节点的 ip 和端口信息。第二,数据库配置,就是说你这些节点都要访问的那个数据库 ip 端口,账号,密码等等信息配进去就行了。还有就是 我们要去启动奶口丝,每个奶口在启动的时候一定要注意了,不要再加刚 m 参数了,直接启动就行了啊。 那么如果你跟我一样是在同一台电脑上启动多个单口词,切记端口不要冲突啊。最后呢是用 nx 完成 反向代理,那个是集群的搭建,可能会跟我们的温度似的,运行环境啊,有很大的关系,所以很多同学在去部署的时候啊,可能会碰到各种各样的一些问题啊, 那如果呢,大家碰到了问题自己解决不了,欢迎大家也在我们的评论区里去留言提出你的疑问啊,那当我看到以后,我也会及时的给大家回复的啊。啊,那好的,那我们这节课内容呢,先到这里。

今天我们要做的是搭建一个简单的生产者消费者架构。首先我们创建一个副工程, 副工程的名字为 cms。 复工程创建号之后呢,我们创建一个子工程,我们可以在复工程下面创建一个 model artified, 填写 article service, 这个 modro 呢就是我们微服务里面的服务 提供者。 接下来我们在复工程下面再创建一个 model artifacted, 填写 article consumer, 这个 modro 呢就是我们微服务里面的服务消费者。 接下来我们添加副工程的依赖, 这段代码是引入 spring 部二点幺点五版本, 这段代码是指定 jover spring cloud mapper my s q l 的版本,这段代码是引入 spring cloud map 启动器 my s q l 驱动统一配置中心, 这段代码是引入 longbook, 最后引入 mayvan 打包插件, 这样一个简单的微服务工程就搭建完成了,有问题的小伙伴可以私信给我。

好,同学们,接下来呢,我们就开始今天的第一章学习啊,认识微服务。 这一章呢,我们会有两个小节,首先我们会带大家去了解一下微服务架构的演变过程,而后呢我们就会去认识一下微服务中的一种实线,也就是 surprise。 好了,那下边我们先进入本章的第一节,看一下微服架构的演变。 那目前为止我们所接触的项目,我们所实现的项目啊,都是单体架构的。什么是单体架构呢? 简单来说呀,就是把业务的所有功能集中在一个项目中去开发,打成一个包取物数。比如说我们现在有一个商城项目啊,那这个商城项目里边的功能肯定很多,还有很 很多模块,比如有订单模块、用户模块、支付模块和商品功能模块。那我们在开发这样的项目的时候啊,因为你采用单体架构啊,所以你不用去搞非常复杂的架构设计,你只需要创建一个项目, 然后有功能就往里边啊加代码,再有功能再加代码,不断的堆积代码就 ok 了。所以他单体加购呢,他第一个优点啊,就是加购简单,你不用去搞复杂的这种加购设计理念是吧?哎,就整一个项目就往里面写就行了。 那么第二呢,是部署成本低,因为你将来是打成一个包吗?那我整一台汤姆盖的,把你这个项目打成包,往上一放,一部署用户不就能访问了?用户多了,那我再加俩机器行了吧,形成负载 均衡的集群在这就是我们单体架构的一个优势了,架构简单不说,成本低,那这样的架构呢?他比较适合于啊啊,面向下一些企业内部使用的一些简单项目,因为单体架构有一个严重的缺陷,就是凹和度高。 你想呀,所有代码写在一个项目里啊,如果我是大型的互联网项目,什么拼多多、淘宝,那我这业务可就不是两三个模块了,往往就会有几十甚至上百的模块,代码量呢,可就不是什么几千行,那就是数万甚至数十万行。 这个时候啊,你这个代码光编一打包可能就得花上十几分钟,你说说看,这效率多低?而且呢,因为模块太多,在开发的过程中, 这些个代码你中有我,我中有你啊,他们之间的边界也越来越模糊啊。将来你改了一个地方的代码,还有可能啊,导致其他几个模块代码都跟着受到影响,这个时候你还敢乱动代码吗? 不行。所以呢,偶和度高,他其实是不利于大型项目开发的。那么大型项目一定会做分布式加购, 什么样的叫分布式呢?我们会根据业务功能对系统做拆分,每个业务模块呢,作为独立项目去开发成为啊一个服务。 你比方说这个商城吧,它里边有四个业务模块吗?那我就会按照业务拆分,拆成四个独立的项目。什么叫独立项目呀?就是我来做这个支付的时候,我 单独创建一个项目,在里边光写这个支付的功能,那你想这样一来有什么好处?低偶和度低了, 对不对?因为什么呢?我单独在这个项目里写支付,你在那单独写商品,大家各写各的代码量是不是少了?我这个边易打包啊,各种速度是不是很快?第二呢,我在这写我的代码,你写你的,咱们之间啊,有影响没有? 显然没有吗?你一个,你在这个锅里做饭,我在这锅里做饭,你做啥跟我有什么关系?你做臭豆腐也影响不到我,是不是最多闻起来难闻,我吃起来还是没问题的。所以说呢,啊,这个时候呢,大家的呕和度呢,就降低了, 并且你将来想对你这个单独模块做一些技术升级,你换一个别的版本,用个别的技术跟我也没有印象吧。那将来用户在访问的时候呢,你就可以根据需要 啊,你该访问哪个模块就访问哪个模块,那这就是分布式价格他的一个优势啊,偶和度低,升级拓展也都很方便。 但是呢啊,那么一切东西他都是有正反两面的分贝架构啊,带来这些优势的同时,他也有一些问题,因为你做了服务的拆分, 那么服务拆分的越多,将来部署啊,各方面是不是也会越复杂呀?而且那么在拆分的过程中也会有一些问题, 那服务拆分是一方面,将来拆分好的机器,你是不是为了保证高考用还要做集群,那么将来呢, 一旦拆分就会产生一个新的问题,原来是单体项目的时候大家在一起对吧?我在下单的时候我需要商品信息,怎么办?你这是不是 有一个 sorry 词吗?我直接调你 sorrys 是不是就行了?因为你是在一个项目里,大家是不是可以互相调?当然你现在做了拆分了,那不行了,你这是俩符啊,不符在独立的机器上。好了,那我还能调你的代码吗? 掉不了了。那这个时候怎么办?除非你能够从一个服务向另一个服务发请求,我直接来调用你。这种调用叫什么?叫远程调用是吧?跨越什么的?跨越机器的,跨越服务的这种调用。 这种调用咱们好像也没学过吧,所以你看分布式架构啊,他其实是有很多问题需要我们考虑的, 比较常见的就是这么几个,第一,服务拆分的力度。你怎么拆啊?哪几个服务单独作为独立模块呢?哪些业务在一起呢?对不对?这个力度你需要去把握。那第二呢,服务 集群的地址怎么维护?你想啊,你这个支付你都有两台机器,将来大型项目升值,光这一个模块都有上百台机器。好,那我将来要调用你, 我怎么知道你这上百个亿的地址,我直接在我代码里写死啊,那万一上线的时候一部署变了怎么办?我再改,这显然不行吧,所以这个地址呢,必须得是能够方便维护的。而且刚才讲了,远程调用啊,我怎么调用你啊?这是跨服务的调用啊,我们可没学过。 而且呢,将来啊,服务健康的状态,怎么感知我?你现在有上百个服务,我来调教你,我怎么知道你这上百个服务是不是好的呢?万一你挂了,我来调你, 结果你那,哎,挂了,阻塞了,导致我这是不是也出问题了?这叫什么?这叫急连失败。哎,这是,这怎么解决?那人们呢? 在去啊,做分布式架构的过程中啊,其实一直在想办法解决这些问题,因此呢,也出现了各种各样的一些技术,什么 wifi、 sosees、 b w, spran、 clud 等等。 那目前呢啊,这些分布式技术也在不断的去升级和迭代,也人们也不断的去提出一些新的方案啊。但是近几年最火的应用最广泛的莫过于微服务方案了啊,那什么是微服务呢? 微服务呢?其实啊,就是一种经过良好架构设计的分布式架构方案,也就说他其实还是一种分布式的架构,只不过呢,是人们在设计分布式过程中啊,踩坑啊,各种总结经验啊,得到了一种最佳实践。 那微服务里边有什么样的一些特征呢?第一,单一直走微复,拆分的时候力度要小, 每一个服务都要有对应唯一的业务能力,做到单一职责,避免重复开发。那举个例子,我们刚才讲商城里面有订单,而有用户,有商品,有支付, 但事实上呢,你这么拆,力度其实很粗。你想啊,对一个大型的互联网项目,比如说拼多多,那你这个用户模块里,将来我可不可以再来个什么会员级别?那不同会员级别享受不同的这个折扣, 我这个,呃,会员,我可不可以再来个积分积分系统啊?然后这个积分还能去兑换什么东西啊?还再来个什么会员的货币,什么金币之类的,这些是不是都可以有?那这些都属于会员中的功能,但是你不能 把它呕合在一起,你将来应该怎么办?是不是进一步去做拆分,变成更多的服务模块?一个模块就做单一职责的功能,咱们这做的好处是每一个服务他业务更少了,他影响的范围更小了 啊,这是单一侄子,那这里就有个新的问题了,那你现在积分拆出去了,我用户查询的时候,我需要查积分的时候怎么办? 我们刚才讲了啊,这个时候呢,你没有办法去调里边带码了,因为你是跨服务的,对不对?这个时候呢,就会有第二个叫面向服务。那微服务要对外暴露业务接口, 比如说你这个积分符,你应该都要暴露一个查询积分的接口,将来呢,我们的用户需要时可以啊,远程的来调你这个接口啊,这样 我不就知道积分信息了吗?这叫做面向,那这些接口的标准必须统一,这样呢,我们将来相互调用的时候,是不是有统一的方式去调用啊?那么第三个呢,叫自制, 自制啊其实就是独立,我们的各个服务啊,要做到团队独立、技术独立、数据独立和部署独立。像在以前就是一个大公司分成三个团队啊,前端啊、服务端啊,什么测试这样子的。现在对于微服来讲,他不是按这个你的这个职责划分了,而是按微服务。 比方说这个微服我给你派上五个人,里边有前端、有服务端、有测试、有运维,那你这五个人你就负责这个微服的开发。当然五个人只是一个概数啊,一般五到八个人其实都行。为什么是这么一个小团队去开发呢?因为 你团队越小,沟通起来越方便呢?将来我服务有什么问题需要迭代升级,我给你们一通知,你这五个人呢?快速的是不是就能够去开个会讨论一下了,快速把这事给定下来了。然后呢?立即啊,去完成这个服务的改造啊,升级测试,全部一套走下来, 所以他比较符合敏捷开发的这种思路和思想。那技术独立,那你这个独立团队各自开发吗?你是不是可以去用自己比较擅长的技术啊? 甚至于你可以基于业务去选择,对吧?这个业务比较适合用这个技术,另外一个业务适合用另外一个技术。哎,你就可以随便选了,因为大家互不影响嘛,你随便也用什么都行。 我在树叶有专攻啊。那么数据独立呢?就是指每个月服务还可以啊,有自己独立的数据库,不再是像以前了。以前怎么做? 大家是不是访问同一个库啊?数据全部集中在一起,偶合在一起,那这个过程中万一有人不小心改了你的数据,对吧?你这会员服务来改了我的用户信息,什么?积分信息?那这个时候就出问题了呀, 所以呢,我们现在把数据独立,每个服务有自己独立的数据库,有自己独立的数据,那么将来呢?是不是就实现了一种数据的结偶了 啊?那么你的用户服务不可能操作我的积分,你会员服务也不可能操作我用户。那避免了呀,你直接这种数据上的一种污染 啊。那部署独立呢?那我数据都是独立的,我前来部署时候是不是也可以独立部署?那用户呢?在访问的时候,他可以基于自己的需求去访问是不是任意的业务服务。当然了,得有个统一入口啊,因为用户其实不知道我们有上千的服务,他可以访问谁,对吧?所以有一个入口, 那我们这个入口一般叫网关。服务独立了以后呢,还要做到一种隔离性,因为服务虽然独立了,但是他们之间会有相互调用吗?不是面向服务吗?对吧?你会抱着一个接口供别的服务来调,那万一我调你的时候,你挂了, 岂不是会对我产生影响?所以为了避免这种影响呢,服务要做好隔离,就是说我来钓你的时候,万一我发现你挂了,我这是不是要把这种故障隔离起来,我提前做好一些容错措施,将来呢?避免什么呢?因为你这里出现当机,导致我这也当机了,那避免几点失败? 这这些呢,都是啊,微服务的一些特征啊,其实这些特征最终的目的就是为了实现高内据调和,降低服务之间的影响啊,或者说降低服务他所 能产生影响的范围,避免整个集群的故障。那以上呢,就是我们整个微服架构演变的流程了,简单总结一下,讲了三种吧。首先是单体,单体架构呢,它的优点是简单 部署方面,那他的缺点就是什么呀?偶和度高,那只能适合一些简单项目,小型项目,分布式架构呢?分布式架构呢,他其实就解决了那些架构的问题,降低了什么呀?偶和,但是呢,架构太复杂了,难度比较大,比较适合一些大型项目。 那么唯一服务呢,其实就是一种啊,分布式架构的其中一种,但是呢,他设计的更加的啊,好一点,是一种最佳实践。那他里边呢啊,拆分的力度更小,服务呢更加的独立,饱和度更低一些啊。缺点呢就是架构 我更复杂了。你想看你拆的越小是不是将来也越复杂?你将来部暑啊,运维啊都会,这个难度都会大大提升就可以。那我们这节课内容呢?先到这里。

好,同学们,经过前面的学习,我们已经掌握了 es 啊在大部分业务场景下的用法了,那么这一章呢,我们会学习一个与业务虽然没有关系,但却非常重要的知识,就是属于同步。 而且呢,这个东西啊,在面试的时候也经常没问到啊。那这一张我们会带着大家先了解一下数据同步的各种不同的解决方案,而后呢,去动手实践啊,解决 es 的数据同步问题。那我们先来看一下第一部分啊,数据同步的解决方案,而我们得先知道什么是数据同步问题啊。 我们知道 lt search, 它的数据其实是来自于买 c 口的,那当时我们写了代码,从数据库里导入数据到 e s 当中,这个导入结束以后,买 c 口的数据不是 是一成不变的吧?那将来我们业务当中会有 crud, 那酒店数据会有新增,会有修改,会有删除, 那买 c 口的数据一旦发生了改变, e s 如果不跟着改变,就会出现问题。你比如说现在商品的价格发生了变化,那 e s 还是老的价格,用户搜索时看到的就跟真实的不一样,这就有问题了。 所以如何保证买 c 口数据变化时 e s 也能跟着变化,这就是数据同步的问题了。其实不仅仅 e s 有数据同步问题,凡是数据库双写的情况啊,比如说 ready 色与买 c 口,那它都会存在同步问题, 而这些问题该怎么解决呢?啊?如果说你现在是一个单体式的项目啊,所有业务都写在一个项目当中, 那这很好办呀,那无非就是我在写新增、修改、删除的业务的时候,我同时把所有库也一起更新了,不就好了吗?但是我们现在是微服务项目啊,同学们,那在微服务项目下, 不同的业务,他往往会在不同的微服务上。你比方说我现在做酒店管理的啊,操作买 ccocled 的 业务和负责酒店搜索操作 es 的业务,他肯定会在两个不同的微服务上,那跨微服务,跨项目,你就没有办法直接操作了,你该怎么去做数据同步了? 好,那这里呢,我们给大家啊,三种不同的解决方案。第一种解决方案呢,叫同步调用,我们假设现在有两个微服务啊,一个呢叫 hotel demand, 就是酒店管理。 那第二个就是我们现在正在写的后台点某啊啊,它里边做的是酒店的搜索业务, 我们假设这两个服务之间互相不能访问对方的数据库啊,那酒店管理服务只能访问买 c 口啊,酒店宿舍服务只能访问 yes, 这也符合微服务里边的标准和规范啊。那现在问题来了,我在酒店管理服务中完成了数据的新增, 那 es 怎么去同步呢? ok 啊,那他的做法是这样子的,当有人做新增、删除和修改的业务时,我首先要去把数据写到数据库里, 那以前业务到这是不是结束了?那现在不行啊,要的慢呢,你要去更新 es, 我又没有办法直接掉啊,那我就会去调用 hotel demo 当中的更新所有 顶库的一个接口,也就说别人没法做到 es, 那我可以对他暴露一个接口呗。啊,你掉我的接口, 那么我被调用了以后,我自己去更新 es 不就好了吗?所以呢,在整个过程中啊,他也就从原来的一步啊,变成了三步了,先写数据库,而后调后台 demo, 然后后台 demo 更新颜色。 而这三个步骤啊,是依次执行的啊,也就是说,写完收据货了,才能去掉这个接口,而掉接口了以后,才能去掉 es 的 api, 实现更新,而更新完成结果才能返回到后跳 demo, 后跳 demo 处理完才会返回给 admin, admin 才会返回给用户。那大家看这个过程是不是依次执行的,那这种方式自然就叫同步调用方式了。 那通过这种方式有什么问题呢?第一,属于藕和,业务藕和啊,你想啊, 原来我只是写数据库,写完我就结束了吧。那现在你在写数据库的代码后边是不是得加一个调用后调 demo 的代码呀?也有逻辑发生了修改吧,并且调用后调 demo 这个接口的业务,跟我新增业务有关系吗?没有关系啊,你现在硬把这俩代码藕合在一起了,这不就业务藕合了吗?啊,那你业务藕合必然会影响性能, 为什么呀?啊?你原来喜欢数据库,结束了耗时,比如说五十毫秒,结果现在呢?你喜欢数据库,你还得等待啊,这个后天 demo 这个接口的一个响应,而他又要去调用 es, 等待这块响应。那假如说这两个耗时啊,比如说这号是五十,这也号是五十,那总耗 是不是这三个步骤相加的耗时了,达到一百多毫米,那性能自然就下降了啊?并且呀,如果步骤二和步骤三任意一个位置发生了异常,那你整个业务是不是也出问题了? 所以说啊,这就是偶和他带来的问题,那么同步电用有这么多问题,我们肯定要有别的方案对不对?所以他第二种方案啊,就是异不通知,基于我们以前所学习的 mq 的知识来实现的啊。 当有人来做新增时,我先去写数据库,写完以后啊,我不去调用任何人的借口,而是发一条消息,我通知一下别人,哎,通知一下,哎,我这这个数据新增了啊,至于谁来监听这个消息 啊,今天了,以后做什么啊,什么时候做,跟我有关系吗?没有关系。那这样来,有 的奥合是不是就解除了?那并且呀,你这边更新耗时多少秒,跟我这边没什么影响,我洗完数据库发完消息是不是就结束了?所以呢,我的性能是不是也得到了提升,他就解决了我们前面所说的同步电用的问题了?那这种方案呢,是比较推荐的一个方案啊, 不过啊,这种方案他其实会依赖于 mq 的啊,可靠性啊,并且呢,因为引入了新的中年间,所以他的实现的复杂度啊,有一定的上升。还好 mq 我们已经比较熟悉了是吧。 啊,那么第三种方案啊,他是通过监听并 log 来实现的。那什么是 blog 呢?有些同学可能没听说过啊啊,如果大家了解买 c q 的主从同步,应该知道,买 c q 里边 blog 默认是关闭的啊。但是一旦你开启了 blog, 那每当买 c 口里在做增山改石,都会将相应的操作记录在 binglog 当中,也就是说,只要数据变化了, blog 就会变化,而我们可以利用类似于 cannerl 这样的中间键去监听 blog, 一旦发现病了个变化,立马通知对应的为服务,那这个服务呢,就知道说有数据发生变更了,那他是不是也可以更新 es 了? 在这种方案当中啊,他其实完全依赖于这个中间键,比今天买 c 口,他跟我们的酒店管理服务没有任何的关系。你看, 当有人来新增时,酒店管理服务写数据,写完数据结束,跟他是不是没有任何关系啊?他既不用发消息,也不用去吊任何人,是不是完全解除了服务间的藕和了,所以这种方案藕和都是最低的,但是他 因为要开启买 c 口的并 log, 所以对于买 c 口来讲啊,压力就增加了,并且呢,这个过程中还要引入一个新的中间键啊,那这个中间键大家以前也没学过对不对?那他的部署和搭建还是有一定的难度的,所以实现起来啊,会比较复杂。 那因此呢,每一种方案啊,我们刚才讲的每种方案都有一定的优点和一定的缺点,那到底该有哪种呢?其实就看你自己的选择了。 好,那我们最后呢,来做一个对比,那三种方案,同步电影,一步通知和监听并 log 啊,同步电用它的一物点是实现起来非常的简单嘛,就是非常简单粗暴,我直接掉 api 就行了啊。但是它的缺点呢,就是哦,额度太高, 那第二方案亦不通知。这种方案呢,实现起来相比于直接调用这种方式要稍微复杂一点, 但是难度还可以,因为 mq 我们比较熟悉了,那他优点呢?是解除了藕和啊,那么但是他的缺点呢,就是依赖于 mq 这种可靠性啊, 那么监听 blog 这种方案呢,它的优点是啊,藕和度完全解除了,几乎没有什么藕和。那它的缺点呢,就是依赖于那个中间键啊,并且呢, kt blog 会增加数鱼库的负担啊,复杂度呢,会稍微高一点。 那因此呢,如果说你更在意的是啊,这个实现奥合度的问题啊,那你肯定不能用第一种,你一定要实验用方式二或者是方式三,至于是用 mq 还是用这个其他的中间键,这就看你们企业当中啊 啊目前的一个情况了,如果已经有了 mq 了,那我觉得你直接就用 mq 一步通知就行了,没有必要再用其他中间键了,对吧?好,如果你追求的是极致的藕和 啊,还有性能,那我觉得你可以选择方案三。好,那数据同步的方案分析啊,我们就讲到这里。

微服务的核心就是服务,那么既然是服务,就会有服务消费者和服务提供者,服务消费者和服务提供者通过远程调用方式相互通信。微服务常见的远程调用技术有以下两种方式, 一种是二 pc 方式,另一种是 http 方式。那么这两种调用方式有什么区别呢?首先我们看一下他们所使用的协议。 二、 pc 方式可以基于 tcp 协议,也可以基于 http 协议, http 方式只能基于 http 协议。 http 协议属于游戏的第七层,比较高层的一个协议。 接下来我们再看一下传输效率上的区别。二 p c 的传输效率表高于 h t t p 二 p c e 使用自定义的 t c p 协议可以让请求豹纹体积更小,或者使用 h t t p 二协议也可以很好 好的减少豹纹的体积,提高传输效率。性能消耗方面的区别 rpc 可以基于 zif 实现高效的二进制传输, http 大部分是通过刺来实现的,字节大小和序列化耗时都比 zif 要更消耗。性能 负债均衡方面的区别 rpc 基本自带了负债均衡策略,比如说我们使用的 double, 内部就帮我们实现了各种各样的负债均衡策略, h t t p 需要自己配置 and gink 来实现负债均衡。 那么在日常工作中呢?如果对性能要求很高,使用 rpc 比较好。如果对性能要求不高,使用 http 也可以。如果我们的服务比较多,使用 rpc 还要考虑到服务框架的统一问题。

好,同学们,刚刚啊,我们利用有瑞凯克烂子实现了服务的拉曲和负载均衡,但是啊,同学们肯定会有一些疑问啊, 因为之前我们只是指定了服务的名称,然后加了一个 logowex 的注解,一切就自动发生了。那他什么时候完成了服务拉全,什么时候做的负载均衡? 负载均衡的原理又是什么?策略又是什么?哎,我们一概不知。那这节课啊,我就会带大家去探究下这些问题。 那么先告诉大家,他的负载均衡啊,是有一个名为 re 奔的组件来实现的,这也是我们 surnclow 的动作啊,我们要学习的第二个组件啊。 好,那么呢,下边我们就开始来去看一下他,当然了,我们会先回顾一下之前的远程调 等流程啊,在之前我们有一个 out siris, 还有两个优的 sorrysod soss 呀,在发起请求时,是通过这样一个地址访问的,那我想问一下大家,这样的一个地址,他是一个真实可用的地址吗? 哎,大家的回答不太相同啊,那我们来验证一下。那同学们,我们找到浏览器,然后在这呢,同学们,我们输入这个地址,我们访问一下, 我们可以看到浏览器根本无法否认这个地址,因为这不是一个真正的一个域名或者 ip 和端口,因此呢,浏览器根本不认识我们。回到 ppt 里啊,那当奥特斯也是发现这个请求时,也就是说,其实是无法到达我们这两个服务的,那因 死中间一定会有人把这个请求拦下来,是不是得做一些处理啊,找到真实 ip 档口才行,谁去做这些事就是我们的 ready。 那瑞贝呢?拦截下来你的请求以后啊,他得想办法帮你找到真实地址。那他第一步要干什么?他得知道你这个请求指定的是哪个服务,然后呢,他就可以去找谁去,同学们 想想找谁。哎,很好啊,同学们回去找有瑞卡,因为有瑞卡里记录的是不是所有服务信息啊?他一旦瑞本一旦从这里拿到了服务名称,那是不是就可以去拉取服务了? 哎,我要找一个 siris 了,帮我看看有没有。那么有人一看说,哎,有,给你两个,那瑞本下一步就可以对他这两个去做什么?负载均衡 对不对?去挑呗。啊,当然,一顿挑,最后可能挑到了八零八幺,也可能挑到八零八二,那么这样呢,整个流程不就完成了吗?当然了,这是我们给大家讲整体啊,那具体锐本是什么时候拦下来这个请求的,又是什么时候拉去的,什么时候去做的这个附带均衡,我们呢,需要通过原码来去跟踪。 好,那现在呢,我对这个流程啊,截个小图好,然后我们一起呢,来到 id 二里查看一下原码 在这啊,我们给 restwetty 加了一个注解,叫露的白蓝色,这个注解就是一个标记,标记?什么标记? 这个 rap 的发起的请求要被我们将来 reban 去拦截和处理了。哎,那么这个拦截的动作是谁去完成的呢?同学们,哎, 我们来看一下啊,是有一个这样的东西来完成的,嗯, 哎,就是这个啊。来,我们来看一下这个六的 ylense, 因为他塞不特啊,我往上翻 就他,他实现了一个接口啊,叫做烂他 iddp readys, 他英特赛 这个接口是干什么的?我们可以点进去来看一眼,上边呢,有这么一个说明啊, 他会干什么呢?他会因他萨布斯克兰特斯亚的 app。 这句话不知道大家能不能理解啊?这句话, 这他的意思是客户端 app 请求的一个拦截器,也就是说他会干什么?同学们,他会去拦截由客户端发起的 去请求,我们的 restam 里头不正是一个发 htv 请求的客户端吗?所以就会被这个拦截器啊拦截,当然他是个接口啊,那么这个接口里面定义的方法名字叫什么?叫樱桃三, 那么回到他的实线类,漏个半粒子应该塞不他,那这个拦截器既然实现了这个接口,是不是一定会实现?应该塞不得方法呀,对不对?那我们在这打个断点,我们可以认为有 red 的发泄请求是不一定会被这里拦截。 好,那我们回到浏览器来,去发起一个这样的请求,刷新好,我们可以看到一刷新他就回到这个代码区域了,进入断点了, 证明这个请求确实被拦截了。那拦截了以后做什么呢? red 点 geturi, 这不就 就是获取请求地址吗?我们走一下,可以看到同学们可以看到得到的地址是 uzi siris, 杠有点杠一,这不就是我们刚刚看的那个根本无法访问的地址吗?那这个地址拿到了以后,他其实想要做的事情是干什么的?往下看, rrry 只有挨点干他 houst, houst 是什么?主机名,所以这样再往下走,靠,我们发现他其实得到了什么?同学,得到了,是不是服务的名称啊? 那拿到了服务名称接下来应该干什么?同学们是不是应该去找有瑞卡完成服务的拉曲啊?就像我们刚刚图中的,是不是这一步完成这个拉曲, ok, 那么好,下面 今天呢,他是怎么完成拉曲的呢?我们来看一下,他把这个服务名称交给了一个东西去执行,这个东西是谁呢?叫 low 的白楞子,我们鼠标放上去看一下,哦,就提示出来了,他是一个名为 reban low 的白楞子的对象。 你看到这是不是已经见到瑞本这样一个东西了?瑞本的负载均衡客户端,然后 xq 的就是直行,那我们二话不说跟入这个方法吧,往下走进去。 好,进入这个 redow 的败类词可论他了,看到吧,然后呢,我们继续跟入。 好,然后我们可以看到在这这个服务的名称啊,他被称为 sorryd 服 id, 他会教给一个函数啊,叫 get 路的班的字去处理。那我们来看一下,往下走一步,咔,好,执行完成以后,得到了一个了的班的对象,我们来看下这个对象, 这里可以往这边拖一拖,看到这个对象的名字叫 banamax, sorry sorry 办了什么?就是动态服务列表,负载均衡器,我们点开看一眼,在这呢,他的里边会有两会有这么一个东西看,叫 sorryast sorlas, 不就服务列表吗?你看八零八幺八零八二是不是已经成功的被拉雪道了? 所以刚才这一步是在干什么?同学们是不是在根据服务名称找有瑞卡 拉取服务列表啊?所以此时这个列表是不是已经拿到了?同学们,就是这一步,那下一步该干嘛了?是不是该负载均衡了? ok, 所以接下来很关键,这行代码就是在做负载均衡,大家看, get, sorry, 你这里是 siry 累死他吗?那么 getsel 是不是取出一个?好,那我们跟进去,看他是怎么做的?走,你进入方法 好还是在瑞贝勒斯白色里边啊?往下走,我们发现呢,他掉了去字方法选择 选择跟进去。往下走,我们发现他去找羞婆点舅子注意了啊,是去找父亲去了。来,去找父亲好,往下走, 走走。哎,我们看到这个有一个叫肉点去字, 肉是什么意思?肉是不是规则的意思啊?也就是说,现在我们要从这个等待 maccores 里去选一个,那么他选的时候是不是有一种规则来选的就是这个肉啊? 好,那么这个肉到底是个什么类型的对象呢?叫做 i 乳,那 i, 我们知道是接口, 入就是规则,那说明这是一个规则的接口,那他一定会有实现类喽?我们通过 ctrl h 查看他的实现类,发现呀,这个 i 入接口有很多的实现,但是我挑两个大家认识的,这认识吗?这不就随机吗? 再来看一个,这个见过吗?没见过呀,来,说明大家这个英文词汇有点匮乏啊,我带着大家查一下, ready rendry 来了, redry 专业示意 看这是什么?是不是轮巡调度啊?没错,这就是大家所熟知的轮巡负载均衡 随机轮巡。咱们以前在 nx 里是不是已经接触过这些负载军的规则了? ok, 因此呢,我们现在啊,这个入就是负载军的规则啊,而默认的负载军规则是什么呢?大家看是叫做 rend, 是入啊,是这个 柜子,这柜子是什么含义?别着急,我们以后会给大家聊,但是我们先看到这,我们就知道什么了,负载英雄的策略是由谁来决定的?是不是有挨入这个接口来决定的?挨入这个接口来决定啊,他选择 q 字,那不就选出一个了呗。好,我们往下走 走啊,我们就返回了。同学们,看走,返回了走,是不是拿到了一个,哎,拿到八零八幺了, 根据富态君的规则,那以后我还会拿到八零八二,哎,这样去允许调用对不对?好,那拿到服务信息了,下边是不是好办了?我就可以用真实的 ip 地址和端口号来替代原来那个什么服务名称 啊,用这个 ip 端口来代替服务名称啊,去发起真实请求了,同学们,能理解这意思吧,好,我们断点呢,我们就看到这,我们回到 ppt, 我们把这个放行啊,回到 ppt 来,同学们,我们一起来总结一下啊。那么当请求进入瑞贝了以后,瑞贝会怎么去处理呢?来,我们来看一下 请求啊,会被一个拦截器拦住,这个拦截器的名字叫 low 的八零四英特塞布特福袋均衡拦截器,他拦下来了以后 会得到请求中的服务名称吧,就是个优雅 sorrys, 然后把它交给啊,一个东西,叫做 rebold blanser clant 这样一个东西, 而瑞本露的办的事可烂,他就会干什么呢?把服务啊,交给一个名为的 mamex slow, 累死露的办的东西,那么他呢?就 会去优瑞卡里拉取服务列表,得到多个服务的信息, 而后呢他要从这两个里面挑一个做附带均衡,那么这个附带均衡可不是他去做的,他会去找一个东西叫 挨入,而我们的挨入呢,会从这两个里边基于规则去做出选择。比方说轮巡挑一个出来,选中了八零八幺, 然后把这个值再返回给我们的瑞本勒的巴塞克兰特,那我们的瑞百勒的巴塞克兰特就会用这个 ip 和端口替换服务名称,得到真实的请求地址。最后呢就请求到了我们八零八幺, 这就是整个啊,我们 ready 工作的流程了。好,我们这节课的内容就到这里。

好的,同学们,前面我们已经学习了两种过滤器,一个是针对部分路由的过滤器,还有一个呢,是针对所有路由的 dfat 过滤器。 那这节课呢,我们会学习一个新的过滤器啊,叫 global fute 全局过滤器。听名字你就知道了呀,它是作用于一切进入网关的请求和微服务响应。这么聊有没有觉得有点熟悉啊? 是不是跟我们前面讲的 dfatfute 的作用是一样的?那为什么我们又要学一种新的过滤器呢? 这是因为啊,我们之前讲的两种过滤器都是通过配置的方式来定义的,你配的呢?仅仅是参数过滤器的业务逻辑你是无法控制的,他 是有死不认邪死的。而我们有些业务却比较复杂,比如说你这个请求进来了,我想知道你这个请求是谁发起的?身份是什么?你是好人还是狼人啊?不,还是坏人?你有没有权限访问我? 那这些信息你让 sorry 帮你去做,你觉得现实吗?不行。所以呢,这样复杂一个逻辑,我们一定是想要自定义自己去写,而 global field 正式能够实现这一点。 这就是他与前边讲的那种默认过滤器的区别了啊,他的逻辑是可以自定义的,怎么做呢?我们要做的事情就是实现 global filter 接口。这个接口中啊,只有一个方法,就叫 filter, 顾名思义,过滤,而这个方法当中 有两个参数,一个参数叫 x change, 代表的是请求上下文。这个上下文指的是从你 请求进入网关开始,一直到结束为止,整个流程中都可以共享 x 亲自对象。那这个对象里边呢,你可以拿到请求相关的信息,响应相关的信息,甚至于你也可以往里边存个东西,取个东西都没问题。 而第二个参数呢,欠欠就是过滤器链,那么这个链条上除了你这个过滤器以外,还有别的过滤器,那他的作用呢?就是放行,什么意思呢?你调用这个过滤器链,让他往后走,那么等于你这里逻辑处理完了,就给别人处理了。 那因此这两个参数,第一个参数的作用是来让我们编写整个过滤器的,已有逻辑的,你需要的信 这里边都有。而第二个参数呢,是让我们放行来用的,交给下一个过滤器去处理好。那处理完了以后呢,他有一个返回值,这个返回值啊,大家比较陌生啊,他叫 monell, 是我们 web flux 里边的一个 api, 这个东西你没有见过不要紧,后边我们会教给大家如何去返回这个玩意。好,这就是网关当中全局过滤器的一个定义方式了啊,那下边不废话,我们是不是带着大家来写一个呀? 那我们写一个什么样的业务逻辑呢?来看一下我们的案例啊,这类逻辑非常简单,就是让你去拦截并且判断用户身份。 当然了,我们这里不是真的去写一个登录啊,我们这里的判断非常简单,就是看一看呀,你的请求参数中有没有一个叫 osrize 一生的参数,如果有,判断一下你的值是不是叫, 如果是我就放行,否则我就拦截,非常简单吧。这里呢,重要的不是拦截的逻辑,重要的是我们怎么去写过滤器啊。好,那下面呢,我们就在 id 二里来实现一下,我们在这呢新建一个类,就叫 author rise futer, 就是做一个登录认证的这样过滤器啊,那我们把它放大啊,我肯定要做的第一件事就是实现一个接口,叫 global futer 啊,这个有一个方法让我们去实现,就叫 futer 啊,好,那我该怎么去做呢? 逻辑是这样子的,第一步呢,我们要获取请求参数,因为你要去判断请求参数当中的那个 osrry 的一声嘛,对不对?所以你还要去干什么? 过去参数中的那个 authorization 参数,对吧,然后去判断参数值是否等于 admin, 这是我们刚刚那个 ppt 中要求的逻辑嘛。好,那如果等呢? 啊,是想等,那要干嘛?是不是放行?那如果不等呢?走拦截吧。逻辑还是很简单的吧, 但这里面的 api 啊,大家比较陌生啊,强调一下,我们的网关里边采用的都是基于 wiflux 的 api, 响应是编程的,没有大家以前所熟悉的那些 sorry 的一篇了,所以大家肯定不会写,没关系,你看我怎么写,将来啊,你多练两遍就可以了啊。好,第一步,通过上下文获取请求 exchange 点 get request, 这个动作呢,可以让我们拿到 request 对象,但是呢,它不是塞罗拉特里边那个 request。 好,第二步,或许请求参数 request 点 get, 这里边请求参数叫 query perm, 华为拍二马查询参数,而这个哥们的返回值是一个迈普,而且这个迈普还有点特殊, 当然他肯定还是 ky 六结构, k 呢,就是我们的参数名称,值呢,就是对应的值。那我们通过 parames 点去 get 去取,取的时候有两个方法啊,我们一般会选第二个 get first, 就是从里边取出第一个匹配的 谁为谁匹配这个参数名啊? authorization, 那么这样呢,我就能得到一个参数值,对吧? 比如说就叫 out 吧,那下边呢,我就可以做判断了。判断大家就非常熟悉了吧,我们通过 adaman 点 ecose ouse 来做一个判断啊,那判断这样相等,那我肯定要放行,否则我就拦截 好。放行的代码该怎么写呢?我们刚才聊过了,放行就是要欠欠,里边有一个 api, 非常的简单,就叫 fute, 他只有这一个 api field, 那么这个方法参数就是 x 庆值看到没有?也就是说,当你掉 feelt 那一刻,其实啊,他是从这个过滤器链里找到下一个过滤器,掉下个过滤器的 feelt 方法,所以就等于放行了, 而 feel 特方法的返回值,同学们看就是 melo。 因此呢,我把这个哥们的结果 节干嘛呀? return, 这就放行了。好,那拦截怎么拦截呢?拦截也很简单啊,拦截的方式呢,其实就是直接通过 x change 得到 response, 然后干什么呢?直接来一个结束 set complete, complete 不就结束了吗?你看他的反围值是不是 mono 啊,哎,到这就被拦截了,就不往后走了。 但是呢,这样拦截的话,用户得到的体验不好,为什么呀?他看不到结果,哎,我怎么就结束了呢?所以一般情况下,除了这个拦截以外, 我们还会做一件事情,就是设置状态码, 让用户看起来比较友好。那怎么 样给一个响应,结果是状态码了,同样是拿到瑞斯棒思对象,然后它里边有这么一个方法,叫 sad statist code, 这个 statist code 就是状态码的意思。状态码呢,我们这里是成 呃四零幺,因为在 rats for 当中啊,四零幺代表的就是未登录啊。大家以前学习过 rats for, 应该知道这个状态码值对不对。四零幺不知道也没关系,我现在告诉你,记住就行了。 但是你可以看到这里报错啊,因为我们给的是印他,人家要的是 htdp status。 htdp status 是个美局看点, 这里有很多啊,其中未登录就叫 an authorize, 因为 authorize 代表的是认证,安 authorize 就是未认证,也就是未登录的意思,你点进去 看一眼四零幺吧,没问题。那这样状态码就配好了。那现在呢?整个过滤器的过滤逻辑我们就写完了。最后为了让过滤器生效,我们还需要做两件事,第一,定义 component 组件,这样呢,把它注入到 spring 当中,作为一个 bing。 第二呢,加上一个注解,叫凹得,凹得注解了,是一个顺序注解,他里边需要给一个印特值,比如说零或者是一什么的,他的默认值是二十一亿四千七百四十八万,这个玩意是干什么的呢? 同学们想你可以定一个过滤器,别人是不是也可以啊?将来我有很多很多过滤器,那执行的时候谁先执行,谁后执行呢?就是靠这个 out 来定义的这个值, 他越小,优先级越高,所以你现在看到这个二十一亿,他反而是优先级最低的,那富的二十一亿是优先级最高的。 那这块呢,我比如说就给个负一就可以了。过滤器的顺序啊,除了可以通过注解指定,还可以通过接口来指定实现一个接口叫奥得的,看到了吗? 这个接口啊,你如果去实现他的话,你会发现他的方法就叫 get out, 反为之也是印他,所以你在这写负一,跟你在上面写注解力负一完全一样效果, 两种都行啊,同学们,我把注解注掉吧,那这样呢,我就保留这个带接口的吧。好吧,我们用一种就行了啊,到这呢,整个过滤器就定义完毕了,我们呢重启一下。 好的,那下边呢,我们就去访问一下网关,我们打开浏览器在这呢,我们来访问一下, 我们发现报了一个四零幺,是不是不让访问呀,那现在呢,我们给他加上一个参数啊,叫 author risation admin, 可以看到成功访问了吧,但是如果我这改错了啊,乱七八糟走是不是又不行了?好,那这样呢,我们就实现了网关的一个自定义过滤器了啊,并且实现了一个简单的 登录逻辑,当然你在实际开发当中,你的逻辑肯定不会这么简单啊,你是读赛事也好还是干什么也好?都行,你就按照我们刚才的写法去做就行了啊。好的,我们回到 ppt, 那么过了, 游戏的定义方式呢,就是现在我们看到这个方式用一个类去实现格鲁博 fute, 然后通过 x 欠制获取数据做教验,最后呢,通过欠呢去做一个放行啊, 并且呢,定义完了以后要通过 component 定义组件,然后再通过 old 定义顺序,可以用注解也可以实现接口。 好,那么最后总结一下全局过滤器的作用是什么呀?哎,就是拦截所有进入网关的请求或者从微服务返回的响应吧。 当然我们刚才没有管响应啊,只是在管请求。那么他的他与前边的过滤器的区别在于,他的业务逻辑完全由我们自己来定义啊。呃,实现的步骤呢,就是第一实现格鲁博菲特的借口,第二 给这个接口编写一些业务逻辑。当然第三呢,还要给他加这个注解来定义顺序,记住,过滤器一定要有顺序。好,这节课就到这里。