浅谈 spring web flux 第一期 spring web flux 是 spring 五开始增加的,反应,是 web 框架。要说 web flux, 必须先简要说明什么是反应式,以及一些 i o 的基础知识。 什么是反应式编程字面来说就是对变化做出反应的编程模型,比如对 i o 事件做出反应,对鼠标事件做出反应。 反应式编程有下面两个重要口号, don't call us, we'll call you。 意为不要调用方法后等待某些事件发生, 而是等待事件发生后通知你 don't block me, 不要阻塞我反应是编程,是非阻塞的。再来简单说说 i o 这一块课题较大。防杠精提示,这里只是浅显介绍,不够全面, 不够深刻。我们要知道的最重要的一点是,现代计算机由于 dma 的应用,当 i o 操作发生时, cpu 是很闲的。 dma 全称是直接内存访问, dmag 可以指直接存取数据,这种内存访问的计算机技术,又可以指实现该技术的硬件模块。来看看这张简图,简单描述了应用程序发起网络请求时的 dma 和 cpu 负责的工作。 可以简单理解为 dma 是 cpu 请的代理,用来处理 io 数据, cpu 自己只负责最终把数据从内核空间拷贝到用户空间。 i o 操作会涉及到内存空间里面的用户空间和内核空间转换。计算机内存条并不区分什么用户空间。内核空间这个 概念是操作系统带来的,操作系统的核心代码相关内存操作在内核空间,其他应用程序相关内存操作在用户空间。所以我们的 java 应用程序也在用户空间里面。 为什么这么做?内存是很严肃的一件事情,如果系统程序和用户程序在同一片内存空间里面打的火热,乐意程序很容易篡改内存数据,直接破坏操作系统的运行。很多外挂程序就是通过修改游戏程序的内存数据来实现,一刀九千九百九十九。 既然发生 i o 操作时 c p u 很闲,如果我们的耗时主要发生在 i o 操作,有没有一种可能,我们通过一个现成轮寻所有的 i o 事件,当 i o 事件发生时,再通过一组现成去处理,这 这样岂不是能用更少的县城去处理更大兵法 web fox 就是基于这样的情况下产生的。当然这里面还涉及了 i o 服用相关的知识,但是这里就不赘述了。 传统的应用程序现成的请求和处理流程,就好像这样,一个用户请求开启一个现成,然后在这个现成里面可能又请求了其他 io 操作, 比如访问数据库、调用第三方云服务等等,这些都跟本机 cpu 运行无关,但是这个县城会等到这些所有 io 操作完成才会返回县城池。如果我们的县城数是五个,当第六个用户来的时候,其他五个请求还未完成的话,我们将无县城可用。 对于 web flux 来说,大致就像是这张图,我们利用事件循环来处理 i o 操作,无论是用户 请求我们,还是我们请求第三方服务,都交由 i o 循环去处理,通常这占用一个或两个县城,而所有对应的操作我们都注册为 i o 事件的回调,当事件发生时会调用相关方法, 由于基本都是 io 操作,我们的逻辑处理速度将会非常快。对于处理回调的工作线程,通常只需要设置为和 cpu 核心数目相等即可。 这么说来, web flocks 简直是淫蛋,应该不顾三七二十一去用吗?现在又有哪些应用用了 web flocks 或者使用了反应式编程的思想? 请听下回分解。好了,这就是本期内容,如有错漏,欢迎评论区留言。
粉丝1770获赞9710

spring mvc 和 spring web flux 是两种构建 web 应用程序的不同方法。 spring mvc 是基于传统同步组色的编程方式,适用于中小规模的应用,每个请求都需要一个独立的县城,可能导致资源浪费。 相比之下, spring web plus 是基于响应式编程,支持异步非阻塞处理,适用于高并发实时性要求的场景,能够更有效地利用服务器资源。 spring mvc 使用类似传统 servelate 的编程模型,而 spring web flux 则使用函数式编程和反应式流。 选择使用哪种取决于应用需求。如果你需要传统 vip 应用程序, spring mvc 是稳定的选择。如果你追求高并发、实时通信等特性,或 不想尝试想应试编程,那么 spring web flux 是更适合的。总之,根据应用需求和开发者熟悉程度,选择适合的框架来构建 web 应用程序。

