粉丝5.8万获赞37.7万

欢迎收听,首先要特别感谢波面 app 为我们这次的探讨提供了非常好的面试知识点。今天咱们来深入聊聊 double 的 服务降级机制 这个话题啊。嗯,可以说是高可用架构里的一个核心了。没错,我们会覆盖两种主流的实现方式,一个是 double 内置的 mark 机制,另一个是和 thirdnote 的 集成方案, 目标就是让你听完之后不仅知道是啥,更能跟面试官说明白为啥和怎么选。对 服务降级这个概念啊,其实你可以把它想象成是系统的备用计划。备用计划这个比喻有意思。 对啊,你想想,当一个非核心服务,比如说推荐服务,它突然出问题了,你总不能让它把核心的交易流程也给拖垮了吧?那肯定不行,所以这时候我们就暂时给他一个预设好的简单的响应,保证主流能继续走。 这个就是服务降级,它的核心目的就是防止雪崩效应,所谓雪崩,就是一个小服务移出问题,就像滚雪球一样,把上游调用它的服务全给拖垮了,最后整个系统就瘫痪了。哦,明白了, 那咱们先来拆解第一种方式就是 double 内置的这个 mock 机制。听起来它是一个比较简单直接的降级方案,我看资料说它的核心定位是在服务的消费方来配置,对吧?完全正确,这个点一定要记住, mock 是 在消费方, 它的出发时机也很明确,就是远程服务调用失败的时候,比如说超时了或者网络异常了,它就自动顶上来了。嗯,而且 double 在 这会儿还提供了不同层级的灵活性, 最简单的配置就是 mock 等于 true, mock 等于 true。 对, 这么一配 double 就 会自动给你生成一个返回默认值的 mock 类。比如对象就返回 no, 数字就返回零啊。当然,你也可以更直接一点儿,用 mock 等于 return no, 直接返回一个你指定的固定值。哎,我打断一下这个地方,我有个疑问,自动返回恼偶或者零,在有些场景下,它不会引发新的控制者异常吗?感觉像个甜蜜的陷阱啊。哈哈,你问到点子上了,这确实是个风险。 所以啊,这种简单的配置只适用于你,完全不关心返回值,纯粹就是为了避免程序抛出那个 r p c 异常的场景。 哦,原来是这样。在实际工作里,最灵活也最常用的还是自定义一个 mock 类。你需要创建一个实现相同接口的 mock 类,比如你的接口叫 demo service, 那 你就创建一个 demo service mock。 嗯,在这个 mock 类里,你就可以实现很复杂的降级逻辑了,比如返回一些缓存数据,或者给用户一个更友好的提示信息读否会按照接口名加 mock 这个约定自动去找。另外,我注意到配置里还有 force 点儿和 field 点儿 这种前缀,这个又是什么玩法?这个就是控制降级策略的官开了 fail 点是默认行为,也就是调用失败了才执行降级。嗯哼,而那个 force 点呢,就是强制降级,不管你远程服务是好是坏,所有请求都直接做降级逻辑。 这个在调试或者想临时屏蔽某个服务的时候特别好用。了解了默克机制,虽然清亮,但感觉它还是不够智能啊, 他没法自动判断说那个服务是不是已经恢复了,也不能根据失倍率这种指标来自动拉闸,也就是熔断,完全正确。这就引出了咱们的第二种方案,也是生产级的方案,集成三 t 农。 我记得有一次大促,一个下游的积分服务响应突然变得特别慢,嗯,当时 mock 机制就没法自动处理,结果导致我们上单流程的现成池都快被打满了, 最后还是靠三 tno 的 自动熔断才给救回来的。这就是生产级的插曲。哇,听起来三 tno 是 个狠角色, 那它跟 mock 到底有什么本质上的不同呢?三 tno 的 回心能力,嗯,它是三位一体的,服务熔断、流量控制,再加上服务降级,三位一体。 简单来说,留控是限制近来的请求量,垄断是主动切断对下游有问题的服务的调用,而降级才是调用失败后提供备用方案。 它非常智能,当一个服务的失败率达到逾值了,它就自动熔断。过一段时间呢,它还会尝试进入一个半开放的状态去逐步地恢复流量。听起来很强大,更关键的是,它的所有规则都可以通过控制台动态修改,你不需要重启应用, 这一点在生产环境中直观重要。那么我们来总结一下,如果让你来对比这两者,你会怎么说? 我觉得这里的核心选择其实反映了你整个系统的成熟度和你的维运理念哦,怎么说 double mock 呢?它更像是一个快速止学的战术工具,就是说在你还没建立起完善的监控和治理体系的时候,它非常有用。 而三 t 呢,它是一个系统性免疫的战略方案,它要求你从一开始就把服务治理当作整个架构的核心部分来设计。嗯,战术与战略这个对比非常精辟。 好了,理论我们都清楚了,现在咱们进入面事实战模式,想象一下,你现在就坐在面试官对面, 他喝了口水,然后抛出了第一个问题,同学,你在项目里用过 double 吗?聊聊他的服务降级是怎么做的好的。 首先我会说,主要有两种方式。第一种呢,是 double 内置的 mock 机制,它在消费段配置,用于简单的失败后降级,实现一个快速止泻。 第二种就是集成 centeno 这类专业的服务智力组建,它提供了更强大的垄断降级和留控能力,也是 double 三点 x 官方推荐的升场级方案,非常好,直接点出了两种方案和它们的定位。 那面试官很可能会追问,那你能具体说说 moc 和 centeno 的 核心区别吗?我会先从最根本的能力上说起。 moc 很 纯粹,它就是降级。 但三 tno 是 一个智力全家桶,除了降级,还包括了垄断和留控,这是第一个区别,一个是点,一个是面。嗯,我来补充第二个区别。智能化程度, mok 更像一个手动的关开,触发了就降级,它不会自动恢复。而 sentinel 呢,能根据失败率这些指标自动熔断,并且还有半开放的恢复机制,这个就非常智能,完全正确。第三点是配置位置的灵活性, mock 只能在消费方配置,而 sentinel 的 降级逻辑,也就是 fullback, 通常可以在服务提供方通过 at sentinel resource 注解来实现控制力更强。对,最后一点就是动态性。 santino 的 所有规则都可以动态配置,不需要重启,而 mock 的 修改通常是需要重新部署的。你看,我们刚才把能力、智能、配置、位置和动态性这四个核心区别都说清楚了, 这自然就引出了下一个关键问题。知道了这些区别,你在实际项目中究竟该如何做选择呢?这个就要回到我们刚才那个战术与战略的总结了。 我会告诉面试官,对于一些非核心的业务,简单的临时降级需求,或者在开发测试阶段用 double mock 就 行,因为它轻量又方便。但是对于任何要求高可用的生产级微服务系统,那毫无疑问肯定要选择集成三天哦, 因为它提供的是系统稳定性的一个全面保障。嗯,这个回答把技术选择上升到了架构理念,很有深度。 好,最后一个问题,面试官可能想考察你的细节掌握程度,他可能会问,能解释下 mock 配置里 false 点和 fail 点的作用吗?以及 santino 的 降级逻辑。配置在提供方为什么说这是一个优势?我会这样回答, fail 点是默认行为,就是调用失败了才降级。 false 点是强制降级,主要用于调试和功能屏蔽。而三 dno 能在提供方配置降级,它最大的优势在于责任内拒,责任内拒。对 服务提供方最了解自己服务的状况和最合适的降级策略,对吧?比如说是该返回缓存数据还是返回一个默认值? 把这个降级逻辑放在提供方就避免了消费方需要了解太多下游服务的实现细节,让服务的边界更加清晰。

