草庐IT

【大话云原生】负载均衡篇-小饭馆客流量变大了

字母哥哥 2024-06-17 原文

文章目录

一、前言

这是《大话云原生》系列的第二篇,第一篇《煮饺子与docker、kubernetes之间的关系》推出之后受到大家的欢迎,很多朋友联系到我给我加油打气,还得到了CSDN头部博主哪吒大佬的支持,感谢!我会继续写下去!

书接上回介绍了《煮饺子与docker、kubernetes之间的关系》之后,小娜同学(我老婆)问:为什么不把服务统一开发成一个应用?搞什么分布式?这样感觉很庞大,很复杂啊?为什么要这么搞?所以大话云原生第二篇-负载均衡篇,现在开始!

二、从路边摊说起

周五晚上加了班,下班的时候已经很晚了,打电话给小娜打算去吃烧烤,就去我们经常去的那家“夫妻摊位”烧烤。到了之后才发现“夫妻摊位”升级了,现在变成了“夫妻饭馆”。由于已经比较晚了,店里人并不多,就和老板娘聊了起来。聊聊小饭馆的昨天、今天和明天!

老板娘介绍到:“以前路边摊的时候我俩刚结婚,手里资金有限,就想着开一个路边烧烤摊。我老公负责烤串做菜,我呢、负责服务收银及上菜。挣点小钱!”。老板娘谦虚,等我年纪大了没准也搞个烤串的营生,谁让我爱吃呢!老板娘说之所以能走到今天,主要是因为以下几点:

  • 她的摊位很少会出现长时间的等菜的现象。因为摊位的桌椅板凳的容量通常是有限的,通常也没那么多客人,食品总的需求量的上限也基本是固定的,相对好协调。
  • 沟通顺畅、快速,这头点菜点串吼一嗓子、那边就开始做上了。做好了再吼一嗓子,就上菜了。
  • 短小精悍、容易掉头。夫妻俩之所以选择从路边摊开始,是因为船小好掉头。有可能干一阵发现这个位置客流少,就可以立刻停止经营或者换个地方经营。

哎,别说,夫妻俩这个阶段就有点像一些软件服务创业公司,刚开始创业的时候,一般做的应用服务都是单体应用。笔者也见过一些小型创业公司上来就想搞微服务云原生,我觉得这不太现实。企业的架构都是一步一步衍进的,不要总想着一口吃一个胖子。如果京东淘宝从第一天做应用服务的时候就想做成今天的样子,他们一定活不到今天。就像一个没开过饭店的人第一次创业就要开五星级饭店,等待他的十有八九就是失败!

这里我所说的单体应用的特点,其实和路边摊的特点是差不多的:

  • 能够接纳的请求数量时有限的,一是从需求上没那么多用户,二是创业公司资源限制,服务器的内存、CPU配置是有限的。
  • 单体应用的视图层、控制层、持久层全都在一个应用里面,调用方便、响应快速。服务间没有远程调用RPC,响应速度更快一些,具体到某个服务请求的响应结果更快。
  • 开发简单、上手快、三五个人团队好管好用。老板决定不干了,随时可以掉头,基本不太肉疼。

还是要祝贺老板娘啊,生财有道,还会总结经验!

三、开饭馆与负载均衡

前一段时间就已经有人愿意为了吃他们夫妻做的烧烤排队了,这夫妻俩一想,我们这俩人也干不过来啊,怎么办?招人吧、扩大规模吧。

  • 招什么人?当然是厨师啊、端菜收银的妻子自己还能干得过来,主要是丈夫的活挺不住了,对,那就招厨师。
  • 不能让多出来的客人站着吃吧?租一个附近的门市、添置更多的桌椅板凳。

同样的道理,软件应用中的单体应用服务扛不住用户需求了怎么办,加服务器啊,多部署几个服务啊,负载均衡啊。