各位,刚才呢,我们介绍到了什么是响应式编程,包括通过一段简单的 java 代码做了一个基本实现,那我们下面继续咱还是学习这个响应式编程, 然后咱下面要讲什么呢?给各位做一个说明,就是咱们刚才提到我们用这个外部 flags, 它就是一个叫做详事编程的这么一个框架, 它是一个叫翼部非阻塞核心,就是 rerecter 的项目 a 派进行实现的。而我们下面就来讲这个叫 rerecter, 它里边呢相关 api 该怎么进行我们的详细编程的编写,包括咱们后面要写代码,也是居这个 regret 框架中的 api 进行实现,所以咱下面就来讲一下这个 regret 实现讲式编程,给各位做一个说明。我这里强调在 rewrite 里边呢,有很多相关的内容,而咱们讲的是为了满足我们的 web five 使用进行讲解。那我们下面讲这个 rewrite 的个性编程, 那这个是什么东西?给各位来说一下啊?首先我写第一句话,就是在我们这个响应式编程的操作中,基本上都要去满足这么一种规范, 注意是一种规范,就是一种规则,而这个规则它叫什么呢?它叫做 rerective r e a c t i v e 满足这么一种规范。而我们现在注意啊,咱们先 现在使用这个叫 rewrite, 就是满足这种规范的这么一个框架, 而我们的 web flags 的核心就是 rewrite 里边 api 进行实现的,所以咱们现在就讲这个 rewrite 到底该怎么去使用,这是啊,我们要说的这么一个内容,然后下面给各位句来说明, 我这里写第二句话啊,大家记住,在我们的 drew writer 里边呢,有两个 核心的类,哪两个类呢?一个类叫做 mono, 还有一个类叫做 flags 这两个类。注意啊,有这两类,这两个类他们都怎么样都继承了, 或者说都实现了一个接口,这接口叫 publish, 这接口各位应该很熟悉啊,咱刚才写那个 jover 九中看到这个东西, publish 作为那个发布者,或者说这个操作啊,给我实验了这个接口, 然后这里边我强调,因为咱们后面要写代码中,主要是针对这两类操作,一个叫 mono, 一个叫这个 flags, 而这两类什么意思呢?给大家强调,就这两类中呢,他们提供的就是 丰富的这个叫做相关的操作符,能实现我们这个函数式变成做法。而这两类的特点是什么?我强调,首先咱们看里边这个叫 flax 这个类, 这个类对象它代表什么呢?就是他能够返回你的 n 个元素,将你的这个 top 作为数者,他能实现我们这个发布者。 我写一下啊,这个对象实验的是发布者,他可以返回我们的就是 n 个元素,这个啊,是他一个基本的描述,一会咱们通过代码给各位都会演出来。然后还有一个叫 mono, 这 mono 也可以实现 发布者, 然后它可以反映什么,就是这个零或者一个元素,这是两个最大区别,就是你记住 flux 能返回多个元素,而 mono 只能返回零, 就是空的,或者说一个元素,这是啊里面的特点。然后这个说完之后,咱继续往下来看啊, 就是现在呢,我们通在这个操作中呢,在这个 mono 法里边都提供了丰富的 api, 可以进行我们那个练式编程操作。 但是呢在操作中咱可以指定他用哪个线程进行操作,如果你不指定他默认调的就是咱们刚才接那个方法叫 subscrib, 就是做那个定位的方法,然后在里边进行执行。这个啊是我们提到的这两个对象,一个叫 flags, 一个叫 mono, 你把这特点给他先知道,然后这个说完之后,下面呢给各位我来画两个图,把这两个特点给大家再解释一下,包括说一下里面一些相关的一些术语,然后咱 会就咱代码把这个做一个具体说明。那我来说一下啊,就是在这个操作中呢,咱刚才也说到显示编程里面有个词叫做数据流, 而这个 flags 和 mono 都可以发送这种数据信号,它里边包含有这么三种数据信号。那这句话我写一下啊,就这句话我说的过程中呢,大家会觉得里边有很多的术语,这术语如果说各位不理解没有关系,咱慢慢去理解,因为里边很多东西 比较抽象,咱只有通过具体效果才能更好理解这些东西。然后写一下啊,就这句话, flags 还有这个 mono, 他们都是这个数据流的,这个发布 就是他们都可以实现这个发布者。然后这里边呢,咱使用这个 flags 还有这个 mono, 他们都可以发出有三种,这个就是数据的信号,就通过信号然后做掐处理。然后这个三种信号分别是什么?给各位来说一下啊。首先里边的第一个他叫做 元素值,这好理解,比如你现在是一是二还是三,这叫值。第二个叫做错误信号, 什么叫错误信号?说的简单点,比如你现在有异常了,什么叫错误信号?还有一个叫完成信号,就是现在这个操作已经结束了,这叫完成信号。而在这过程中,各位记住,错误信号还有完成信号 都代表什么?都是终止信号,都代表我们现在这个操作就是终止,就是他表示这个终止信号, 这个啊,各位给他知道。而我们完成信号用于就是终止信号,用于告知你这个定位者该数据流已经结束了。 终止信号我写一下啊,它用于就是告诉我们那个 订阅者,就是你这个数据流已经正常的结束了,而错误信号呢?它是终止信号,它同时会将错误传递给你的定位者,比如说现在啊,我再说一遍,什么意思啊?这很 抽象,就是现在这个 flags 和 mono, 他们都是数据流的发布者,就都可以作为发布者,而使用 flags 也好,使用 mono 也好,都可以。同时就是都可以发出三种数据信号,不是同时啊, 而三种信号有元素值,就是你的具体值,比如一二三四。错误信号,比如异常了,包括完成信号,但是这里边你要知道,错误信号和完成信号都代表终止信号。什么叫终止信号?就是告诉你定位者数据流已经结束了,而错误信号 写下啊,错误信号他也是终止信号,但是他这过程中会怎么做呢?就是他可以终止你这个数据流,然后同时把错误的信息 会传递给我们的订阅者。这个啊是里边这个关于他的信号的特点,各位把这给他做个了解。 然后这个说完之后,下面给大家画两个图,咱就画一下这个 flags, 还有这个 mono, 他这个就是相关特点。咱提到 flags 是发布 n 个元素,然后这个就是返回 n 个元素,然后 mono 是返回零到一个元素。那咱们来画一下啊, 比如现在我要画这个叫 flags, 然后在里边,比如现在我这么来画啊,我这位置呢就画这么一个箭头, 换个箭头, 然后在箭头里边呢,比如现在这位置呢, 我画上这么几个,就是具体这些元素值,比如说现在我就画这么几个啊,咱就画这么三个元素值,然后这位置我再画一条这么一个竖线,这个值我们就代表我给标个号,比如这是 一,这是二,这是三,然后这个就是 flags 一个计算特点。而这个特点是什么意思呢?大家看到这里边我这个箭头就表一个, 就是时间轴,然后他现在就是连续发送的一、二、三有三个源头值,以一个 完成信号,这里边我这条竖线就代表完成信号,他可以告知定位者现在数据都已经结束了,这就是 flax 做的特点,可以发送 n 个元素,然后这里边表示他结束。另外给大家画一个这个 叫 mono。 mono 什么意思呢?它可以发送零个或者一个这么一个元素。比如现在我要画一下 这位置有一个箭头,然后这里边我有一个元素,然后这里边是我们那个 终止信号加元素值,就这个一,这就是 monda 特点,它就是发送了一个元素之后,又发送了一个完成信号,表示数据流已经结束了,他会把这过程告知定位者数据流结束,这就是 flags 和 monda 这么一个基本特点, 各位把这给他知道啊,你看并不复杂,你记住这个特点, flags n 个元素, mono 零个或者一个元素, 这个咱们画的两个简图,这个做了一个说明,然后这个说完之后,咱们继续往下来看啊,然后下面看什么呢?给各位做一个说明, 就是现在呢,咱把这个基本概念说完之后,然后下面咱就通过几段代码给大家简单演示一下里面的特点。你刚才提到 我们的外国 flags 核心是据这个 regret 里面 a p i 实验这个显示编程。而在 regret 中两个核心类,一个叫 mono, 一个叫 flocks, flock 返回 n 个元素, mono 返回零到一个元素,两个都可以作为八步折。另外他们信号这个相关特点。 那么下面咱通过一段代码给各位把这效果咱做一个基本演示,解一下。第四个啊,咱就通过 代码来演示一下这个 flags, 还有这个 mono。 那怎么演示给各位?我来做一个具体说明。 比如现在啊,咱们还是来到我们这个项目中,在里边呢。首先第一部分,咱在这位置,我们先引入这么一个依赖,因为咱用到这个 rewrite 里边需要一个依赖,那我的依赖我就在里边,咱就直接引入一下, 我就写到这位置啊,因为这位置我们是基于 maywin, 刚才提到咱们项目中这个牵制知识中有这个 maywin, 然后在里边我写上这么依赖,他,应该叫艾欧点,这个 啊,应该叫我写一下啊,它叫 i o 点 project, 这个 re rector, 就这个啊, re rewriter, 然后在里边它那名字应该叫 rewriter, 这个寇就是核心 下面加上他的版本,比如咱用这个,呃,三点一点五啊,用这个版本,这样的话,把这依赖我们就引进来了啊,就这么一个啊,把这个咱们加上,就代码演示加步骤,第一步 引入 rewrite 那个依赖这个依赖,然后引入之后在里边咱就写下这个基本代码,代码很简单,就咱们验证一下 flag 词多个元素, mono 零到一个元素, 咱们来看一下啊,就是这位置我在里边呢,现在我在创建这么一个类,比如这个类我就叫 test, 这个 rerete 就是它啊,然后在里边我就写一个焖方法,在焖方耳中咱们首先用这个 flags, 用法很简单,我就加一个叫 flags, 你看它的包在这个 regret 核心包中,在 flags 中呢,有一个最基本方法叫这个 justin, 在 just 中呢,大家发现改成这个参数 是不是可变参数里边你可以加多个值,比如现在我加上就是一二三四,现在我们通过 flux 向里边就可以 发送,就是动物元素。然后这里边还有一个叫 mono, 跟他一样点 just 的,比如里边我加个一,他就发送,就是这么返回一个元素,这个啊,就是一个基本的演示,这里边 我们就是用了一个最基本的方法叫炸的方法,炸的方法是一种比较直接的声明数据流的方式,但是里边还有掐方式,就是他有更丰富方法可以做到。那下面给各位也做演示,比如这里边我们基于这个 数组或者集合等等方式,咱也可以做这操作啊,那我来写一下啊,大家写个注释,咱们现在就学这个 reject 中的核心的语法,或者咱们一会用外包 flax 做准备,这些都是技术知识。第一个用里边这个 炸死的方法,可以直接去声明我们这个相关的这个元素,然后第二部分咱再用加方法,就是其他的方法。那加方法给各位写下啊,比如我现在啊,我在里边 给他就是声明这些数组的这个元素,数组元素进行这么一个传递或者发送。那怎么做呢?咱先看 flags 里边有个方法,这个方法叫做 prom a 瑞, 大家看到 a 瑞 是不是数组啊?然后里边你可以团个数组,比如现在我就定一个数组,然后就来一个 in tiger, 有这个数组,我就叫这个和瑞,等于我们这个数组的值。比如这里边我就写几个,比如这一二三四,然后把这数组给他放到里边去,这就是声明这么一个数组。这个啊,各位都知道,咱用数组给他进行操作, 创建这么一个数组的数据流,然后创建之后,比如现在里边我可以创一个叫集合。那 跟上面类似,我们来一个 flags 里边一个方法叫这个 from, 就是用它,然后用这个可以实现,我们操作 it able, 用它用实现,然后在里边我们加上一个集合,来一个叫 in tiger, 那集合起名叫 list, 比如咱们就是妞,上一个,呃,咱就不妞了,直接我这么来写啊,加一个 a race, 点这个 is list, 里边加上我们这个数组,然后咱们把这集合放到咱这个方法中来, list from 比特 able 啊,用它可以创建或者声明这个集合形式这种数据流,这个啊,我们给他做到了,然后这个做到之后,在里边 边也能称为一个就是 stream 流的方式。那我们来写一下,在 flags 里边有个方法,这个方法跟上面都一样,它叫 from stream, 里边加上一个 stream 流,那咱们声明一个 stream 流 stream, 然后在里边我们加上有来一个范型,就这个 in tiger, 这里边起个名字叫这个 stream, 等于咱就是写一个 list, 把它变成我们这个 stream, 这个啊是我们写的这么一个结构,然后咱们把这个 stream 直接给它放进来,这样的话就声明这么一个 stream 的这么一种留的方式。这个啊,我们做了一个基本说明 啊,这里有个 后啊,这里写错了,应该是 list 小写。然后这样的话呢,我们就用其他方法做了一个声明,包括最直接的这次方法,数组的包抹瑞 集合的 from 比特 able, 包括这个留的 from three。 这样的话啊,咱们用了里边基本方法,把这个最基本效果给各位做演示,所以通过演示各位知道这个基本特点,就关于这个 flags 还有 mono 的这个特点, 这个啊,给各位拿过来就是里边的第二步,咱就编写这个代码, 把这个做到。这样的话啊,咱就做了一个进行演示,然后演示之后咱们继续往下来看啊,看一下它掐方式。我这里提到啊,刚才咱们说到在我们这个不管是 flag 还是这个 mono, 他们都可以发送有这么三种信号,但是三种信号注意啊,他们并不是一定都要具备的,他们有一些相关的特点,给各位我来做个说明,比如里边的第五句话,咱们来说一下啊。第五部分 给大家说一下,就是三种信号里边一些相关的特点。首先鬼注意啊,就是第一句话, 就这个错误信号和完成信号,咱说到他们代表是不都是终止信号,但是两者不能同时共存,就是里边呢,你不能既有错误信号又有终止信号,因为两个信号都代表我们的这个可以终止。这个啊是我们说的第一个啊, 好,写一下,我晓这位置,就是第一句话,这个错误信号说的严禁点啊。还有一个叫完成信号,他们都是这个终止信号,但是他们是不能 共存到,这是第一句话。然后这里边强调啊,就是如果说啊,你没有发出任何元素值,而是直接发出一个完成的错误信号,那就表示他是一个空的数据流, 什么意思呢?比如我现在这里边,我没有前面这个值,只有一个完成型号,或者说有一个错误型号,那表示目前是一个空的数据流, 应该好一点,直接完成里面没有纸就是空的。然后另外如果说我们现在没有错误信号,也没有完成信号,那我现在这个数据流那 就是无限的,可以一直执行下去啊,这个啊是咱说的另外两个特点,我在里边写一下第二句话,如果说咱没有发送 任何的这么一个元素值,而这里边而是直接发送这个错误或者这个完成 信号,那就表示我现在是一个空的一个数据流。然后最后一句话刚才我说到了,如果说我现在没有错误信号, 也没有这个完成信号,那表示他是一个叫无限的这么一个数据流,这是关于啊三种信号 它里面一些相关特点,咱们把这个给各位做了一个说明啊,各位大家知道啊,然后刚才提到一个叫错误信号,那错误信号怎么发呢?其实就是咱们啊 new 一个一个 serpent, 一个异常,就是我写一下啊,在我们的这个 flags 或者 model 里边都有一个方法,就叫什么 idol, idol 里边呢,你 new 个一个 serpent 里面加一条信息,这样的话就有个错误型号啊,就这么一个基本发送。所以这个啊是关于里边一些最基本的语法,各位把这个给到知道啊, 然后这里边啊,我们现在就把这个做了一个说明,就关于这个 flags 和这个 mono 中一些最基本的语法,通过我的演示,各位把这特点给他知道。但是这个过程中呢,就是咱们刚才讲 讲到那个 java 九或者 java 八的一个特点,他们特点都是一样的,就是现在你说这过程中,因为他叫响式编程,在你做响式编程中,如果说你现在不进行订阅,他肯定是不会进行任何的输出的。那比如说给各位演示一下啊, 比如现在我就以上面为例,然后我向上面 vlog, vlogs 里边有四个元素, monda 里边有一个元素,而我现在把它做一个输出。比如现在我一运行这个程序来看它有什么特点, 大家看只有一段日志是没有输出,而我现在为什么有输出?因为你现在没有进行订阅,你只有订阅之后才能进行输出。那怎么订阅?咱们写一下,在里面有个方法,就咱们店内方法叫 scribble, 然后在里边咱可以给他做输出,比如里边用我们那个扎二八的写法啊,我来一个 sisterm alt, 然后冒号加上这个 print, 这样的话就是把它做了这么一个输出, 这个啊就给他进行了一个订阅,包括下面这个,跟他一样,我们也是做个订阅,把这个写下啊,然后写完之后,最终我们做一个执行,咱们看一下这个特点, 大家看,哎,我这位置应该做一个,你看啊,来做一个换行就可以,咱们换行也看到一二三四,后面是一,现在是不是输出了,所以各位记住这个特点啊,我们现在不管你是用 flags 还是 mono 掉这炸的方法或者其他方法也好,他仅仅是声明这个数据流,而此时数据流元素 并没有发出,只有当你调这个叫 sub three, 这个方法就是调这个订阅方法之后才会触发拘留,所以说当你在没定位之前,他是什么都不会发生的。这是里边的这么一个特点。我把这个代码给各位截过来,然后这句话给各位写一下啊, 就是里边的第六句话写下,就是我们现在调用这个 just 或者其他的方法, 你现在只是声明了这个数据流,但是现在你这个数据流他并没有进行这么一个发出,就并没有发出这个数据流。 而我现在只有说你进行了订阅之后,他才能够就是才会触发这个数据流,你不订阅, 注意不订阅它是什么都不会发生的这一个特点,而怎么订阅,那刚才也说到了,我们调这个 sub script 方法做一个订阅, 这个啊,大家把这个记住,所以现在咱就说了这个 regret 里边的核心编程,主要讲到了 flags, 还有这个 mono 两个这个核心的类,一个是对应 返回 n 个元素,一个对应返回这个零到一个元素,这个啊我们就说完了。然后这些都说完之后呢,在我们的 regret 中呢,还有最后 后一部分可以内容,这份内容咱们后面代码都会写到给各位也做个说明,就是第七部内容,关于 re red 中一些叫操作符的一些操作。那操作符什么叫操作符?给大家解释一下啊?我就举一个比较通俗的例子啊, 给大家注意。首先我比如说我们现在啊对数据流,在他发送过程中,这个过程中对这些数据流我们肯定要尊敬,相应的各种处理他就好比说我们在电视上或者在实习中,咱都建了个地方叫工厂,那个流水线 我应该都见过,你说流水线上是干什么?比如现在我拿一个原料从你流水线的入口进入,在过程中经过多道工序的加工,最终出来是一个成品, 这过程将于我们现在做这个操作服,他就是对我这个数据流进行各种加工,最终得到我们想的结果。而流水线上的一道道工序就相于我们现在这个操作服。 这个啊是一个描述,就对你的数据流进行各种的处理,就能得到你想的结果,这个就叫操作符。我写一下啊,对我们的数据流进行就是 一道道的这么一个操作,这个一道道操作就称为这个 操作符。比如说我们那个工厂的流水线就是一个典型的操作符,例子,你最终你把原料进入,要得到你的成品这个啊操作符。而操作符中呢? 在这个 reject 中有很多,我给大家介绍两个最常见的,比如咱们后面要用到操作符,但我强调啊,操作符的代码并不复杂,主要这个思路他比较抽象,希望各位尝试去理解。如果还不理解,咱后面会写这个具体这个 外部法工的案例给各位,会再做一个说明。那我们来说一下操作符,首先我们说第一个常见的,然后再说第二个常见的,第一个常见操作符,它叫 map, 然后第二个操作谱叫 flight map, 这是两个比较常见的,也是咱们后面要用到的。 那这两个什么意思?给各位来说一下啊?首先看第一个叫 map, 它什么意思?就是现在我们要把我们这个 元素映射为你的新的一个元素,这叫 map, 然后里边还有一个叫 flight map, 它什么意思?它叫表示把你的元素映射为你的瘤 啊,这是两个内容,那什么意思?我们先看这个 map, 看它是什么意思,给各位啊做个说明, 那我来强调啊,他的含义是什么?比如现在啊,我们操作中,那我下面呢,给各位我来举一个具体例子啊,咱们来做个说明,那咱们啊这位置我们先看这么一个地方, 咱们看一下啊,我这里面一张图就关于这个 map 的操作符,他是什么意思呢?咱看这张图上啊,在这张图上呢,就是上方的箭头表一个 轴,下方是经过出力之后数据序列那个实验轴就是现在你看我现在有这么几个 元素,然后我元素经过我的脉泡处理之后变成一个新的元素,就这个特点,举个例子啊,比如我现在这几个元素是一、二、三、三个元素,他们的值就是一、二、三。而我经过脉泡想做操作,我想把一、二、三每个值做一个,就是 就是可以说就是相乘的操作。比如给他做一个平方的操作,那我一平方还是一二平方变成四,三平方变成六,这时候就变成了新的元素,这过程就是脉搏要做的事情。 给各位啊,我进一步来说一下啊,这现在我给大家画个图,把这个 map 到底干什么?说一下, 就是把你的元素变成个新的元素,加我现在三个元素值,就是这个一,这是二,这是三。而我经过脉搏,脉搏里边呢,比如现在我想做个操作,让这值 做一个平方的操作,比如这个值假如说边上是爱,让我让爱乘以爱,那他做了平方操作之后,他的新的元素是非常变化,一的平方是一,二的平方是四, 三的平方变成是不是九啊?是九,这样的话咱们做就是麦克族的事情,把你的元素变成新的元素 啊,就是这么一个基本特点,各位把这个的知道啊,咱说的 map, 这么一个运算符,这个图给各位截过来,大家把这给他。要知道 啊,包括咱们一会在用 y flag 代码中会写到这个预算符叫 map, 然后除了 map 之后呢,下面我们还要预算符,它叫 flat map, 那 flat map 是什么意思?给各位做个说明。那这里边还有一张图,这张图,那么它打开我们来看一下啊,这个图什么意思?给各位截过来啊, 然后咱们看啊,大家看跟刚才类似, flag map 什么意思呢?它就可以将每个元素 映射为一个流,或者转换为一个流,然后把这流合并成一个大的数据流,进行这么一个返回,这个叫 flat 这个 map。 那具体什么意思?给各位也是 举这个,举个例子,假如我现在啊,这里边,比如说我有这么三个元素啊,假如三个元素是我们的这么一个值,假如这个值,比如说,比如说啊,我第一个元素就这个 a、 b、 c, 第二个元素,比如是这个 w q 啊,随便写啊。然后第三个元素,比如是这个什么 a t 硅谷, 大家看目前是不有三个元素,而我现在比如说要做件事情,做什么事情呢?比如现在啊,我想把三个这个元素先变成瘤,就变成我的瘤的方式,用弗拉特卖法,那怎么变?你看现在这过程,比如说 at 硅谷进来,他把这个圆圈这个元素变成瘤, w q 进来变成流, a、 b、 c 进来变成流,然后变成流之后我把这个值再进行输出,就是把 把这个 a t 硅谷 w q, a、 b c 元素变成瘤,然后把瘤做成输出。比如他们输出之后就变成了 at 硅谷 w q, 然后 a、 b、 c, 这是一个大的一个瘤。就咱刚才提到的, 我再说一遍啊,这过程很抽象,他就是把我们的每个元素先变成一个流,因为这里边有三个元素变成是有三个流,然后把三个流会变成一个大流,最终再进行返回。这个过程就是 flat 卖破做的事情。 而他这过程中用在什么地方呢?比如我们在操作中,然后我现在返回查出就是一个对象,大家要返回咱们符合我们的 regret 那个 manner, 或者说 flag 的这种形式,那我给它变成瘤,然后再做进行返回。这个啊叫 blackmap, 各位把它 先知道,咱一会用代码也会做一个具体实现。这个啊是我们提到的第二运算符,也就是把你的多个元素先转成瘤,然后把你的多个瘤合并成一个大瘤 再进行输出。就是咱们看到这个现象,比如说现在 a t 硅谷 w q、 a、 b、 c 三个元素,咱变成三个瘤,把三个瘤合并成一个大瘤再进行输出啊,但是这个瘤可能它没有这个就是不一定有销售顺序,可能是第一个 w q, 可能第一个 a、 b c, 或者第一个可能 at 硅谷, 它里边没有严格的顺序的这种关系,主要把这个元素要变成瘤。那我来写一下啊,他的做法就是把我们的每个元素先转成瘤,然后他再把你转换之后的 多个流合并成一个大的这么一个流,然后把这流最终做返回,这个过程就叫 flat map, 在操作中我们也经常用到,一会咱用代码会具体做一个实现。 所以这个啊是我们说到的关于这个 rewriter 里边的核心编程里边有这么几个基本内容。