面试官问你, r p c 和 http 有 什么区别?很多人上来就说 http 是 协议, r p c 是 框架。这句话不能算错,但太浅了。 真正面试要讲清楚的是, http 更像是对外暴露接口的通用方式, r p c 更像是服务内部互相调用的方法。调用方式我是小哲,点赞收藏加关注,我们马上开始,更多内容可以查看橱窗。 先说 http, http 本质上是一种应用层通信协议,我们平时写的接口,比如用户登录、查询订单、提交表单、上传文件,很多都是通过 http 来完成的。它的特点是通性强,跨语言、跨平台、跨系统都很方便, 比如前端调用后端浏览器访问服务器,第三方系统调用开放接口通常都会用 http, 因为大家都认识它,接入成本低,调试也方便,你用浏览器、 postman、 curl 都能直接请求。 再说 r p c, r p c 全称是远程过程调用,它的核心目标是让你调用远程服务,就像调用本地方法一样。比如订单服务要调用库存服务,如果用 r p c, 代码里可能看起来就像调用一个扣库存方法。 你不需要太关心底层怎么建立连接、怎么叙略化、怎么传输、怎么拿返回值这些事情, r p c 框架会帮你封装掉。像 doob 及 r p c 都是典型的 r p c 框架, 那它们最大的区别是什么?第一,使用场景不同, h t p 更适合对外接口,比如开放平台、前后端交互,第三方系统对接。 r p c 更适合内部服务调用,比如微服务之间订单服务调用库存服务、支付服务调用风控服务。 对外接口更看重通用性和兼容性,内部调用更看重性能、治理能力和开发体验。第二,调用方式不同。 http 通常是面向资源的,比如查询用户就是访问用户相关接口,新增订单就是访问订单相关接口,它强调的是我对某个资源做什么操作。 而 r p c 更像是面向方法的,比如调用创建订单方法、调用扣减库存方法、调用查询用户信息方法,它强调的是我调用远程服务里的某个函数,所以 r p c 写起来更像本地代码调用。 第三,数据传输方式不同。 http 接口里常见的是 json, json 的 优点是可读性好,调试方便, 但是缺点是体积相对大,解析成本也更高。 r p c 框架通常会使用更高效的叙略化方式,比如 protobiff、 heseman 等,这些格式可读性没那么强,但是传输体积更小,解析速度更快,所以在高频内部调用场景下, r p c 往往性能更好。 第四,服务治理能力不同。普通 http 调用本身只是一次请求和响应,如果你想做覆盖限流、重试、服务发现链路追踪,通常要额外接入网关、注册中心或者中间件。 而成熟的 r p c 框架往往天然就会集成这些能力,比如服务注册与发现、负债均衡、超时控制、失败重试、熔断降级等等。这也是微服务内部常用 r p c 的 重要原因,因为它不只是通信工具,更是一套服务治理体系。 但是要注意一点, rpc 和 http 不是 完全对立的关系, rpc 是 一种调用思想, http 是 一种通信协议,有些 rpc 框架底层也可以基于 http, 比如 grpc 就是 基于 http 二的,所以不能简单说 rpc 一定比 http 快, 或者 http 一定比 rpc 差, 要看具体协议叙略化方式、连接模型和使用场景。最后总结一下, http 更适合对外,它通用简单好调试,适合前后端交互和开放接口。 rpc 更适合对内,它像调用本地方法一样调用远程服务,性能更好,也更适合微服务治理。面试里你可以这样回答, http 关注的是通用通信,适合跨系统对接。 rpc 关注的是远程方法调用,适合内部服务之间高效协助。一句话记住,对外开放接口优先 http 内部服务调用常用 rpc。

