粉丝42获赞201
大家好,欢迎来到本次视频,本次视频为大家讲解的是 http 工具类,首先要讲解的方法是 get 方法,它主要负责发送一个 get 请求,我们运行一下运行结果出来了, 方法也可以在最后增加一个参数作为超时时间。接着我们看 post 方法,我们同样运行下,这是运行后的结果,如果把 post 方法传递的参数的类型改为 file 类型,就实现了文件上传功能。我们运行一下这个方法, 然后我们看一下文件下载文件下载的方法名称叫做 download file, 我们运行一下 download file 方法,返回的参数是下载后的文件的大小。接着我们看一下 get my type 方法,它的作用是根据文件名后缀获取 my type 类型,运行一下这个方法。 接下来我们看一下 to parents 方法,运行一下这个方法。 to parents 方法有一个功能相反的方法,它的名字叫做 decode parent map, 我们同样运行下。
平时我们打开网页,比如购物网站某宝,都是点一下列表商品,跳转一下网页就到了商品详情。 从 http 协议的角度来看,就是点一下网页上的某个按钮,前端发一次 http 请求,网站返回一次 http 响应。这种由客户端主动请求服务器响应的方式,也满足大部分网页的功能场景。但有没有发现,这种情况下,服务器从来就不会主动给客户端发一次消息, 就像你喜欢的女生从来不会主动发消息找你一样。但我们假设有那么个场景,你打开浏览器就像往常一样刷网页,这时候右下角突然弹出一个小广告, 提示你一个人在家偷偷才能玩哦!求知,好学、勤奋,这些刻在你 dna 里的东西都动起来了。你点开后发现长相平平无奇的古某提示,你倒是九条狗全服横着 走。影帝某辉老师跟你说,系兄弟就来砍我,来都来了,你就选了个角色进到了游戏界面里,这时候上来就是一个小怪从远处走来,然后疯狂喷火攻击你。你全程没点任何一次鼠标,服务器就自动将怪物的移动数据和攻击数据源源不断发给你了。 这也太暖心了吧!感动之余,问题就来了,像这种看起来服务器主动发消息给客户端的场景是怎么做到的?在真正回答这个问题之前,我们先来聊下一些相关的知识背景。 其实问题的痛点在于,怎么样才能在用户不做任何操作的情况下,网页能收到消息并发生变更。最常见的解决方案是网页的前端代码里不断定时发 http 请求到服务器,服务器收到请求后给客户端响应消息,这其实是一种伪服务器推的形式, 他其实并不是服务器主动发消息到客户端,而是客户端自己不断偷偷请求服务器,只是用户无感知而已。用这种方式的场景也有很多,最常见的就是扫码登录,比如某信的平台登录页面,二维码出现之后, 前端网页根本不知道用户扫没扫,于是不断去向后端服务器询问,看有没有人扫过这个码,而且是以大概一到两秒的间隔去不断发出请求,这样可以保证用户在扫码后能在一到两秒内得到及时的反馈,不至于等太久。这就是 http 定时轮巡。但这样会有两个比较明显的问题, 第一个是当你打开 f 十二页面时,你会发现满屏的 http 请求虽然很小,但这其实也消耗带宽,同时也会增加下游服务器的负担。第二个问题是,最快情况下,用户在扫码后需要等个一到两秒, 正好才触发下一次 http 请求,然后才跳转页面,用户会感到明显的卡顿。那么问题又来了,有没有更好的解决方案?有,而且实现起来成本还非常低,他就是长轮循。 我们知道 http 请求发出后,一般会给服务器留一定的时间作响应,比如三秒,规定时间内没返回,就认为是超时。 如果我们的 http 请求将超时设置的很大,比如三十秒,在这三十秒内,只要服务器收到了扫码请求,就立马返回给客户端网页,如果超时,那就立马发起下一次请求, 这样就减少了 http 请求的个数,并且由于大部分情况下,用户都会在某个三十秒的区间内做扫码操作,所以响应也是及时的,比如某度云网盘就是这么干的。所以你会发现,一扫码,手机上点个确认, 电脑端网页就秒跳转,体验很好,真一举两得。像这种发起一个请求,在较长时间内等待服务器响应的机制,就是所谓的长轮巡机制。我们常用的消息对列 rocket mq 中, 消费者去取数据时也用到了这种方式。像这种在用户不感知的情况下,服务器将数据推送给浏览器的技术,就是所谓的服务器推送技术,他还有个毫不沾边的英文名 tomat 技术,大家听过就好。上面提到的两种解决方案,本质上其实还是客户端主动去取数据, 对于像扫码登录这样的简单场景还能用用,但如果是网页游戏呢?游戏一般会有大量的数据需要从服务器主动推送到客户端,这就得说下 web socket 了。我们知道 tcp 连接的两端,同一时间里,双方都可以主动向对方发送数据,这就是所谓的全双。 而现在使用最广泛的 http, 一点一也是基于 tcp 协议的,同一时间里,客户端和服务器只能有一方主动发数据,这就是所谓的半双弓,也就是说好好的全双弓, tcp 被 http 用成了半双弓。为什么? 这是由于 http 协议设计之初考虑的是看看网页文本的场景,能做到客户端发起请求在由服务器响应就够了,根本就没考虑网页游戏这种客户端和服务器之间都要互相主动发大量数据的场景,所以为了更好地支持这样的场景,我们需要另外一个基于 tcp 的新协议。 于是,新的应用层协议 web socket 就被设计出来了,大家别被这个名字给带偏了。虽然名字带了个 socket, 但其实 socket 和 web socket 之间就跟雷锋和雷峰塔一样,二者接近毫无关系。那么 建立 web socket 连接呢?我们平时刷网页一般都是在浏览器上刷的,一会刷刷图文,这时候用的是 http 协议,一会打开网页游戏,这时候就得切换成我们新介绍的 web socket 协议,一会还得看个视频。 为了兼容这些使用场景,浏览器在 tcp 三次握手建立连接之后,都统一使用 http 协议先进行一次通信。如果此时是普通的 http 请求,那后续双方就还是老样子,继续用普通 http 协议进行交互,这点没啥疑问。 如果这时候是想建立 web socket 连接,就会在 http 请求里带上一些特殊的 hider 头。其中 connection upgrade 表明浏览器想升级协议。从 upgrade web socket 可以看出,客户端想升级成 web socket 协议,同时带上一段随机生成的 base 六四码,也就是 secret web socket key 发给服务器。 如果服务器正好支持升级成 web socket 协议,就会走 web socket 握手流程。同时根据客户端生成的 base 六四码,用某个公开的算法变成另一段字符串,放在 http 响应的 secret web socket accept 头里,同时带上一零一状态码发回点浏览器。 一零一确实不常见,他其实是指协议切换之后,浏览器也用同样的公开算法,将贝斯六四码转成另一段字符串,如果这段字符串跟服务器传回来的字符串一致,那验证通过。 web socket 和 http 一样,都是基于 tcp 的协议,经历了三次 tcp 握手之后,利用 http 协议升级为 web socket 协议,后续双方就使用 web socket 的数据格式进行通信。数据包在 web socket 中被叫做真,我们来看一下它的数据格式长什么样子。这里面字段很多, 但我们只需要关注下面这几个 out code 字段,这个是用来标志这是个什么类型的数据针。比如等于一时是指 text 类型,也就是 dream 类型的数据包等于二十二。禁止数据类型的数据包等于八,是关闭连接的信号。 hello 的字段存放的是我们真正想要传输的数据的长度,单位是字节。比如你要发送的数据是字符串一百一十一,那它的长度就是三。另外可以看到我们存放 pall 的长度的字段有好几个,我们既可以用最前面的七倍,也可以用后面的七加十六倍或七加六四倍。 那么问题就来了,在数据层面大家都是零幺二禁滞留,我怎么知道什么情况下应该读七倍,什么情况下应该读七加十六倍的呢? web socket 会用最开始的七倍做标志位,不管接下来的数据有多大,都先读最先 的七个倍,根据他的取值决定还要不要再读个十六倍或六十四倍。如果最开始的七倍的值是零到一百二十五,那么他就表示了 payload 全部长度,只读最开始的七个倍就完事了。如果最开始的七倍的值是一百二十六,也就是十六进制的零 x 七 e, 那它表示 payload 的长度范围在一百二十六到六万五千五百三十五之间。接下来还需要再读十六 bait, 这十六 bait 会包含 payload 的真实长度。如果最开始的七 bait 的值是一百二十七,也就是十六进制的零 x 七 f, 那它表示 payload 的长度范围大于等于六万五千五百三十六。接下来还需要再读六十四 b, 这六十四 b 会包含 palod 的长度,这能放二的六十四次方霸气的数据,换算一下,好多个 tb 肯定够用了。剩下的就是 paylo data 字段,这里存放的就是真正要 传输的数据,在知道了上面的 payload 长度后,就可以根据这个值去截取对应的数据。大家有没有发现一个小细节, web socket 的数据格式也是消息头加消息体的格式,也就是 payload 加 payload data 的形式。 之前写的既然有 http 协议,为什么还要有 rpc? 提到过, tcp 协议本身就是全双工,但直接使用纯裸 tcp 去传输数据会有粘包的问题。为了解决这个问题,上层协议一般会用消息头加消息体的格式去重新包装要发的数据, 而消息头里一般含有消息体的长度,通过这个长度可以去截取真正的消息体。 h t t p 协议和大部分 r p c 协议以及我们今天介绍的 web socket 协议都是这样设计的。你在网上可能会看到一种说法, web socket 是基于 h t t p 的新协议,其实这并不对,因为 web socket 就 在建立连接时才用到了 http, 升级完成之后就跟 http 没有任何关系了。这就好像你喜欢的女生通过你要到了你大学室友的微信,然后他们自己就聊起来了。你能说这个女生是通过你去跟你室友沟通的吗?不能, 你跟 http 一样,都只是个工具人。这就有点借壳生蛋的那意思。 web socket 完美继承了 tcp 协议的全双功能力,并且还贴心地提供了解决粘包的方案。它适用于需要服务器和客户端频繁交互的大部分场景,比如网页或小程序游戏、 网页聊天室,以及一些类似飞书这样的网页协同办公软件。回到视频开头的问题,在使用 web socket 协议的网页游戏里,怪物移动以及攻击玩家的行为是服务器逻辑产生的,对玩家产生的伤害等数据都需要由服务器主动发送给客户端,客户端获得数, 最后展示对应的效果。好了,到这里, web socket 的知识点就讲完了,总结的事情就交给你们了。
大家好,欢迎来到 logo 教育,我是讲师袁静,那我们继续接着我们课程的学习, 那么接下来呢,我们再来看一下,在我们的 s t t p 请求中,哎,注意不是响应,是请求中,那么这个时候他的报文格式,哎,我们说了,整体的报文格式呢,都是由我们的七十行,然后呢用我们的 hider, 也就是我们的头部级以及我们的 body 主体部分构成。 那么针对于起始航部分,首先呢就是我们的方法,然后是我们请求的目标,也是我们请求的 url, 最后是我们 s p p 的版本号, 那么针对于请求方法这个地方呢,我们不再过多介绍,那么请求目标这一块呢,他其实也是可以有多种的表达形式的,第一呢,他就是可以有一个完整的 ul, 那么有我们的协议,对吧?后面呢有我们具体的主机,然后有我们具体的这个 ul 路径, ok, 那么这样是可以的。当然了,在这个地方呢,我们同样也是可以有一个域名和一个可选的端口来进行构成, 域名和端口构成,那么同样也是可以以信号构成,但是信号这种方式呢,通常我们是配合 options 方法进行使用,那么具体 options 方法表示什么意思呢?一会我们给大家讲到,好吧,大家先知道一下,就是具体我们的形式,可以有这么三组, 哎,完整的 ul, 然后呢也可以由我们的域名加上我们端口号,同时呢也可以由我们的这个信号的方式进行构成,那么信号方式呢,通常呢他表示的是整个服务器,也是我们整个,比如说我们这个域名所对应的这个,哎,主机信息,哎,是这样的一个情况, 那么这是针对我们 s t p 请求,那么针对于响应部分呢,它也是有点不一样,那我们的响应呢?其实呢也是有三部分构成, 这个呢不再给大家累数,然后呢他访问的信息首先有版本,大家一定要注意啊, http 一点一和 http 二点零所对应的性能,那是完全天差地别的性能, ok, 这是我们需要知道的。再就是针对于状态码, ok, 针对于我们的状态文本,这个状态文本呢,其实就是我们的这个元音短语,哎,注意在这呢,我们的状态码通常是给机器看的,给你浏览器看的,能懂吧?那么 状态文本呢,通常是给人看的哎,尤其是我们开发人员来看的,对不对?那有这样一个简单的文本,其实你就知道,哎,到底发生了什么,哎,为什么会执行失败, 对吧?到底是失败还是成功等等, ok, 好,这个这个地方,比如说四零四,那么你就知道四零四呢,通常是我们客户端请求的目标资源,不存在,对不对?那么后面给你一个简短的说明, not found, ok, 好,那再往下呢,就是我们的黑点是头部信息,那么头部信息我们在这需要知道,就是无论是我们请求的头部还是想要的头部呢,他的每一个头部信息都是由多个箭队进行构成的,每个每个箭队我们都可以理解为是一个黑点,那么多个黑点共同组成了黑点丝, 那么这个黑的信息呢,无论是值还是 value 呢,其实都是不区分大小写的, 对吧?然后呢,中间呢,通过冒号相连 t 和 vivo 通过冒号相连,对不对? ok, 好,最后就是 body, 不是所有的响应信息都有 body, 比如说如果说我们的请求方法是黑的,这个时候他就不会有玻璃。 ok, 好,那么下面同学们呢,咱们就可以看一下关于咱们 stp 他请求的常用方法有哪些。那么这个图呢,就基本上描述了我们几乎所有的方法, ok, 那么关于我们的 get 就不用再给大家说了,对吧?因为我们都应该学过这个 restful 风格对不对?你像我们的 get post, put 以及我们的 delete, 在这就不给大家详细介绍,我们着重给大家说什么呢?首先第一个说一下 header, 那么这个 header 方法呢,就是 method 的类型为 header 头,对不对?那这个呢?它其实和我们的 get 有点类似, 干嘛呢?都是用来请求某一个资源这样的方法,但是唯一不同的地方在哪呢?黑的方法呢?他不会返回我们实体的主体部分,也就是你要请求这个目标资源,他不会把这个 body 给你,会把黑的给你, 弄懂吧? ok, 那么返回的 header 有什么好处呢?哎,这样的话就允许我们客户端在没有获得实际资源的情况下,然后呢对我们的资源进行 检查,比如说你不确定这个目标资源他到底是否是安全的,是否被篡改过,对不对?哎,比如说你在不了解我们资源的情况下, 我们就可以使用海胆先来个测试吗?对不对? ok, 然后呢也可以看一下什么呢?还是同样还是做测试,看一下我们想象中的状态码, 那得比方给你个两百啊,还是给你四零四,还是给个五百啊,还是给个三零幺啊,还是给个三零二还是给个四零幺啊,对不对? ok, 可以通过查看我们想的状态码的来看一下 对方是否存在,当然是否错误等等,都是没问题的,是吧?然后呢,经过查看首务,测试一下我们的资源是否被已经修改过了,所以他通常用来我们去测试某一个某一个资源。 ok, 那么在这的朋友们,我们呢可以给大家演示一下,那比如说呢,我们现在要发出一个请求,发出一个请 请求,然后呢,在这呢,我们首先先修改我们请求方式,给它改成 header, 打开我们的 header, 然后呢同样还是就访我们的拉钩教育,然后呢, e d 优点,拉钩点 com, 然后这个时候呢,这样同学们,咱们先发一个 get 请求看一下, 好,那是这是我们发的一个 get 请求,虽然说我们没有给头,但是这个地方呢,他是不是已经把这个头给我们显给我们填充上了,对吧?八个隐藏的头,对不对?八个隐藏的头, ok, 那么这个地方不用看啊,下面是咸阳的头部信息,咸阳的头部信息,然后 cook 信息以以及我们咸阳的整个文档信息都有了, 对不对? ok, 那么如果这个时候呢,我们把这 get 给换成黑的,打开我们的黑的,然后这个时候再一次发请求,那这个时候呢,你会发现我们整个 body 是不是已经没有任何信息了, 对不对?已经没有任何信息了,但是 heather 是有的,然后呢, cookie 也是有的,看到没有,当然锁定的状态是不是也是有的, 没问题吧?也就是说,当我们把这个 message 的类型调整为黑色之后,那么这个时候呢, 起始行是有的, header 是有的,但是 body 就不再给返回给你了,哎,这个时候呢,其实方便我们做一些测试,对吧? ok, 好,那在 put, 这是我们做修改的,这个不用给大家介绍 post, 做一些新增的。 ok, 好,这里面有个 chance, 是这个呢,大家了解一下,因为它的实用性呢,并不高,很多时候呢,我们用不着它,或者说你想用,你发现服务器并不支持 ok, 那么这个请求是干嘛的呢?我们可以看一下,同学们,确实,如果说我们学过这个 supremecolo 的微服这一块,我们应该学过列入追踪技术,对吧?通常就是我们的思路思加 z p, 那么在此路指甲这个 key, 也就是我们的链路,链路追踪技术里面呢,我们应该会接触过两个名词,一个叫 chance id, 一个叫 spa id, 那么 chance id 呢,通常是表示一整个链路,对不对?所以呢,那么句子这个词其实翻译过来的话叫做追踪的意思,对吧?那么它作用是干嘛的呢?其实我们链路追踪 那个是有一点类似的,哎,他干嘛?那么在这朋友们,咱们一起来看一下,通常呢,我们客户单在发出一个请求的时候呢,他其实并不是直接就到达我们目的服务器了,可能要经过我们的防火墙代理或者网关,对吧?或者一些其他的一些代理程序,那么每个节点都有可能修改你原始的 sddd 请求, 比如说我修改的请求头对不对? ok, 那么如果说我们这个时候把 messer 的给调整为 thins, 那么这个时候,这个时候就允许我们的客户端看一下什么呢? 看一下你这个请求发送到服务端的时候,这个请求到底变成了什么样子,哎,可以将你原始的请求和经过这一堆什么防火墙代理及网关之后,这个的请求他到底有什么不同, 能懂吗?哎,所以整个翠色请求其实是干嘛呢?在我们的目的服务器端发起一个还回这样的一个诊诊断, ok, 好,这是他呀,同学们,但是这个呢,需要要求我们服务端是对他进行支持的。我,通常情况下,我们所定的 word 应用很少会支持这样的, 那包括我们这个 postman, 那 postman 呢?它是其实方便我们做 htt 相关的一些测试,你其实发现它这里面也并没有提供我们确实相对那些方法,所以呢,针对确实这个方法呢,大家有一定的了解即可。哎,用它通常也就是诊断对不对? ok, 好,那么下面呢,还有 一个需要我们熟一下,哎,就是 options, options 呢?直接翻译过来叫选项是吧?那么选项,那这个方法它的作用是个门,干嘛呢?它,其实呢, 那你想一下,同学们,他肯定是一个请求对不对?请求到我们的服务端,然后请求的 method 的类型的值为我们的 office, 那么这个时候就表示我们要请求你这个外边服务器都支持哪些功能?换句话来说,你所支持的方法列表有哪些?哎,比如说同学们,在这 同样还是我们的这个 postman, 还是防我们的拉钩教育?这个时候呢,把我们的黑色请求给改成我们的 options, 好,那这个时候呢,你发一个 sin 的,那你会发现同样也是没有任何 body, 没有 body 哎,只是有一个起始行以及我们的 headers 信息,但是这个 headers 信息和刚才 会有一些不一样,哎,同学们注意看,哎,这个地方呢,比如说我们再再来看一下,我们先来看还是看一下黑的,还是看一下黑的?走, 这是我们的 header, 对吧?这是我们的 header, 然后呢,再回来,回来到达我们的 options, 好,再一次 send 好,这是 sand, 好像还是和刚才一样,是吧?是这样,同学们在这里面呢,因为呢,这个协议呢,咱们必须要使用安全的协议,能懂吗?必须要使用安全的协议,所以在这儿我们把它把 http 可以调整为 http s, 然后呢,我们再发一次请求,让 sand 好,那这个时候,同学们,我们注意看这个列表,那么在这个列表里面,哎,你会发现他写的信息就跟他刚才不一样了, server data connection, 这都是刚才有的,对吧? 然后注意看下面 excess ctrl, 然后 allow methods 来允许的方法列表是不是出现了,对吧? post get put, 然后呢? pet, 然后代理的还有 options, 这是我们所支持的方法的列表, 所以具体使用的话,如果要访问拉钩的话,因为拉钩现在本身我们使用就是 a c t, b, s, c a, 对吧? ok, 那么我们就来一个 s, 然后呢,直接将将我们的方法类型调整为 options, 那么这个时候呢,就可以实现。然后呢,看一下在我们拉钩他所指的方法类型有哪些? ok, 好,那同学们呢,这个就是针对 oftens, 那么 delete 啊,这个呢,就不再给大家做过多的介绍,对吧?通常呢用来删除某些指定的资源,那么再往下呢,咱们就可以看一下关于我们的状态码信息,那么状态码大家也比较熟,对吧?状态码比较熟,哎,那么我们来看 看一下针针对状态码的同学们,其实呢,他第一呢要返回状态码,第二呢要返回一个什么?要返回一个短语,元音短语,对不对?但是你知道的是,就是 这个状态码,也就是我们这个数字,哎,通常呢就是便于我们程序进行处理,扣单程序做处理浏览器啊,对吧?或者说你 a 程序调用 b 程序啊,如果使用 http, 那这个时候方便我 a 做对应的业务处理元言短语呢,则方便我们来更加的方便我们程序做调试啊。 ok, 好,下面呢,这个就是针对于我们这一类状态码,如果这个状态码是两百到二百九十九之间,那通常呢是表示的是成功。 ok, 好,那如果三百到三百九十九表示什么资源已经被移走,因为他通常走的是从天下。四百到四百九十九呢,通常是表示客户端这个地方,哎,出现了问题,那五百到五百九十九表示服务端 出现了问题,当然了,这些呢,有些是我们已经定义的,哎,那有一些呢,有些是 w, 三 c 已经定义的,还有一些呢,你可以进行自定义,那么具体 所对应的分类在这呢,哎,整体范围的话,他比较大,对吧?整体范围比较大,那么实际中在使用的其实并不是特别多,比如说以一百到一百九十九为例,通常情况下我们都没有用过,对不对?哎,而且他已经定义了就一个一百和一百零一,通常就是普通的信息提示,在这我们不做过多的伸展, 那么两百到两百九十九在这呢,我们用的比较多的就是两百呗,对不对?他定义的也就是两百到两百零六,通常表示的是成功, ok, 那么三百到三百九十九, 那说已经定义好的就是三百,然后呢到三百零五这六个,对吧?一二三四五就五个,再加上三百呢,对不对?六个, ok, 那么四百到四百九十九,哎,这里面 用了是四百四零零到四幺五这一块,主要是扣单出错,那么其实这个类型大家一定要搞明白,对吧?反正你看到二开头的,对吧?那通常是表示成功呗,三开头的通常是我表示要重新下,那么四开头的扣单出问题了,五开头那就服务端出现了问题, 对不对? ok, 那么常用的就两百,哎,这你更加希望见到,对不对?当然也是最频繁的啊。四零幺,那通常表示的是未授权,哎,我们只要是学过这个 这个权认证这一块,或者说我们的 os two, 哎,通常或者我们是不是 security 应该对这个状态码是非常熟的,对吧?四零幺,那四零幺呢,就提示你未授权吧,对不对?四零四呢,那就是提示我们服务端找不到你这个 ul 锁定的一些资源, 对吧?要么服务端已经删除了,要么就是我们客户端那么请求了一个不存在的啊,这样的一个锁定的资源, 那么关于成功呢?两百,哎,下面这些做一个了解即可。好吧,那么从定向呢?在这呢,我们需要给大家说一下,因为从定向的话,可能我们接触的并不是特别的多,那么从定向状态码呢?通常是三百到三百九十九,对吧? ok, 但是其实常用的只有两个,一个是三零幺,一个是三零二。 那么我们先说一下从印象状态码他所能够体现的作用是什么?那首先我们呢可以通过这个图来看,同学们, 在这呢,我们首先发出一个请求,去请求了某一个资源,然后呢这时候服务端给你做了一个响应,在这个地方他做了一个响应呢,注意看这个状态码给的是多少呢?给的是三零幺, 给他三零幺,然后短语说明呢,说已经木的了,已经把它移除出去了,已经移动了,对不对?并且在头部信息里面加了一个老 casen, 看到没有?加了个老 casen, 这个老 case, 所以是头部 信息。然后呢又给了他正确的资源,比如说同学们,什么意思呢?我第一个请求,比如说我要请求, 我要请求,哎,请求,然后呢张三的图片,张三的图片,对吧?然后呢服务单一看,哎,张三图片不在我这呀,对吧?已经换地方了,对不对?哎,这个时候呢,其实就就会给他一个三零幺, 就会给他三零幺,并且在头部信息里面添加一个 location 这样的一个字段,字段的值呢就等于张三的图片现在的位置,能懂吗?就是一个新的 ul, 那么作为我们浏览器,我看我拿到你这个 这个这个这个响报完之后,我一看,哦,你给的是三零幺,是吧?你给的三零幺,那三零幺的话,也就意味着你需要浏览器做一个冲天象,那做冲天象跳转到哪呢?跳转到就是头部信息老 k 所对应的值,所以我拿到这个值,拿到这个值,然后呢?拿到这个请求, ul 注意看是不是和上面一样,对吧?然后呢,再一次向他 像这个 ul 锁定的服务器发出请求,然后获得响应,这就是整个三零幺,其实换句话来说,就是你要找到资源呢,已经发生了转移,已经变,变更了位置,对吧?但是呢,我不能给你一个四零四,为什么呢?因为他曾经可能在我这, 对不对? ok, 所以的话我给你个三零幺,并且把新的 ul 给你。那浏览器拿到一看三零幺,他就知道了,我需要做跳转。 ok, 那么接下来 我们常用的只有一个三零幺,只有一个三零二,只有这两个,那么这两个使用场景在哪呢?同学们,在这需要跟大家说一下,无论三零幺啊还是三零二,他都可以实现我 门冲一下。那么具体的使用场景,使用场景,比如说呢?我们现在呢,几乎所有的外边应用呢,外边应用都已经支持了,都已经支持了 https, 对不对? ok, 那比如同学们,我们来看一下, 比如说在这呢,老师呢,现在发出一个请求,发出什么请求呢?我在这直接 http, 然后冒号斜杠,斜杠一滴优点,拉勾点 com, 回车, 你看,注意这个响应时间是不是比较长一些,然后回哪了?朋友们,注意看,是不是又回到我拉钩这个位置, 对不对?还是挂,挂了一把锁,对吧?然后呢,我把它作为 ctrl c, 然后打开文档,我们看一下,我们输入的是 h d p, 可是是不是已经变成了 h d p s 了?为什么呢?因为它中间就做了一个三零幺跳转, ok, 所以具体使用场景 的话,就是外边应用呢?都已经外边应用,如果已经支持 hts, 可是足,如果这个时候,那么客户端,那么客户端访问,访问他什么呢? http, 哎,他访的是 sttp e d 优点,拉勾点 com, 那么这个时候呢?服务端,哎,我们服务端收到请求之后,比如说我们的 ngx, 你做最对应的配置之后,他就可以自动的碰到这一类的请求,让他继续重进一下,懂,懂吧? ok, 哎,比如我们的 ndx, ndx, 我们的服务器,啊,不是,服的是服务器,或者叫我们的容器,是吧?服务器 器,哎,收到请求之后呢,那么发现,哎,发现请求的是 s t t p 请求,那么这个时候呢,就可以返回什么呢?返回我们的三零幺或者三零二, 然后呢告知浏览器,那么重新发出请求,发出请求,再发的请求就是 h t t b s 请求,能懂吧? ok, 但是三零幺和三零二呢,有些不同,他们都可以实现跳转的效果,能懂吗?就是我们做了 s t b s 升级之后,哎,你可以指定三零幺,也可以指定三三零二, 都是没有任何问题的,但是有些区别,那么如果是三零幺,如果三零幺,他的表示表什么呢?表示永久性的转移,哎,以后再也不来了,那么永久性的转移,如果是三零二,则表示只是暂时性的转移,那么当然这个其实是 w 三 c 所有 规定的一些规范,那么你怎么用是不取决于你自己啊,对不对?但是这个规范呢,对于搜索引擎他也是支持的,能懂吧?对于搜索引擎他也是支持的, ok, 那么在这我们下面再做一个 具体的描述,好吧, ok, 俩人呢,都是从零下,那么都是浏览器在服务器拿到访问这个 ul 之后,然后去找新的 ull, ok, 这都没问题,这个地址呢,就在我们想要的头部信息,黑的,为什么呢?为老 kissen, 对吧?从这里面,这是他们的共同点,不同点呢?三零幺代表是永久移除, 那么永久移除搜索引擎在抓取新内容的时候,同时会将旧的网址替换为重定向之后的网址, 对吧?这是输出引擎能懂吗?然后三零二呢,表示旧地址还在,那么这个时候输出引擎会干嘛呢?会抓取新的内容而保存在旧的网址,所以对于我们来说应该是哪个?应该是第一个,对不对?三零幺啊, 对吧?哎,你输入引擎肯定要跟我 h t t t p s 绑一块儿,对吧?你不能绑到我 h t t p 下面, 对不对?哎,其实就是这样的一个效果啊。好,下面这些我再给大家过度说明。三零幺,三零二,这两个你只要掌握了就可以了, 那么针对于客户端错误这一块,哎,针对客户端错误这一块,那么通常呢,是我们客户端所请求的,要么服务端不存在,要么不符合我们服务器的规范。那么在这呢,我们可以拿出几个常见的哎,比如说四百 是四百, bad 最快是坏的请求,对吧?其实就是不对的请求,对吧?为什么错误呢?那比如说同学们,如果说我们用死不用 mvc, 那我们用他的一个注解,对吧?我们要求用户必须要填入某个参数,可是这个时候他没有填,这个时候呢,其实就会发生四百这样的一个 bad 最快死的, 对吧? ok, 那么四零幺呢?表示的是未授权,哎,这个我们应该也比较熟,是吧? ok, 啊,那么再往下的话,哎,四零四常见了, 是吧?再往下四四零四就比较常见了。那么还有一个我们经常看到的就是我们的这个 messer 闹得 low, 这方法呢,是不会允许的,对吧?比如说某一个资源,某一个资源呢?我们要求用户必须要发出一个 pose 的请求, 可是如果这个时候你非得用 get 请求,这个时候我们的服务端是不是就给你返回四零五啊,对吧?这个时候就会提示你,你所请求的这该的方法是不被允许的, ok, 所以大家在这一块只需要掌握帅四零幺,然后我们的四零四四零五即可能,懂吧? ok, 好,那么这个呢,就是咱们呃针对于客户端错误码的一个介绍,那么下面呢,就是我们服务端错误码啊,服务端错误码的话,那五百五零二是比较常见的,对不对?五百的话,那就是服务端内部错误了,对不对?那么五零二呢?那五零 二表什么意思呢?哎, bad get 为坏的网关,那么作为代理或者网关使用的服务器,那么从请求响列着下一个什么链条上收到了一个伪响应,对吧? ok, 这个时候就会发生我们的 什么 better get 为 ok, 下面还有具体网关,超时这个了解一下即可。好吧,同学们, ok, 好,那么这个呢,就是针对于咱们 s t d p 带豹纹的所有内容啦,就是 本次课我们主要讲什么 s b 的请求响应,然后呢请求的方法以及我们常用的一些状态码,哎,做一个了解即可,同时其实呢就是帮同学们做一下回顾,好吧。
网络请求超时的两个原因。那现在我的电脑能不能访问运营商呢?我们的电脑现在可不可以上网?客户的网络都没上。测试一下,答案是请求超时的办公网络呢? 答案也是请用方式。都不能上网。为什么不能上网?两个原因,两个原因都能上网, 一个是内网没有去外网的路由。对,这是第一个原因,第二个原因就是运营商没法回复消息说我没有做 nvt, 这里要有个 nat 地质转换,我这没有地质转换。 所以我们要解决两个问题。先解决第一问题,有路由的问题。外部的公网路由我能不能在内部写啊?可不可以我在这边写一个静态路由,比如说写一个法文一百点一零点零的静态路由,下一条给我另外一个核心设备, 可不可以呢?实验环境你这么做没问题,但是真实的网络环境是不可以的,因为供网不可能只有一个一百网络,供网的网络多了去了吧?除了一百之外,还有很多其他的网络,你不可能只法问供网一个一百网,所以这是不现实的。那有同学会觉得我写确实录用,然后写默认录,由 我在内部每台设备我都写一个默认陆游出口做出网不就行吗?写静态陆游可不可以呢?可以啊,如果你用静态陆游就写默认陆游出出去的话是没问题的。所以静态陆游怎么去?静态陆游的话,你直接在这个交换机上这么写, 就是我在一上面经过二对,在二上面再写一个经过网关,网关再写一个触网,那就可以,这是一种写法。除了这种写法之外,我们还有一种办法,还有一种比较 便捷的办法,因为你内网如果设备很多,我这里虽然说模拟我就两台设备,但你真实的网络可能不止两三台。你户籍层可能有,就是好几个,对吧?七八个是九十个,十几个都有可能啊,很多区域吗? 那一旦内网比较复杂的情况下,你用静态录用就不太合适了。所以你可以在会议交换机上面去使用三层,我们是 ospf 或者是 bgp, 或者是什么什么其他的。你的意思是这样的,你可以选择使用动态录用。
终于解决了一个困扰已久的线上问题,是这样的,我们有一个应用,最近呢,会经常有超时的报警接口,有的时候 it 能达到三秒左右才会响用,而且接口的超时呢,他并不是持续性的,有的时候呢,一天有几次,有的时候呢,几天才有那么一次。 奇怪的是,业务高峰期的时候并没有明显的超时的现象,反而非高峰期的时候倒是会有超时的报警。后来进一步排查对比后才发现,每次的报警基本都发生在发布的时候, 难道是发布期间有机器重启导致剩余机器扛不住流量导致的吗?但是排查下来好像并不是,因为我们是滚动发布的,发布过程当中,只有刚刚重启好的机器会在前几分钟内接口响应时间特别长, 其他的机器呢,则不会,而且这种超时过几分钟就都好了。后来经过我对我背过的所有的八股文进行一番深度的检索之后,突然零光炸线。这可能是和 gat 优化有关,因为应用刚刚启动之后,刚开始运行的时候, gvm 呢,是会通过热点代码检测进行 j i t 优化的,但是在 j i t 优化彻底完成之前,请求呢,是需要通过解释执行的,这就使得解释器这段时间在疯狂的工作,而这个过程解释器是对 cpu 的资源占用比较大的,并且 j i t 优化自身呢,也会消耗产落 cpu, 这两者一叠加就会导致 cpu 漏的飙高,进而呢导致应用性能的下降。而随着 git 优化的不断执行呢,更多的热点代码被不断的编译并缓存之后,就不再需要更多的 git 优化以及解释执行了,超时的现象也就消失了。那这个问题的解决呢,有两种思路,第一种是我们公司自研的开源 gdk dragonville, 当中有一个技术叫做 jivamap, 他就是把上一次 gat 优化后的机器码保存到文件当中,你下一次应用启动之后,从文件当中把他们直接读取出来就可以用。第二种方案呢,就是做预热,对于刚启动的机器,前几分钟呢,不要给太多的流量,先通过小流量预热一下来触发 gat 优化,等优化的差不多了,再全量的放开就好了。通过这个问题, 我感受到八股文其实就是基础,基础不牢,地动山摇吗?如果没有足够的积累,像这种问题是很难排查的出来的。像这样真实的线上问题的排查过程,我整理了很多实际的案例,包含了很多各个大中小厂会问的一些面试题加答案,一共呢有六百多道,做成了一个在线的课程,放到下面的小黄车里面, 同时呢给大家放了个七十元的优惠券,下单之后按照短信提示去申请权限,然后联系客服审批通过,就可以愉快的看起来了。
急于延迟消息时间订单关闭,很多人的方案并不一定靠谱,在解决订单超时关闭这类需求的时候呢,很多人会想到借助中间键的延迟消息来实现,因为不同的中间键对延迟消息的支持不一样,所以具体的方案上主要有三种,分别是使用 dogetameq 的延迟消息卡不卡的时间轮,以及 reviewmq 的死性对列。 首先呢,说 rock mq 五点零之前的版本当中呢,确实天然支持延迟效益的功能,但是他延迟效益的时长不支持你随便设定的,只有他规定的那几个,在这个范围之外的都不行,所以不是很灵活。那是 oga mq 的五点零当中呢,新增了一个定时效益的功能,这个就更可靠灵活一些。 其实这个所谓的定时消息呢,底层的原理其实就用到了时间轮,这和卡佛卡当中的延迟消息的实现机制基本上是一样的。还有一个呢,就是基于在未来 mq 的死信对列实现延迟消息的方案,他的主要原理呢,就是把订单的超时时间设置成消息的 ttl, 并把消息发出去,但是呢,你并不消费他,等他超时之后呢,就会进入到死信对列,然后再消费 死性队列里面的消息就行了。但是这个方案呢,他不仅需要创建很多的队列,特别麻烦,而且呢,还存在一个问题,那就是说当一个队列当中的第一个消息还没有过期的话,后面的消息即使过期了也要被阻塞,等第一个消息处理完才行, 这就是消息的对头堵塞的问题,所以不是很建议大家使用这个方案,如果你一定要用在未来, mq 建议使用官方出的延迟消息插件,这样的话就可以实现一个不堵塞的延迟消息了。原理的话呢,就是需要延迟发送的消息,他不会立即进入到队列当中,而是会先保存到一个 m 尼塞亚数据库当中, 然后呢通过一个定时器去查询需要被投递的消息,再把他们投递到延迟队列当中,这个方案相对来说就更加靠谱一些了。
今天在项目中遇到一个问题,发送 http post 请求时遇到了参数非法的问题, 在请求 url 中携带了格式画过的时间字符串,时间字符串中带有空格。我代码中的 http 请求是这样的, http client, 然后 new 一个 http post 仿参数 url 组装需要的 hidden 或巴黎参数执行请求,结果就是报错了,报错说明是所以在 dn 处的查询中的非法字符把带有时间的字符串分为了两部分,一部分到日期处结束,另一部分又从小时处开始。 可以简单看下我的报错结果,没有截取项目中的报错,可以直接看我复制的这个报错结果,在时间处分为了两段,并且还提示了在哪出有非法字符的产生。 说重点怎么去解决这个空格的非法字符,就如下面这样,把带有空格的字符串替换为加号来解决有空格非法字符的问题。以上是项目中的真实经历,希望大家看到以后。
聘请求超时,别担心,今天就让我们一起来探讨一下这个问题的原因。聘请求超时可能由多种原因导致,首先可能是由于目标主机不可达,这通常是由于目标主机关闭了网络连接、所在网络故障、 ip 地址设置错误等原因导致的。 其次,网络拥堵也可能是导致 pin 超时的原因,这可能是由于大量的数据传输、网络设备故障或网络贷款不足等问题造成的,导致 pin 请求无法及时传输和返回。 另外,防火墙或安全设置也可能是影响聘请求超时的因素,尤其是当这些设置阻止了聘请求的传输和返回时。 最后, dns 解析问题也可能是导致聘请求超时的原因,尤其是在没有正确解析目标主机域名的情况下。当你遇到聘请求超时的问题时,你知道应该如何解决了吗?快来评论区分享你的想法和经验吧!
一分钟教会你订单超时未支付如何自动关闭!欢迎来到新一期的小欧说编程,今天来给大家分享如何设计订单超时未支付自动关闭的需求。首先我们有这样的一个下单操作,用户在下单的时候, 订单服务会生成一个未支付的订单,但是这个未支付的订单是有一个超时未支付时间的,如果我们三十分钟之内不进行支付的话,就要对这个订单进行关闭,然后返还库存。这个是在一些普遍的电商里面比较常见的一个业务,我们在日常开发中都是怎么处理这种业务成绩呢? 今天小欧给大家分享两种处理方案。第一种处理方案是定时任务扫描,这个方案适用于一些规模比较小的公司。用户在生成未支付订单之后,我们这里可以写一个定时任务,定时任务定时去查询未支付的订单,把超过三十分钟还未支付的订单数据给查回来,然后再进行批量的关闭。订单触发的频率是什么样呢?可以根据我们的业 五决定,一般采取的是一分钟查询一次这个方案,查询太频繁的话会导致数据库的压力特别大,所以这种方案只适用于那些数据量比较小的系统。方案二就是延迟消息对列,我们在生成未支付订单之后,可以将咱们的订单信息存储在延迟对列里面,这个延迟对列我们可以设计为延迟三十分钟, 延迟消息在过了三十分钟之后,就会有一个消费者过来消费他,消费他之后咱们就去查询订单的状态,如果此时订单状态还是会支付,我们就将这个订单给关闭掉并返回库存。 如果这个订单是已支付状态,我们就可以把这条消息给丢掉了,这样就实现了我们订单超实惠支付,自动关闭订单的需求。你们公司都是怎么实现这种业务场景呢?欢迎在评论区留言讨论,这个就是本期的分享视频,我们下期再见, nice。