说说客户端负载均衡与服务端负载均衡

  • 小夫妻两一口气为饭馆配置了三个厨师(含丈夫),这下可够用了。妻子将单号订单给张厨师、双号订单给李厨师,两人都干不过来了,再将订单给丈夫。反正外人不用白不用,自己家人能歇会就歇会。她说给谁就给谁,她有自己的一套算法。这种模式就是“客户端负载均衡”,妻子作为客户端调用“厨师”服务,会记得总共有几个厨师,然后按照自己的算法将用户请求转发给其中一个厨师。我们常见的Spring Cloud每个服务请求其他微服务的时候,都在其内部维护一个微服务列表,然后根据请求目标及算法从微服务中选择一个服务进行远程服务调用。
  • 有一天这俩厨师提出意见:这么干太累了没有闲着时候,要么丈夫多出力,要么涨工资。夫妻俩一合计现在实力也不是很雄厚,还是丈夫多出力吧。那妻子也就没有必要记住“订单的单双号”了,就使用一款app输入顾客订单,该app可以实现订单的均衡分配给厨师。“这种模式就是“服务端负载均衡””。对于软件架构而言该app就是负载均衡器,常用的软件负载均衡器有nginx、haproxy等。还有一些硬件的负载均衡器,性能上要更好一些,当然收费也更“好”。架构如下图所示:

利与弊:

  • “利”就是应用的处理能力增加了,能够处理更多的订单。
  • “弊”就是沟通成本增加了,原来吼一嗓子解决的问题,现在需要靠app转发了(负载均衡器)。无论是远程服务调用,还是请求转发转发都是耗时的。

也就是说:饭店(应用服务)现在处理请求吞吐量上的能力增强了,但是在单个请求的处理速度上实际上是下降了。实际上这就是服务拆分的结果,服务拆分就是在 “用时间换空间” 。各位细品!

四、饭后沟通

吃完烤串之后,我将上面的一套理论将给了小娜,她很感兴趣:“软件架构真是脱离不开实际生活啊,到处都是活生生的例子”。我趁势吹起了牛逼:“这才哪到哪,下回带你去个大饭店见见世面,有微服务的大饭店!”。