你们公司技术团队开会,有没有为服务调用协议吵过架?有人说用 http 简单直接,有人说用 r p c 性能更强, 其实它俩根本不是竞争关系,而是分工问题。记住一个原则就够了。对外用 http, 内部用 r p c, 能一步的时候就用 m q, 怎么理解呢? h t p 就 像普通话,通用谁都能听懂。你对接外部伙伴也好,小程序 app 接口也好,用 h t t p 最省事,工具随手一抓就能掉 浏览器 pos 的 man 直接上。但内部服务之间还讲普通话,就有点亏了。 r p c 就 讲方言, 你们团队自己定规范, g r b c 配 protoc 八 f 四二点制全书数据包小一半还不止, 效率高得多,只是调试确实有点麻烦,不适合对外开放。那 m q 呢?有些事根本不用等,比如你下单成功,库存要扣,积分要加,物流要通知,这些事串联起来 又不得等到天荒地老扔进消息队列慢慢消化它不香吗?所以说,没有哪种协议最好,只有哪种最合适。你们公司的服务用的是什么协议? http rpc 还是 mq? 评论区聊聊。

面试官问你为什么 r p c 要比 http 更快?如果你脱口而出这题,我会因为 r p c 用了。二、禁止 http 是 文本格式。恭喜你, 和百分之九十的后人一样,不仅拿不到高分,还会被打上缺乏真实工程经验,只会照搬 demo 的 标签。今天就带大家扒一扒这个高频面试考点,同时我也为大家整理好了最全大场面试资料,关注评论六十六即可领取!首先来带大家分析一下这个问题具体考察什么? 一、对协议理解的深度面试官不仅仅是想知道 r p c 比 http 快, 更是想知道你是否理解 http 一 点一的协议开销,以及 r p c 框架在协议层做了哪些精简。 二、叙略化机制认知考察你是否清楚 jason、 xml 这类文本叙略化方式与 port、 buff、 hash 等二进制叙略化的性能差距以及背后的原因。三、连接管理意识看你是否了解长连接、复用 连接器管理对性能的影响,以及 r p c 框架在协议层做了哪些精简。四、工程辨析能力能否客观地说出 r p c 不 一定总是比 h t t p 快, 是一个加分项。那么接下来我带领大家拆解一下这个问题的正确解答。先看结论, 一、协议格式 h t t p 一 点一的豹纹头是纯文本的,每次请求都要携带一大堆嗨的信息。来看个直观的例子。 二、序列化,这是性能差距最大的一块。 h t t p 最常用的序列化格式是 jason, 而 r p c 框架通常使用二、进置序列化。 三、连接模型 h t p 一 点一默认虽然支持 keep live, 但在实际使用中,很多客户端连接复用效率并不高,而 r p c 框架天生就是基于长连接设计的。 四、网络模型,传统的 h t t p 服务多采用一请求一县城的 buy 模型,并发量大的时候线球数暴涨,上下文切换开销巨大。而主流 r p c 框架底层都是基于 netty 的 n i o 模型,说白了,网络模型决定的天花板有多高。 协议在精简,如果每个请求都占用一个县城,并发一上去照样扛不住。一句话, r p c 比传统 h t p 一 点一块, 核心在于协议更精简,连接附用更好,网络模型更优秀。但别忘了, h t t p 二加 g i p c 已经在缩小这个差距。面试时要说清是 h t t p 一 点一加 jason v s 自定义协议加二进制系列化的差异, 这才是面试官想听的,想精进面试技巧,全套大厂高频面试资料都整理好了,点点关注,直接免费分享给大家!