好,同学们,接下来呢,我们就进入第三章的学习统一网关,在这一章里我们会了解一下什么是网关,以及为什么我们需要网关。 然后呢,我们还会学习网关的一个具体实现, surpring cloud 给他为了解一下,给他为当中的短言工厂过滤器,工厂全球过滤器等等一些功能。最后呢,我们还会用网关去解决之前所碰到过的跨遇问题啊。好的,那我们下边呢就开始第一部分了解一下网关。 那我们先来看一下我们现在的微服务结构啊,那我们有很多个不同的服务,每个服务呢都需要去访问数据库,完成自己的业务,并且微服务都可以到奈克斯里面完成服务的注册配置的管理。那这个时候当我们微服务内部有相互调用关系时,我们就可以利用甚至 一个组件去做了。而当外部有用户需要访问我们的时候呢,我们就让他直接来发请求到位服务就行了。哎,同学们,这里其实存在一个问题, 我们的微服直接摆在那里,允许任何人发请求来访问,是不是有点不太安全啊? 你要知道不是所有的业务都是对外公开的,有很多的业务属于公司内部的工作人员或者管理人员才可以去访问的吧,结果你现在微服放那里赤裸裸的摆在那,允许任何人来参观,任何人来访问,你觉得你好意思吗? 所以那怎么办呀?我们是不是应该对用户的身份进行个验证啊?你如果说是我们的工作人员或者是 内部人员,那我才允许你进去,哎,看一看我们的敏感业务对吧?否则拦住别进 啊。那谁来做这件事?就是我们这节要学的网关,一切请求一定要先到网关,再到微服,那网关在这里边就可以做到第一件事,身份认证请求来了,先得经过我判断一下你是谁, 那一旦身份认证通过,我是不是就要放行到唯一服务里面去了?那么这个时候问题又来了, 比如说现在这个哥们是来做一个用户的查询功能,那么网关能处理用户查询的业务吗?不能,肯定要把请求转发到对应的处理用户查询的服务,比如说 uzi, 三维斯。 那因此网关必须做一件事了呀,他得根据你的请求判断将来给你扔到优的 sorry 还是扔到奥的 sorry 是吧,这要是弄错了不就出问题了吗?那这个动作我们叫什么呢?叫服的陆游 那,并且呢,同样是 u 的塞维斯可能有多个实力,那请求往后走的过程中,你是不是还要做一个负载均衡啊,从多个实力里边挑一个。 哎,这些都是网关的功能啊,无路由和负载均衡。那么说这些以外啊,网关还有个功能叫请求限流。 什么叫限流呢?相信同学们平常周末可能都会去一些这个游乐场之类的去玩,那比如说这有个什么科技馆或者游乐场,他里边啊,一到周末就会有限流, 比方说,哎,这里现在场馆限速人数是一万人啊,结果是呢,咔咔,周末一下来了很多,来了一两万人,那么不好意思,我这人满了,剩下的人你先在外边等着, 过了时间段出来一部分人了,你剩下的人再进,这就叫什么呀?限流,限制人进入的流量对吧?我的场馆就能容纳这么多,你来多了我受不了啊。 那同样,我们的微服务也是如此,比方说我的微服务能够允许的用户请求量啊,就是五百,结果现在来了两千人,我的网官二话不说,来来来,都进,来来来, 那么这一会我的微服我是不是就玩炸了呀?那不行,那王冠要起到一个作用,限流来看啊,来,走吧,过了五百个了,是不是停,你们剩下的人要么在 等着,要么回去,下次等人少了再来,就是这样的过程,这叫请求。限流其实是对微服务的一种保护措施,所以你看,网关的作用非常的重要, 他其实就是对整个微服的一种保护。那么我们该怎么样去实现网关相关的功能呢?在 suprem 可唠的里边啊,给我们提供了两个组件,都可以来实现这个功能,一个呢是 storeen 可 l 的 ktv, 另外一个呢是 super。 那么这两个功能一个呢是比较新一点的 ktv 啊,是近几个版本中才出现的,而肉呢,是最早的就有的, 那我们到底该选哪一个呢?好肉啊,是基于 soplat 的一种实现,它属于是阻塞式编程, 大家应该知道什么叫阻塞式,以前学 io 有阻塞 io 和非组合 l 对吧?阻塞式编程啊,入的是这种,而我们的 surme cloud ktv 啊,他是基于 suprem 五中提供的 flax 来实现的,而这个东西他属于是一种响应式编程, 非主流的狮子,所以它的性能更好,吞吐能力更强。因此呢,目前来讲啊,我们都会使用 surming clud ktv 来作为网关。 好,这是技术的一个选型啊。行了,那这节课呢就到这里了,我们来做一个总结。广告的作用呢,总共有几点呢?第一是身份的认证和权限的交验,目的是知道让不让你过去。第二让你过去,那我得想办法告诉你要去哪, 是吧?那这个叫请求陆游,那陆游的过程中可能有一个服务,有多个实力,我还要做负载均衡。好,那如果来的人太多了,我还要做一个限流,起到对后边服务的一种保护,那这就是网关的一个作用了,我们这节课就到这里。

找到需要做效果的一针,切掉前面的部分,复制一层冻结针, 百天加冻结针的涂层拉长,再复制多层,根据自己分层数量而定。将车的部位抠出来,抠完后 可以先根据音乐卡点进行动画部分,先在结束的位置给位置属性打一个关键针,再到前面把车的部位挪到框外,动画声音可以框选关键针 i f 九,记得把图层的运动模糊打开, 接着制作后半段开合的卡点动画,原理和前面一样,关键针恰好音乐鼓点即可。我们来制作开合时的车身描边效果,把勾好的图层愈合成,使其成为一个整体。添加查找边缘,点击反转调整曝光,提高对比度,简保合度。添加 下发光,把描边的这一层叠在车身底下,缩小一点,用蒙版画出区域。加点羽化,将刚才前面部分的动画整体打于合成,在结束的位置给旋转和缩放打关键针,到开头的位置进行旋转的幅度和缩放的竖直打关键针, 这里根据自己喜好调整述职,最后在背景添加 cibo 文字背景图和光印素材即可。