有关【大话云原生】负载均衡篇-小饭馆客流量变大了的更多相关文章

  1. 【云原生】SpringCloud-Spring Boot Starter使用测试 - 2

    目录SpringBootStarter是什么?以前传统的做法使用SpringBootStarter之后starter的理念:starter的实现: 创建SpringBootStarter步骤在idea新建一个starter项目、直接执行下一步即可生成项目。 在xml中加入如下配置文件:创建proterties类来保存配置信息创建业务类:创建AutoConfiguration测试如下:SpringBootStarter是什么? SpringBootStarter是在SpringBoot组件中被提出来的一种概念、简化了很多烦琐的配置、通过引入各种SpringBootStarter包可以快速搭建出一

  2. ruby-on-rails - EC2 实例在负载均衡器中停止服务 - 2

    我有一个EC2实例正在运行。我有一个负载均衡器,它与EC2实例相关联。PingTarget:HTTP:3001/healthCheckTimeout:5secondsInterval:24secondsUnhealthythreshold:2Healthythreshold:10现在该实例显示为OutofService。我什至尝试更改监听端口等等。一切正常,直到重新启动我的EC2实例。任何帮助将不胜感激。仅供引用:我有一个在端口3001上运行的Rails应用程序,我有一个用于HTTP:80(loadbalancer)到HTTP:3001的监听器。我还在终端中通过ssh检查了正在运行的应

  3. ruby - 如何让 Ruby 找到原生库? - 2

    我在/usr/local/lib中安装了一些本地库。我现在正在尝试安装一个需要这些的gem,以便正确构建,但是gem构建失败,因为它找不到图书馆。gem的extconf.rb文件试图确认它可以找到库have_library()但由于某种原因失败了。我尝试设置一堆环境变量,但似乎没有任何效果:irb(main):003:0>require'mkmf'=>trueirb(main):004:0>have_library('gecodesearch')checkingformain()in-lgecodesearch...no=>falseirb(main):005:0>ENV['LD_LI

  4. 云原生(十八) | Kubernetes篇之Kubernetes(k8s)工作负载 - 2

    文章目录Kubernetes(k8s)工作负载一、Workloads二、Pod三、Deployment四、RC、RS、DaemonSet、StatefulSet五、Job、CronJob1、Job2、CronJob六、GCKubernetes(k8s)工作负载一、Workloads什么是工作负载(Workloads)工作负载是运行在Kubernetes上的一个应用程序。一个应用很复杂,可能由单个组件或者多个组件共同完成。无论怎样我们可以用一组Pod来表示一个应用,也就是一个工作负载Pod又是一组容器(Containers)所以关系又像是这样工作负载(Workloads)控制一组PodPod控制

  5. Nginx的6种负载均衡策略 - 2

    Nginx的6种负载均衡策略【轮询/加权轮询weight/ip_hash/least_conn/urlhash/fair】总结:nginx负载均衡策略1、轮询策略轮询策略其实是一个特殊的加权策略,不同的是,服务器组中的各个服务器的权重都是1upstreambackend{server192.168.136.136weight=1;server192.168.136.136:81weight=1;server192.168.136.136:82weight=1;server192.168.136.136:83weight=1;}server{listen80;server_namelocalho

  6. iphone - iPhone 原生应用的测试驱动设计 - 2

    我正在试验iPhoneSDK并在Nic博士的rbiPhoneTest项目中做一些TDD。我想知道有多少人(如果有的话)成功地使用了这个或任何其他iPhone/Cocoa测试框架?更重要的是,我想知道如何最好地断言专有的二进制请求/响应协议(protocol)。这个想法是通过网络发送二进制请求并接收二进制响应。请求和响应是使用byteand'ing和or'ing创建的。我正在使用黄金副本模式来测试我的请求。这是我到目前为止所拥有的。不要笑,因为我是ObjectiveC和Ruby的新手:requireFile.dirname(__FILE__)+'/test_helper'require'

  7. 【云原生 • Kubernetes】kubernetes 核心技术 - Ingress - 2

    本文导读一、前言二、Ingress和pod有什么关系三、使用Ingress对外暴露应用1.创建应用并使用NodePort暴露端口2.应用Ingress(1)部署IngressController(2)创建Ingress规则(3)在Windows系统的hosts文件添加域名访问规则一、前言在以往的操作过程中,我们都是将某端口号对外暴露,然后再使用IP+端口号进行访问服务,这是通过Service中的NodePort实现的。但是NodePort有着明显的缺陷:NodePort会在每一个node节点都启用一个端口,也就是说在集群中的任何一个node节点中,使用节点IP+端口号都能访问到该服务;每个端口

  8. javascript - 在网络浏览器中,窗口对象是原生 ECMAScript 对象吗? - 2

    ECMAScript规范定义了一个"uniqueglobalobjectthatiscreatedbeforecontrolentersanyexecutioncontext".此全局对象是ECMAScript的标准内置对象,因此是native对象。规范还指出:Inadditiontothepropertiesdefinedinthisspecificationtheglobalobjectmayhaveadditionalhostdefinedproperties.Thismayincludeapropertywhosevalueistheglobalobjectitself;for

  9. javascript - 使用 Moment.js 制作原生 ELM 模块 - 2

    我已经使用Elm玩了几天,我想移植Moment.JS,因为我发现缺少我想要的库,而Moment拥有我需要的一切.问题是我总是遇到同样的错误。我的native文件夹中有Moment.JS(名为MomentJS.js)和另一个名为Moment.js的文件(我的包装器)。问题是,当我在Moment.js中调用moment时,我收到一条错误消息,指出该moment未定义。我也尝试在我的elm文件中导入MomentJS.js,在Moment.js之前和/或之后。我还尝试将整个JS复制到Moment.js并在其末尾添加我的包装器。这些都没有用。你知道我能做什么吗?我一直在互联网上寻找类似的repo

  10. javascript - 有没有办法检查原生 Javascript 函数是否被猴子修补过? - 2

    例如,我在某个网站上加载了一个脚本,我想知道JSON.parse/stringify是否没有被猴子修补过。我注意到如果我在Chrome/FF中的函数上使用toString,JSON.stringify.toString,那么我会返回:functionstringify(){[nativecode]}我的问题是,您认为这是验证函数是否被猴子修补的好方法吗?也很想听听解决此问题的任何其他方法。 最佳答案 可以很容易地伪造JSON.stringify.toStringJSON.stringify=function(){}JSON.stri

随机推荐