咱们今天正式开启 python web 项目实战的学习哦,首先第一步就是框架选型,大家要记住, 如果是小型灵活的个人项目,选轻量的 flas 就 足够了。如果是中大型企业级项目,优先选功能完善的争购,选对框架,后续的开发效率能提升至少百分之三十。咱们今天的实战项目就用大家上手最快的 flas 来做演示哈。 选好框架之后,咱们接下来做环境搭建,这里一定要注意哦,千万不要直接用本地的全局拍放环境, 一定要先创建一个项目专属的虚拟环境,然后再安装项目需要的依赖包,比如 flask, flask, flask 这些,避免不同项目的依赖版本冲突。大家跟着我一步步操作,先输入拍放杠 mvenvenven 建虚拟环境哦。 环境搭好之后,咱们来讲路由配置,说白了,路由就是告诉咱们的 web 服务用户访问哪个 url 的 时候要调用哪段代码来处理,比如我们配置访问 index 的 时候,对应首页的处理逻辑。这里要注意路由的请求方法哦,默认是 get, 如果要接收表单提交的话,还要手动加上 post 方法。接下来就是核心的试图函数编写了,试图函数就是咱们写业务逻辑的地方,用户的请求传过来之后, 我们在试图函数里处理对应的需求,比如查询商品数据,计算订单金额,最后返回一个响应给用户,可以是 html 页面,也可以是 json 格式的数据哦。 如果咱们要返回动态的 html 页面,就要用到模板渲染了。 python web 常用的模板引擎是帧制。二、 咱们可以把公共的头部、底部这些页面部分抽成基础模板,然后用变量循环判断这些语法动态填充数据,不用每个页面都写重复的 html 代码,能省超多时间的。 接下来是数据库交互的部分,咱们不用手写原生的 sql 语句,用 o r m 框架就可以了。 flask 配套用 flask sql 拎钩自带 o r m。 我 们只要定义 python 类,就对应数据库的表 操作类的对象,就能实现增删改查,对新手特别友好,还能避免 sql 注入的安全风险哦。 如果咱们的项目要做前后端分离或者对接小程序、 app, 这些端就要开发 restful 接口了,接口返回的都是 json 格式的数据,大家要注意遵守 restful 规范哦。 get 用来查询数据, post 用来新增数据, p u t 用来修改数据, d l t 用来删除数据。接口的命名也要尽量语义化,方便后续维护。接口写完之后,千万不要忘了加校验逻辑哦。首先要校验用户传过来的参数是不是符合要求,比如手机号格式对不对, 必填字段有没有传。然后还要校验用户的权限,比如普通用户不能访问管理员的操作接口,避免出现非法操作的数据安全问题。 后端的功能都写完之后,咱们就要做前端连调了,这时候要跟前端同学对接好接口的入餐、出餐格式,如果有跨域问题的话,咱们后端加个 course 配置就能解决。连调的时候遇到问题要多跟前端同学沟通,一起定位到底是前端传餐错了,还是后端逻辑有问题, 开发过程中难免会遇到报错,所以咱们一定要做好异常处理,最好写一个大局的异常捕获函数,不管哪里出了错,都能返回统一格式的错误提示,不会直接把原声的报错信息暴露给用户,既友好又安全,调试的时候也能快速定位问题, 最后所有功能都测试没问题了。常用的部署组合是 in gix 加 uw s g i 加 python, 把项目传到云服务器上,配置好运行环境,绑定域名之后,用户就能正式访问咱们的项目了。咱们整个实战项目的完整流程就走完了,大家学会了吗? 最后别忘了点关注、点赞,进咱们的学习交流群,领取实战项目的完整代码哦!