最近在学spring cloud ,学到了一个新概念 客户端负载均衡(Ribbon)。对于负载均衡,百度给出的答案:
负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
参考博客: https://www.cnblogs.com/gucb/p/11237765.html
直白点说就是,一个服务器同时不能处理太多的请求,所以把服务部署在多台服务器上,在用户发出请求时,根据一定的策略,选择适合的服务器地址进行调用。
提到负载均衡,我们直接想到的就是Nginx,他是一个独立的进程单元,也就是一个单独的服务,通过负载均衡策略将请求进行分发。
《深入理解 Spring Cloud 与微服务构建(第2版)》 (这本书真的很好,我觉得没一句废话,值得一看)书中给的答案如下
将负载均衡的逻辑以代码的形式封装到服务消费者的客户端上,服务消费者客户端维护了一份服务提供者的信息列表,有了信息列表,通过负载均衡将请求分摊给多个消费者,从而达到负载均衡的目的。
小朋友,你是否有很多问号?我们既有服务端负载均衡又有客户端负载均衡,那到底应该用哪个,用哪个好,还是结合起来使用呢?我是很费解的,在百度上无论怎么查,无非就是重复两句话,nginx 是服务端, ribbon 是客户端。以及实现原理。
列如,参考博客:https://blog.csdn.net/u011136197/article/details/88720157
看完之后感觉,博主说的我懂了,我想知道的还是不明白,就是具体在生产环境我们用的是哪种方式实现负载均衡呢,回答是Nginx最多,那么ribbon 到底有什么存在的意义呢。
作者:Java3y
链接:https://www.zhihu.com/question/283286745/answer/763040709
来源:知乎二、集群/分布式/微服务/SOA是什么?
像我这种技术小白,看到这些词(
集群/分布式/微服务/SOA
)的时候,感觉就是遥不可及的(高大尚的技术!!)。就好像刚学Java面向对象的时候,在论坛上翻阅资料的时候,无意看到"面向切面编程",也认为这是遥不可及的(高大尚的技术!!)。但真正接触到"面向切面编程"的时候,发现原来就是如此啊,也没什么大不了的。只不过当时被它的名字给唬住了...
不知道各位在刚接触这些名字
集群/分布式/微服务/SOA
的时候,有没有被唬住了呢??
- 下面我就简单说说这些名词的意思
2.1什么是集群
以下内容来源维基百科:
计算机集群简称集群是一种计算机系统,它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作。在某种意义上,他们可以被看作是一台计算机。集群系统中的单个计算机通常称为节点,通常通过局域网连接,但也有其它的可能连接方式。集群计算机通常用来改进单个计算机的计算速度和/或可靠性。一般情况下集群计算机比单个计算机,比如工作站或超级计算机性能价格比要高得多集群技术特点:
- 通过多台计算机完成同一个工作,达到更高的效率。
- 两机或多机内容、工作过程等完全一样。如果一台死机,另一台可以起作用。
在维基百科上说得也挺明白的了,我来举个例子吧。
- 小周在公司写Java程序,但公司业务在发展,一个Java开发者可能忙不过来,小周有的时候也得请个假呀。于是请了3y过去一起做Java开发。平时小周和3y就写Java程序,但3y可能有事要回学校一趟。没事,公司还有小周做Java开发呢,公司开发还能继续运作。
- 3y跟小周都是做Java开发。
- 3y来了,小周的工作可以分担一些。
- 3y请假了,还有小周在呢。
我写了一个910便利网发布到服务器去了,现在越来越多的人访问了,访问有点慢,怎么办???很简单,(只有充钱才能变强),加配置吧(加cpu,加内存)。升级完配置之后,访问人数越来越多,于是发现又不禁用啦,在这台机器上加配置已经解决不了了,怎么办???很简单,(只有充钱才能变强),我再买一台服务器,将910便利网也发布到新买的这台服务器上去。
特点:
- 这两台服务器都是运行同一个系统--->910便利网
好处:
- 本来只有一台机器处理访问,现在有两台机器处理访问了,分担了压力。
- 如果其中一台忘记缴费了,暂时用不了了。没关系,还有另一台可以用呢。
集群:同一个业务,部署在多个服务器上(不同的服务器运行同样的代码,干同一件事)
2.2什么是分布式
以下内容来源维基百科:
分布式系统是一组计算机,通过网络相互连接传递消息与通信后并协调它们的行为而形成的系统。 组件之间彼此进行交互以实现一个共同的目标。我也来举个例子来说明一下吧:
- 现在公司有小周和3y一起做Java开发,做Java开发一般jQuery,AJAX都能写一点,所以这些活都由我们来干。可是呢,3y对前端不是很熟,有的时候调试半天都调不出来。老板认为3y是真的菜!于是让小周专门来处理前端的事情。这样3y就高兴了,可以专心写自己的Java,前端就专门交由小周负责了。于是,小周和3y就变成了协作开发。
- 3y对前端不熟(能写出来),但在调试的时候可能会花费很多时间
- 小周来专门做前端的事,3y可以专心写自己的Java程序了。
- 都是为了项目正常运行以及迭代。
我的910便利网已经部署到两台服务器去了,但是越来越多的人去访问。现在也逐渐承受不住啦。那现在怎么办啊??那继续充钱变强??作为一个理智的我,肯定得想想是哪里有问题。现在910便利网的模块有好几个,全都丢在同一个Tomcat里边。
其实有些模块的访问是很低的(比如后台管理),那我可不可以这样做:将每个模块抽取独立出来,访问量大的模块用好的服务器装着,没啥人访问的模块用差的服务器装着。这样的好处是:一、资源合理利用了(没人访问的模块用性能差的服务器,访问量大的模块单独提升性能就好了)。二、耦合度降低了:每个模块独立出来,各干各的事(专业的人做专业的事),便于扩展
特点:
- 将910便利网的功能拆分,模块之间独立,在使用的时候再将这些独立的模块组合起来就是一个系统了。
好处:
- 模块之间独立,各做各的事,便于扩展,复用性高
- 高吞吐量。某个任务需要一个机器运行10个小时,将该任务用10台机器的分布式跑(将这个任务拆分成10个小任务),可能2个小时就跑完了
分布式:一个业务分拆多个子业务,部署在不同的服务器上(不同的服务器,运行不同的代码,为了同一个目的)
2.3集群/分布式
集群和分布式并不冲突,可以有分布式集群
现在3y的公司规模变大了,有5个小伙子写Java,4个小伙子写前端,2个小伙子做测试,1个小伙子做DBA。
- Java,前端,测试,DBA的关系看作是分布式的
- 5个Java看作是集群的(前端,测试同理)...
2.4分布式/微服务/SOA
其实我认为分布式/微服务/SOA这三个概念是差不多的,了解了其中的一个,然后将自己的理解往上面套就好了。没必要细分每个的具体概念~~(当然了,我很期待有大佬可以在评论区留言说下自己的看法哈)
这个文章写的非常好,通俗易懂,如果你仅仅是想入个门,先知道 spring cloud 是干什么用的,看这个就够了,能在心里描绘一个大致的轮廓。如果你希望在spring cloud精进一些,在面试、工作时彻底理解 spring cloud 建议买一本前文讲过的 《深入理解 Spring Cloud 与微服务构建(第2版)》
举例说明,我们现在开发完了一个电商网站,用户来购物时。在单体架构中我们可能这么做:
单体架构进行集群部署,并增加负载均衡服务器,这种方式有一定的处理高并发的能力,不过随着业务越来越复杂,单体应用的代码量越来越大,代码的可读性,可维护性,可扩展性下降,新人接受代码所需的时间成倍增加,业务扩展带来的代价越来越大,笔者对这点特别赞同,刚来北京,进了一个专门做保险业务的公司。接个模块开发,一个类少说上万行,耦合性非常高,你只能在通读大量业务代码之后进行修改,过程及其痛苦。
于是,微服务框架出现了,我们可以把单体服务拆分成分布式系统,例如:
首先,整个电商服务分别部署了4个实例,这个时候可以在nginx配置一下负载均衡策略,这里的策略会有多种可选,配置完后,一个请求进来先到nginx,这时候根据之前配置的策略,会把请求转到多个实例中的其中一个,我们的程序中使用了springCloud作了分布式部署,在请求的相应方法中会调用其他服务实例,比如订单服务,需要调用支付服务和积分服务,调用的方式是ribbon,被调用的服务是两台服务器构成的集群,这个时候ribbon会根据默认的均衡策略选择其中的一个调用,这就是整个流程。
这回能理解什么是客户端负载均衡了,在微服务之间相互调用时,如果被调用的服务是以集群的形式部署的,那么将采取ribbon配置的负载均衡策略进行选择。
每笔订单都涉及到支付,并不是每笔订单都要积分,也就是说,订单、支付的请求量要大于积分服务的,那么我们可以用一个性能好的服务器运行订单、支付的服务,用一台相对差的服务器运行 积分服务。合理的利用的资源。