这个可以是吧好大家好那个不好意思啊就是这边因为设备上它好像有些故障所以耽误大家的时间不好意思我们现在那么现在开始现在有没可以了不好意思这个现场好像好多你都不太好用我希望我们的演讲还能成功啊先我们开始大家好我是张超芒来自豪尔云我今天分享的主题是关于网格的那个防日制这样一个细节话题所以可能问题比较比较细节一些我们知道这个防日制对我们自己作用为来说实际上是一个非常有效的一个手段尤其对一些七层日制我们一般会看那个HTQ的看这边是什么5404530之类的东西来区分一下我这次防日到成功还不成功但是在那个为了更精细地去了解一下这次防日它这个详细的一个结果这个连接或者这个请求在Envolve里面它引入了一个叫Response Flag的一个东西就是帮我们更精细地去了解说是连接到底出了一些什么样的问题我们去诊断它然后去做一些针对性的手段但比较遗憾的是从Ease有社区和引谋社区了不知道大家有没有注意到关于这块的信息不管是一些文档还是实践都非常非常的少我们周边有同事或者客户经常有提到就是这个东西不足以支撑他们去理解到底它的陷害上出了一些什么样的问题所以说我这里边是这次分享就是结合我们现在客户的案例我把原来我们抽象过的所有的大家基本上能用到的Response Flag全部是在一个比较简单的环境下重现了一遍有比较详细的一个重现帮助大家去参照然后在自己的生产中间如果碰到问题可以去参照的解决这是我是华尔云的分部律员商的架构师从2018年开始实际上一直在负责华尔云英福网格这样一个人服务也就主要基于Ease有构建的一个服务今天的演讲主要分三部分一个是一个简单的背景再一个就是我这个因为主要还是个实践里边有个实践环境的介绍最核心的是下面这些就是里边有一些Response Flag的一个重现和一个详细的解析这是关于访问制其实大家能看到这一双K-BAN的结了一个图就是不同于那个像我们经常用的可观性里边的指标啊对方这些东西提供一个聚合的数据访问制它提供了一个比较非常详细的对每次请求的一个记录所以不管是我们在做一个应用系统里边我做一个应用审计还是做一些系统应用来说都是非常有效的一个手段访问制里边大家能看到在这边详细记录了每次访问的什么时间啊然后包括这状态啊包括那个两边的原地址目标地址包括一些更详细的原数据然后能帮助我们去定位定界我们系统出现一些问题当然在实际生产中我们有时也会包括我经常也会这么来干比如从里边我去录一下是不是那些慢的服务是不是都包得比较大啊或者说是不是我看一下最近有个客户经常报说有些五叉叉的问题我是不是看一下它是不是都集中在某一些特定的服务甚至说特定的接口上来判断一下到底是业务的问题还是一些平台的问题那是最终总之来说防日制实际上在我们生产中间如果大家用过的话你定位一些因为的问题或者说是一些平台的问题应该是我现在来判断是一个应该是最有效的一个手段这是防日制的一个机制实际上从早期来说大家防日制都是一般是自己去编码的就是我们写程序记录一下我的服务在我接口上记录说什么时候我防了什么样的东西编码进去但网格这种东西它提供了非侵入手段所以说它在里边比如说我们这里边服务两个服务员防着的时候它能拦截到流量就可以根据我们记录日制的防日制的格式我会输出一下防日制然后从这个上面来看记录下来之后它会把从网格的代理它会报到一个叫一般叫LS叫AccessLogService一个JRPC的一个服务段然后这个东西再把日制写到我们的日制存储里面去比如说ES和其他这种东西或者一个我们厂商或者一些其他的日制服务里面去然后后面的话就是我们给你像这种ELK就是Kibana之类这种东西我去去检索它但对于云厂商来说我一般都也自己竟然买了一些监控系统我们可能就从里面去对日制进行一些非常细腻的一些检索记忆我们试用需要说的另外一点就是EaseL里面它的防日制实际上它所有的那个接口都是一些我们叫一个标准或者说是一个标准接口实际上这边写的对LS实际上你把它输出到一个标准输出或者写一个文件或者写一个像现在用的也比较多的叫Open-Tanimetry这样一个通道或者日制系统都是非常容易的并且这个日制格式也是可以动态定义对我们试用来说是非常灵活的如果大家用过的话对那个背景我们就简单叫到这只要能支持我们今天这个其他实践部分就好了下面就进入我们实践部分这个地方它就是我的一个实践环境上可以看到的话其实就是我把它列了一下就是我建了一个叫AccessLog的一个NetSpace下面创造了点服务一个就是一个服务单NX就是最简单的然后另外一个扣服单的一个容器然后其实整个的过程就是说在扣服单容器里边保证它里边有个镜像里边有个客人命令能让我去客人它然后我去请求然后看一下它防温过程里面出现什么样的问题然后把它那个防日制然后把防日制输出出来我们来观察所以整个来说这个环境是比较干净纯粹的环境避免就是大家说生产中间我有些复杂的环境我出一个复杂的问题让大学定位的有一些其他因素影响在一个干净纯粹的环境上我们试图把这种我们这种复杂的一些日制全部给充现出来让我们能看到效果这个是那个可以看到其实和谐想跟大家说的是点哪个哪个会定不好意思哪个会让这比定对那算不止了就这个东西就是说防日制里面实际上记录的话就是这个就是这里边我们定的就是防日制的一个格式可以看到其实我在系统里面是没有去定义过防日制就是说这些那个默认的话它会输出一个意思是说它输出的那个防日制就是这样的格式这是我们那个从一个带里面坑飞个弹幕出来的一个东西不用了不用了谢谢不用了不用了就这样弹幕出来一个可以看到这个日制格式就长这个样子对然后这个是我我们初始的一个我们第一个kiss就是200ok就是我大家最期望看到的我们系统上我们希望我们的系统永远是200ok就是我做一个访问实际上从这边来看的话就是说我先创了一个就把nix那起的那个地方然后从一个client的容器这边我去克尔它然后我去把克尔的结果其实当不出克尔的结果我们输出来看这边输出200ok然后接着我们去看两边的防日制客服端的防日制是上面这个这一条然后下面的服服端的防日制可以看到那个我那个高量那一部分是它的9.3d可以看到属于同一次请求在圆和目标银帮的和银帮的那边它各输出了一条日制后面我们的所有的这是一个正常的访问后面所有的一些异常的访问我们也会follow这样一个格式也就是说我会在现在这个客服端里的访问下看它输出什么样然后会有一个详细的重新步骤然后再看一下两边的真正输出的日制然后最后对日制有一个解析然后再看一下我们这种这个日制表达是什么样的问题我们咱们去解决这个问题当然我一般也会画一个图表示一下这个这个访问的一些细节这是刚才那个200日制它的一个在那个房在它的一个解析就是说这半了就是刚才我们看到的房日我们定义的默认的房日制的一个格式可以看到其实这个字段是比较多我们现在不用把它每一个的解析重点关注这样几个吧一个就是Restaurant Flex就是我们今天特别要讲的可以看到在200的时候这个东西它是一个空的所以一般实际上是在200的时候我们正常情况一般不会关注到它但如果它不空的时候可能我们就认为系统碰到一些麻烦也同时我们也可以认为是给我们提供一些线索我们继续这个东西就可以定义我们的我们的系统那些问题然后其他有些我稍微能说一下就是比如有几个时间字段有一个比如Duration表示你这次访问了一个整个花端时间我们大家一般对这个字段非常敏感如果长的话说我们缝满了然后另外还有一个这个没法指就是有个这个我指到这了我指到这了这个字段反正可能也会一般我会关注一下就是一个从头与之外取到一个X Envoy Upstream Service Time表示说我整个那个整个一般会表示说我上游服务本身的花端时间然后经常会有用户就是会拿着这个时间和你一个整个Duration对比说整个到底是你我的服务满了还是你的平台满了但这边有些比较细节的东西但是我今天主题里面不一定会包含它这个日致本身字段我们大家如果熟悉HTB协议的话其实大部分东西给你它的那个名字谁能猜到它到底是个什么意思我们今天就聚焦的只有这个高量这一个字段就是Response Flex这可以看到就是说这就是我摘出来的一些就是我构造出来一些非200的Response Flex就是说如果200的时候大家感受还比较好实际上如果非200到出现这些东西如果在生产上出现这个的话反正我早期碰到这个问题是感觉到非常不适合的所以今天我其实演讲的时候我其实刚开始的时候想把这个东西标红让大家更适应更好一些但是红的这种我看着都不太舒服我把它改成绿色了对所以其实引摸里边它实际上或者意思有这些它实际上这个代理里边它把这种提供出来想让大家说给大家提供更多的线索让你知道一下你心里到底出了一些什么样的问题但实际上这个东西很多时候所以一个初学者甚至对一些比较自身上来说看见这些东西比看见503还是让人感觉难受就是意思有点或者这下面我贴个链接是Involve里边它关于Response Flag的一个介绍实际上就是这么多两个表每个里边可能一行办的一个文字因为那个描述说这是个什么东西这些东西就是说气势出了问题你把那几个把那个十五个单词把你时间摸过来摸过去看你也讲不太能理解它里边到底说的一些什么样的问题对所以这边的话我就结合我们现在生产上碰到的问题这里边就是把这里边出现所有Response Flag我们会不会挨个和重现一遍我们看一下到底它是什么条件想产生的表示什么含义然后到底是什么问题出问题我们怎么去解决它下面就是我们挨个可以看一下的第一个的话我不知道大家生产有没有碰到我叫DC就是Downstream Connection Termination表示意思就是说对 这个就是以某官网上关于这个DC它的所有的解释就三个单词下游 连接 终止那告诉这个东西我们怎么去理解到底是个啥意思到底我应该做什么样的动作解决这个问题对这边的话我们在我们的环境下验证它是这样去验证的就是说我先构造了一个服务把这个服务我是通过一些手段上的服务是让它是延迟10秒也就是这个服务本身它是一个模拟一个比较慢的一个服务然后紧接着我是在扣上去扣它的时候可以看到我里边是杠杠一个Max就克里边加了个mini杠杠MaxTime等一个2秒意思就是我克的时候这个服务我是2秒会超时我克不断克的时候2秒之后我就就克命令我就就超时掉了所以一看的时候这个服务本身因为它10秒钟才返回我2秒我去克的时候只持于2秒那2秒之后它里边就爆这样一个错误就是是2000毫秒它超时了那这个时候克不断超时我们可以看到在那个克不断的访问日之本会输出这样一条0DC的日之大家去构造一下这个其实是很好重现的但是咱们环境中的怎么重现我们有很多为什么在环境上出现这个0DC的时候其实好多时候我们是不怎么知道这个规则的实际上这个我们现在理解它的意思构造起来其实是挺容易的就是你只要在一个服务它没有及时返回的时候你给它终止掉不管是因为超时还是因为服务本身扣但你就扣着C或者就是这种你把这个连接给重置掉在日之这边就会出这么个东西对0DC如果大家理解这个意思的话就会看到说你不要刻意去消除0DC因为0DC本身扣但抱这个日之它只是说了个现象这个现象本身是没有什么害处的这只能说是你服务单那个地方它本身可能已经慢了或什么原因扣单不要一起等它了它把装个断开了所以解决0DC的问题我们大家如果理解这个意思的话其实也比较好解决你就把服务单行行的快点可能就好了这也挺简单的就是下一个的话就是也是我们经常会碰到的一个叫UH它叫No Healthy Upstream就是说这一段就是involve关于UH它的一个全部解释就是没有上游没有一个健康的一个护端在我们生产中也比较常碰到了比如说在KBS里面实际上它泡得全部全部通了可能就会出这种问题所以我们去重现它其实也比较容易大家可以看到我这边就是构造了一下就这第一步我先把我们那个服务把它scare到一个0就是把replicate改成一个0比如说这个服务是没有一个服务本身没有end point的然后这个时候你去刻着它的话可以看到那个在服务端里就出一个503然后说是没有sales available就是这个服务是不可用这个时候我们再去看那个看见我们自己扣断那个日子的话就看到那边它一般会抱这个503UH但生产中间实际上有的时候那个UH环境可能比这个要稍微多一点但总的那个意思就这么个意思实际上就是你扣断去防红服务端服务端发现没有一个健康实力能给你处理你的请求了那对UH有东西我理解它的意思实际上去解决它也可能不是很麻烦就你服务端只要碰见UH你要干的事情就是说去服务端里面检查你的目标服务看有没有什么问题把那个服务去给它处理一下就这样下面的话是一个叫UFUF其实是有点意思它里边是说它这些标记行都很像是吧UF,UH,UC,UT之类的这种东西UF它意思是upstream connection failure就是说我连接上游的时候失败了有时候这个东西我去连它就没连成功我们简单字面理解它是这么个意思实际上的话在我们生产中间其实在我的生产我之前支撑客户的时候我碰到是有两类这种问题一类UF发生在客户端就是从我网格的书里边讲叫下游下游访问上游的时候在下游的地方出现UF就我这样图上表示的还有的时候是下游访问上游的时候下游就上游里边不是也有个赛的看吗那个代理那代理在连它背后那个服务的时候它阴帮的那一段它UF掉了就两种东西可能会出现这两种出现其实常见期上我们总结的其实也挺纯粹的下游这个地方其实出现的时候大部分原因是因为就是你出去这一段流量防上那个服务那个服务它不通然后服务端那块出的话是说这一段是通的但是你服务端那个防那个服务实力或者我们要泡在那边那个泡在那边那个一般叫QBS里边那个容器的时候它可能出现问题所以它会包那个我们先这个例子我们先看一下最容易碰到或者是好理解的那个扣单这块UF的问题那个服务端的UF可能下面有个例子可能会稍待会讲到那我们这个构造咋构造其实也挺容易的你就是这个服务刚才我们不是NX和80吗我在服务定一点你把那段口给它随便改一下改成一个比如我这边改成一个888然后这个时候你再去刻它就是用原来的段口一刻它你这个时候它就不通了然后这个不通的时候在我们日子这边你就会发现它在那个扣单日子会包一个503UF因为这个流量压根就没走到服务端所以那个我们日子我们第一个200UQ的时候我会展示什么扣单日子是个啥服务端日子是个啥这个里边因为流量就没走到服务端去所以服务端也不会有任何日子输出这个实际上出个问题如果跟前面一样如果我们知道它的原理或者知道特点的话你解决这个问题其实就是让它通通的话像我们这种如果你把段口搞错了你把段口写对了可能就解决这个问题对所以我今天重现这个所有东西大家会看到其实好像挺简单现在生产中碰到的时候大家经常还是听寿毛讲的我这个里边写的条件是比较好重现的条件但大家生产中碰到有些时候即使跟这个不一样它一定是机智跟这个是一样的对然后下面这个的话是一个可能每个那个要稍微难理解这样就是叫URX叫Outstream Retry Limited Excited从理解就是说我上游重视超过了限制实际上就是你我在上游服务我去尝试连接上游服务时我连接超过了重视次数这个里面的话其实构造我是怎么来构造的实际上就是说我先构造一个让我的上游服务失败上游服务失败那我的构造办法就是我把上游那个在K8里面我把服务那个Target炮的给它改成一个不对的Target比如我原来那个服务的话我等Service炮的是80Target炮也是80我把Target炮的给它改成那个888对然后这个时候我去在Koldan在去Kerta的时候在Kerta的时候你会看到Koldan里面Koldan这边显示会爆一个就我窗口里面会爆一个503对吧就说是反正我就连上游服务我连失败了那为啥失败呢你就从日日里面详细去看这个时候我们把那个从Koldan日日来看到它里面出了一条叫503URX就试一句说你这个服务我在Koldan代理在替你的Koldan去访问那个服务的时候我已经进行了弱干自重视但是它没有成功然后在服务代理里面看可能看到一些更有意思的现象这边我就摘得比较多可以看到我摘得比较全我摘得里面看到是出现了34503然后你可以看对照一下这个这个Target Request ID就是那个蓝色那个部分可以看到这个Koldan这条Target Request ID和服务代理的三条它都是一样的这个现象其实就很好说明了我Koldan发起了一次请求在服务代理它进行了一次失败的请求同时在失败之后它就进行两次重视但是因为你端口都写错了两次重视它一定也是失败的那就是说三次请求它超过了你的两次重视次数然后它就说我重视也失败了所以在Koldan爆了一个URX另外一个特点就是在一岁出来大家用的时候它默认如果你对这个服务没有配重视的话它默认系统里面会有两次重视所以我们这边看到其实我没有做额外的配置就是看到Koldan有一次请求服务代理有原始请求加两次重视它有三次请求然后这是一个现象另外一个现象就我刚说到KoldanURX就是我们就是要讲的实际上说清楚了那服务代理URX又怎么回事实际上这里面就是我们从这个图上能看到就是说因为我把后边那个又把那个Service那个Service那个实力那个端口路归于它写错了那这个时候呢Koldan访问的时候就像我这图上写的他访问一次失败现在出那个左边那个代理然后进右边那个代理右边代理再进那个服务右边代理访问他的上游的时候他也叫upstream他访问他的upstream的时候已经端口错了所以他的upstream那个时候就失败了那这个时候这个特点不就跟刚才我们说的上一步那个这个UF是完全一样的吗差别指在于说刚才这个UF上游是是左边那个服务当然那个服务有可能有Koldan有可能有代理有可能没代理它是那个我的代理我们关注的是这个代理然后它的上游是上面那个有可能住setcard有可能没有住setcard这个上游服务然后这个来说的它的上游是我这个服务但代理我代理的那个服务然后他当然他也满足UF失败的一个语意所以他里边可以报这个503UF那这个问题出现的话实际上如果出这个问题的话对UX来说你就说我自己已经配了一个重视但重视多少次我不能一直重视下去重视失败那也是挺正常一个现象那你让不要出UX那你最要做的事情就是提高你服务的一个成功率对吧就说你不管是有可能应用自愿的网络的你配置的各种原因你能服务那个做得好一点那这个UX可能就会也比较避免可能就会改善掉了下面一个这个其实要简单一点叫UPE这个实际上我相信大部分人可能用到的碰到也不多所以我碰到了也不多但是还是碰到我一次我找到规律是这样子就是说它的一个意思就是upstream protocol error就是说你上游服务就写一错了也就是说如果说我自己服务我开发的一个服务是这个协议但是你在服务告诉网格或者告诉你的平台时候你把它描述错了那这个时候就有可能出这个问题我重现的时候实际上这么去就可以把它构造出来就是我这个服务就跟刚才一样我搞了一个ngixngix这个服务把它协议写成一个jrpc但这个协议里边你可以写在ngix里边它早期里边是这个这个协议是放在内幕上只要把内幕把这个协议包含进去它就按这个东西它识遍的协议但你也可以把这个协议放在APP protocol里面对吧反正就通过这个你描述你服务的英文协议的时候你把英文协议如果写错了这个时候你去放上手就会出这种问题因为我们看到的话我在这边做了这样一个修改我把协议写成一个jrpc这个时候你去放上的时候你就看到在我们的那个放上的窗口里边它会出一个50300对吧502出一个502的错误然后引摩里边也会报这个东西报Protocol Error引摩代码里边报出来这也可以不用太关注然后这个时候你去看那个我们的扣单日誌那扣单日誌报一个502原因是因为服务单它就会报一个协议错就是因为上有服务你那个协议写错它会报一个503的UP这样子错误出来对这个是比较纯粹简单的这种问题其实如果我们知道这个机制的话它这个不同前面那些U打头那些东西这个也是U打头不同一些UFUH包括后面讲个Uc这种比较麻烦的东西它还是比较明确的实际上大家即使没有听这种东西实际上你猜一猜说Protocol那我就找Protocol把Protocol给它改对了可能大半说就OK了对然后下面这个是一个叫DPE实际上跟那个一个字叫DUNSTREAMProtocolVIRUS就是一个下有服务下有协议失败下有协议的一个错误这个时候是就说我们试试字面的意思就是我这个服务文是它有一个正常的协议我正常访问它但没问题但是如果你扣断去访问它用了一个错误的协议去访问它可能就会出这种错误你构造这个实际上我构造是这么来干的就是我搞了一个这个服务还是我们刚才的NX那个服务然后那个扣断我搞了一个三BOSSTANET命令了一个三BOSS容器在这然后在三BOSS我去TANET它其实就是通过TCB协议去连一个LTP的一个服务断口你这个时候从TANET这边会看到TANET的容器里边它出的那个错误它会报一个400的一个错然后这个时候你再去看你的那个防止你会看到在服务断的防止这边服务断防止这边会寄一个400DPE就是你这个我那个服务本身是一个就是你在你扣断防我的时候你写一些错误防用了错误的写一些防我我告诉你一下让你想的你就是要提示一下你用一个正确的方认去防我下面这个东西实际上这是一个日子大家会看到如果大家熟悉一岁防日子看到下面这条日子不是一个HTB的日子这是一条TCB的日子防日子就由你下面用TANET去防防它那下面在那个扣断在那个扣断输出的日子里边它是一个TCB格式的日子对总之这个其实如果大家知道这个原点其实也解决不麻烦你服务是个啥协议你已经用什么协议扣不断去防防它就好了你不要用这一些不建议的扣不断去防防下面一个是是那个叫NC这个实际上在我们那个生产中间其实也碰到我挺多的就是它解释过来no cluster phone就是说是没有上游的集群没有集群当然大家说起在E4或网格里面的集群不是我们说的K8集群这些东西它说的是一个我们有时简单地上游这个服务但有时也服务分组反正就上游这个目标服务对这个其实也不太严谨就是你上游的一个有时候要host吧就上游你防防那个目标吧的一个描述它经常发生的情况其实也挺常见的是这种就是你上面网格去你的路由里面描述我要防问这样一个上游但是在你网格的注册里面你没有这样一个上游你一防守它就会报这个出比较典型的比较典型出现的话就是说我们经常用意思有时候我们会搞一种decent rule会定义我服务的一些分组就是我的服务搞回头发布之类的东西我就配一个服务有个V1分组有个V1分组然后配些什么流量柜子什么流量发的V1分组什么流量发的V2分组就是这样这个时候如果你在decent里面配了一个分组但是你在例如VS这种地方你配一个路由的时候你跟那个东西没有匹配上你路由里面写的那个分组是一个没有被定义的一个分组你去防守的时候它就会出这种问题比如我在那个里面分组我定了一个V1但去防守的时候这边只有一个V2你去防守的时候在我们去防守的时候在这边会报一个503然后在我们去看你客户单的防守日就会看到会出一个503 NC的一个一个防守日告诉你说没有找到一个路由想要的一个一个上游的一个分组这地方是我从convict挡不出来的一个真正在环境上的一个一些配置一个是root就是我们老说的RDS下面是cluster一个是root对应的cluster看到这个root对应的cluster是说我要发到V2上面去但是我把那所有cluster挡不出来就NGIS这个cluster挡不出来它只有两个一个是V1的就是有V1这个分组一个就是不带这个分组的那就是所有的它就在所有上面试图去做负载进行或做论宣那这个时候其实就是你没有匹配所以出现这种问题这属于一个典型的配置错误所以如果出这种问题我们解决它实际上就是你的配置主要把这个东西配对了配一致了就不会有问题了跟那个NC对应的话其实在生产上经常有出这个就NR我不知道大家也没碰到过反正我们客户经常至少有过就是大家用easter的时候就说自己配那些路由有时候可能就是可能就是那种对那个语法不是很熟悉然后自己配了一些东西然后导致就是就防不通了然后从实用来看实际就是就404嘛然后从如果报404有的时候我们也有报404大家一般会知道嘛就是我路由里边看了什么东西但在网格这种东西报404的话其实你可能大多时候检查你这个路由配置可能就差不多了我这个配置的话其实重现它其实也挺容易的像我就在前面最基础的那个Virtus S上面我给他加了个头御一个匹配就是我要求我匹配这个但我就要Laug Flags这个头御你带这个头御然后我会把你发到这个分组上去但事实上我就请求的时候可以看到我这边啥也没带对吧壳的时候是一个公土图的一个东西所以他就流量就走到走不到这个路由上但下面我又没配一个类似我们说开双啊这个默认路由之类的东西所以他就没有路由了他找不到路由那当然就他又报了个404出来那这个时候我们去看那个从那个客户单那个日治这边看他就会报一个提示一个在404边上会放一个NR提示你说这个404的原因是因为我没找到一个匹配的路由那这解决这个问题如果大家理解这个原理的话解决也不难其实就是把路由配置就好因为这个路由它是没有走到服务端去所以你这个服务端也不会有任何的日治输出对经常实际上之前我们有同事问过这个就说NC和NR的一些小的一个差异我不知道大家有没有这样的疑问NC的时候就是No Class放的我们就说没有找到上游其实我们很容易理解说没找到那不是应该是404吗我们经常理解不是404老说是那什么没有找到什么资源对吧就是那为什么NC报503NR报404这个是实际上挺绕的一个问题我试着回答一下因为有人问过我我就是用这么简单的方法让他们把转理解大家想这么个东西就网上这个服务它这个Volio Service就一个虚拟服务对吧它总体描述还是描述了一个试图给我们不管后边是有一个服务还是N个服务它试图描述就说我用这个描述了一个一个一个一个虚拟服务一个服务然后你去访问我然后你看到所有这些能力或者后面提问资源都是我这个服务后面提问出来的比较简单的假设就是把这个东西理解成一个我们已经老早写了外部的一个服务应用或者理解成我们老早写了一个Rest的这个APP这个时候你想一下你Volio Service说描述的是一个比如说是一个外部的服务的话你把这个你把这个地址路由写错了是不是相当于我在浏览器这个地址篮里把路径给写错了那出个404不是很好理解吗对吧但是NC那种东西就不是了我浏览器这个地址篮器是我写对的或者Rest那个接口的我们地址是写对的写过去了也找到那个我们后端那个服务也处理只是处理的时候它在交给它的后端的时候那个地方报了错那不就是服务器那不错吗不就是503吗对所以这样就好理解你要好理解一些实际上就是本质上就是这么个原理但很多时候这个东西经常被问到就是为啥NC不是404这个地方有404我不知道大家有没有理解这个意思我可能稍微前线点的例子但实际上这个例子其实也算严谨的下面几个实际上要容易想实际上我们大家碰到的时候一般我们也不着急就是比如说这个DI这个东西就是一个Delay Injected实际上这个操作是我们主动操作的比如说网格里边大家知道它提供一些故障注入比如说我可以注入一端延时我注入一个错误这个时候比如说我对网格里边像我这种里边我写了一个注入了一个10秒的延时这个时候注入10秒延时这时候你从扣单去访问这个东西的时候就是我这个箭头画的这个地方你就看到我这连接发起在那个在那个刻的时候它像出这样一段然后下面等那个Response的时候它在这个地方会延时10秒钟因为你里边就发了一个10秒的延迟所以10秒钟之后下面这个这下面就被NG送给页面它会把它给返回来你说没这个10秒延时就生效了那这个时候你去10秒你配这个延时的话你去看那个访问日你会看到在扣单地方200DL告诉你说这个请求是正常的但是它因为你注入200的延时所以搞你个DL但幅度单来说那是正常200对吧大家观察这个另外一个细节观察那个我高量那个时间会看到在扣单的时候提出这次时间花了10秒钟1万毫秒对吧幅度单是0毫秒因为这个东西实际上幅度单是没有花时间但在扣单看到实际上花了10秒钟这也就是我们也有老在鼓吹它那种什么非侵入的一个效果对吧也比较生动的我就在扣单我就通过这个一个配置下去从扣呢扣呢应用程序看我扣单目标程序好像就只有10秒钟才能返回实际上扣单的程序它是0秒钟才能返回的但是因为你注入故障所以它就这样错误了对然后跟那个类似的是一个错误的故障就是说你那个你出入可以注入一个延时之后你还可以注入一个一个错误的一个状态对吧注入一个状态注入一个把那种改成418注入一个418的一个状态这个时候你扣单去访问的时候就会发现它会访问一个扣单访问就我这边去课它的时候就得到你写多少它就访问多少对吧访问418所以说其实扣单这个时候流量根本就没到扣单那去我从这边也能看到扣单访问一个418的F5告诉你说扣单是你想要的HTB response然后呢因为是F5你自己注入的故障所以提示你是F5F5端连连连连连流量都没有这也是跟刚才一样就是很很很巧妙的吧把扣单骗过了就是你F5端我是想让F5端反而是什么错就F5端反而是什么错实际上流量压根就没到F5端那个地方对所以F5和DL的时候其实我不用做任何处理因为你对不起你只要你自己主动注入的一个东西对吧下面这个的话Ut稍微复杂一些稍微给我一点时间就是这个地方实际上它是upstream request timeout就是说我构造这个东西其实也是稍微花点时间比较综合点例子它的意思就是我上游连接超时的就这个东西大家经常会应该大家经常会碰到就我去访问的时候呢我就访问的时候我在我的服务里边我给它配了一个超时时间如果上游服务比较慢的时候在这个里面就会在扣单日里面会抱一个504Ut出来告诉你提示你说服务端超时了我这个例子构造是有一点点稍微比前几个东西好像稍微复杂点测试这么个事就是我现在在机讯中创了一个服务给这个服务通过刚才我们缴到那个故障住入给它住了一个多长时间十秒钟吗几秒钟的一个延时然后把这个把这个服务再通过English Gateway挂出来这个时候再通过一个意思就是有个Source Engine去描述这个服务就看上去就是描述了一个外部服务然后给这个Source Engine描述这个服务我给它再去配了一个可以看到这个服务名叫一个Angist External 这样一个服务给它配了一个三秒的延迟不是三秒三秒的一个超时这个时候呢因为那边那个服务慢你这个时候配个三秒的延迟三秒的超时你在这边去客人它时候你就看到在三秒钟之后你这个服务在客户单里会报一个Timeout这个时候在客户单里因为它Timeout的其实UT其实你说客户单超时那么对吧客户单这里边因为看到也报了一个504UT告诉你说你一个我的一个正常客户单房目标服务的时候它超时了Ut而超时时间就是我们这边配的三秒这边是三千毫秒大家可以看到然后另外有一次想象就是这个里边我刚说有小细节我的服务是挂在应该在Gateway上Gateway上其实有一条日子也可以拉出来的就是Charlie KassID是一样的是属于同样的请求Charlie 我看到这个日子里边会报了一个0DI和一个0DIDC这两个Response来的结合前面其实我讲到的大家试试其实可以理解这个意思DI它还不难理解因为这个东西是我自己手动注入进去的DN对吧我们说这个东西DN的Response flag我们不用关注但DC就有意思DC为什么会发生大家可以看到里边我这个Ut发生在左半来的proxy上然后DC发生在DC发生在英格兽Gateway上原因是Ut我里边配了一个三秒的延迟三秒的超时三秒到之后我这个下游把这个连接给断掉了但这个断掉不是刚才我们的客的时候断掉是这个proxy它自己主动断掉了英格兽Gateway超时proxy断掉之后Gateway来看其实就下游把这个连接中断了下游中断前面我第一个例子就讲过下游中断它会爆杀爆DC对吧就是比较downstream connectioncommitated对吧所以就是把这个东西大家把这个原理中理解透这些东西看到可能就容易想我可能讲得得快一点了写的有点多然后Ut这个实际上大家生产中是经常碰到的而且是非常麻烦那个东西所以我把它放到后面本来想多讲一点但可能时间不一定够了这个地方构造其实也非常麻烦就像像我们写重序那个round time exception一样你很难碰到但碰到你就麻烦就很难搞这个我构造是这么来构造的其实也有点费劲就是我写了这么个东西就是还是那个ngixngix后面挂了个Tomcat然后呢然后呢然后写了个pass and写了个小脚本就pass and脚本写了个啥东西就是放在ngix的时候给你头预里边写了一个说我要请求这个requestproxy这个request是有300是多少300个字节但是在proxy的时候我就传这个空的上去因为这个时候你告诉http协议你说我要请求一个300网上传一个300的一个字节300字节一个body但是你一直没传上去最终效果就是这个连接一直不断嘛对吧其实它在试图等你复负担的ngix一直等你就是网上传数据然后这个时候呢就出发了ngixngix默认有60秒的一个超时这时候就出发ngix它的一个超时ngix超时之后呢在复负担ngix就把这个连接给断掉了就这样图上类似的就是Service那地方它就是ngix就表示断掉之后那就是说服务断就是上游它连接中断这个时候你从上游的日子里边去看它就报这个503UC就是这个然后从那个ngix自己日子里边看它报这个408但如果属于属于408的其实也会理解到其实就是说ngix告诉你说你这个服务一直不返回我不等它了出408对所以UC的原因实际上它在生产中出现的原因是挺多的但总体就像它那边描述的就是上游服务它断掉了但是断掉的原因各个样它插了它就断了我这边是构造了一个超时让它断了对吧那这个UCA实际上因为出的原因比较多其实解决的时候可能也比较费劲在生产中我们比较建议这个解决办法就是给它配个超时就好了就跟我们自己写成讯碰那个round time is 7你把它开始掉再来一次或什么样可能大部分人就好了对吧你不要当然有些时候如果比较明确的你也可以试图去解决它后面有两个我开始过一下两个的话实际上E2L就是一个一个提示就说你自己如果你服务配了一个那个线流的话实际上在你的房日可能就会出什么东西实际上那个重线也比较简单就像我在这边我配了一个通envolve filter写了一个那个配了一个线流给这个服务配了一个60毫秒14这个线流你就要超了之后刚开始爆200后背成429但这个东西因为这个线流我配在服务端可能配在音棒的上面所以服务端出429然后客户端时候服务端429客户端的房间当然也就429对吧那如果把这个线流我配在服务端客户端上的话其实就配在outbound上的话你就看到刚开始的时候是200然后客户端429这个客户端直接把流量级掐掉了流量就不会到服务端服务端跟刚才那个比较服务端没有那条429的记录出来对好这个这个其实要花些时间的我们就把它挑过好了实际的东西那我们可以再讲一节的因为就是说我这节其实主题就像是说Riswan Flag它本身我们重现完之后告诉大家这个端它的一些现象然后原因实际上我想顺带讲一下这个房间日记这边它一些重要的时间这个时间其实帮我们去诊断客户挑战我们说它服务不慢你自己慢了这些原因这个东西解析起来的内容还挺多的我们要么我们就参照到这儿好了大家有兴趣回头看一下然后需要到以后看有机我们再讲一下好 以上就是全部内容这放一个小文告就是我们原来写过的本书大家有兴趣今天讲到有些没讲到的在那里面谢谢对 大家有问题可以问一下还有时间吗还有时间吗我想问一下关于那个第二个还是第三个URX那一眼您要发那一样哪个URXOK 我回过去请问原权3是从Client-sideproxy看到的log对 是原权4是server-sideserver-side看到的log对也就是说server-side看到三个URFserver-side看到就是因为我们里边你如果不配重视的话意思是说默认会有两次重视对吧因为我服务上有那个太远的泡的我给它故意写错了你就是防人不通防人不通你自己从我们这一段其实我就刻了一次 对吧我就直接这个图刻了一次在客户单看到是个503但是服务单但看到503实际上这个proxy代替你这个服务叫默认做了三次请求就算化了嘛三次请求全部都失败了在服务单看到会三次失败也就是说Client-side不会看到其他的代码只会看到一个URX对吧你重说一下Client-side不会看到其他的任何flag只会看到一个URX对我这个日志接的我所有的材料接的上下我接的会非常全的没有 就是没有不是我没接到它就是没有客户单只有一次客户单只会接一次服务单它因为是客户单自动帮你发起了两次重视 对吧但服务单它说我不知道这个到底是客户单发起的重视还是用户发起的重视用户自己本身的一个请求所以服务单它会有三次对我问这个问题是因为我看到那个图的时候我想那三个红叉应该画在那个右边那个那个框框以内那样就更清楚了画在画在那个从从server-side-proxy到那个上面那个server-side-proxy那有三个红叉然后从两个proxy之间就有一个红叉其实不对我觉得就应该画的这个地方因为这个重视是在因为那地方会误导别人就是说这个重视到底是这个代理发起的那个代理发起的大家看到这个这个重视是所办了这个代理发起的不是右办了那个代理发起的它重视发生在发生在客户单明白了对它重视发生在客户单这是一个基本原理吧我想问一下在上网上翻那个uf和uf是什么区别什么时候会出现uf什么时候会出现uf因为它俩不是唯一的一种就是互斥这种情况吗从构造的时候来说uf出现的其实就是你这个上游里面没有健康的实力就是这个实力就是比如说我们最常见的其实就是生产中出现也大方也就这种就你没有实力能连上来uf倒就是你连上来uf倒就是你连接的时候因为你有实力在但是我连的时候连失败掉它就会出uf您意思就是它uf那个健康检查就没有探测出来这种情况是吗什么意思正常来说它如果不健康的话它不就不应该去连了它什么情况下会认为它正常然后又去发起情形然后又连不上这个东西发起情形不是我们自己发起的吗它本身连不上你去连谈它就uf来那它uf内部是怎么做的呢它是怎么去探测它是不是健康的就是你说uf内部是谁这么做的对因为还是谁去检测它检测它是不是健康的状态那就是说它里边的是这个我明白您的意思uf的时候它是怎么把这个抱出来是吧里边的话如果没有健康实际上我们用到的看到的看到现象实际上就是这样子你一放的时候就是在那个你去把那个引爆供费给挡不出来看法就是卡在下边如果没有np它就会抱这个东西就是没有1.2s明白这样的意思就是要特点但可能还有一些外言其他特点我们可以再看一下但主要是就这个还有提问的吗好大有没有问题好的那我们有请下一位讲师好不好意思因为我们前面有些言务不好意思我们已经耽误了可以我现在没放上去回头会放到那个session下面大家可以下载好试试吧