微服务是架构设计方式,分布式是系统部署方式
概念
微服务
简单来说微服务就是很小的服务,小到一个服务只对应一个单一的功能,只做一件事。这个服务可以单独部署运行,服务之间可以通过RPC来相互交互,每个微服务都是由独立的小团队开发,测试,部署,上线,负责它的整个生命周期。
微服务架构
在做架构设计的时候,先做逻辑架构,再做物理架构,当你拿到需求后,估算过最大用户量和并发量后,计算单个应用服务器能否满足需求,如果用户量只有几百人的小应用,单体应用就能搞定,即所有应用部署在一个应用服务器里,如果是很大用户量,且某些功能会被频繁访问,或者某些功能计算量很大,建议将应用拆解为多个子系统,各自负责各自功能,这就是微服务架构。
分布式
分布式服务顾名思义服务是分散部署在不同的机器上,一个服务可能负责几个功能,是一种面向SOA架构的,服务之间也是通过rpc来交互或者是webservice来交互的。
逻辑架构设计完后就该做物理架构设计,系统应用部署在超过一台服务器或虚拟机上,且各分开部署的部分彼此通过各种通讯协议交互信息,就可算作分布式部署,生产环境下的微服务肯定是分布式部署的,分布式部署的应用不一定是微服务架构的,比如集群部署,它是把相同应用复制到不同服务器上,但是逻辑功能上还是单体应用。
微服务相比分布式服务来说,它的粒度更小,服务之间耦合度更低,由于每个微服务都由独立的小团队负责,因此它敏捷性更高,分布式服务最后都会向微服务架构演化,这是一种趋势, 不过服务微服务化后带来的挑战也是显而易见的,例如服务粒度小,数量大,后期运维将会很难.
示例讲解
分布式
小马正在经营一个在线购物网站,名叫TT猫,有商品管理、订单管理、用户管理、支付管理、购物车等模块,每个模块部署到独立的云服务主机。
现在,程序员小明同学浏览TT猫,想买一款牛逼的cherry机械键盘来提升自己的工作效率。于是他打开TT猫首页、搜索商品、浏览详情以及评论、添加购物车、下单、支付等一系列操作。小明同学一气呵成,流畅地完成了购物,当然也花费了不少银子。
但系统又是如何进行这一系列操作,如下图错综复杂的调用关系(自行忽略部分细节)。用户看不见、摸不着,但整个下单过程却行走在网络之间。
集群
TT猫,每年都会搞一些活动,比如女生最爱的光棍节(双11),夜深人静的时候会瞬间涌入大量用户,指不定就会把某个服务打趴下。
这时候,问题来了用户下单超时,或者直接500错误,如何去解决?
负载均衡集群
这种事情怎么可以在如此重要的活动中出现?其实马爸爸提前购买了多台服务器,工程师们已分别把各个业务功能模块复制部署了多份。
每个相同功能的模块,它们构成了一个组,并以单一系统的模式加以管理。当妹子进行下单操作时,实际上是跟一个集群组发生关系,但系统会确保只跟其中一个发生了关系,具体跟谁,集群组有自己的调度算法,不要担心跟妹子发生不了关系。
高可用集群
既然是集群,就不能够出现单点故障,如果大家关注云服务,可能会接触到以下词汇,“双机热备”,“两地三中心”等等词汇。
双机热备是高可用的一种体现形式,如上图所示,生产环境中我们存在两个负载均衡节点,主节点处于激活状态,另一个节点处于备用状态,当主节点意外宕机,可以通过keepalived检测并迅速切换到备用服务,保障业务正常运转。
至于两地三中心,下图可能会让大家理解得更加透彻,图片源于网络。
扩展:负载均衡
负载均衡器
生产环境中我们都用什么做负载均衡器?
财大气粗的用硬件F5
不差钱的使用DNS负载均衡
技术牛逼的用LVS
苦逼的创业型小公司只能使用Nginx
当然,负载均衡器不止以上几种,有兴趣的同学自行谷歌了解。
七层网络模型:
TCP/IP五层模型
DNS负载均衡
DNS负载均衡的控制权在域名服务商手里,NDS存在多级解析,缓存A记录的问题,以及网站自身无法做更多的管理。这样导致了一般中小公司很少使用。
自身实力够硬,DNS负载均衡也是个不错的选择。下图是检测TT猫域名的A记录得到的部分信息,仅供参考。
弹性云
小马哥为了准备双十一,购置了大量服务器,但活动一过,平时的用户访问量并不能满足服务器的接客能力,导致大量服务器处于空窗期。
这还了得,不能闲着啊,精明的小马哥一拍脑袋,组建了TT云团队。通过多年的努力开发了按量付费云、弹性IP、共享带宽等等产品为中小企业开源节流。
ps:云计算相关概念(基础设施(infrastructure)、平台(platform)和软件(software))
故障转移
小明同学觉得这款键盘不错,美滋滋的点击购买按钮,突然跳到了登陆页面。
什么鬼,裤子我都脱了,你就给我看这个?普通用户可能不会觉得有什么问题,重新登陆一次就是了。但小明作为一只严谨的程序猿,他想弄明白其中到底发生了什么。
经过仔细的查阅资料分析,小明得出了以下结论:
发生以上故障,小明以为自己下单的那台服务挂机了,请求被分发到另一台服务上,但为什么会跳到登陆页面呢?作为一名程序员,小明清楚的知道服务分为有状态和无状态的,尽管我们平时的HTTP请求是无状态的,但是一般会通过cookie或者session来确定用户状态。
到这里,各位看官应该明白到底是个什么鬼了吧。就拿我们比较熟悉的Tomcat来说,我们的用户信息一般存储在session中,而session存储在Tomcat内存中。浏览器通过cookie中的JSESSIONID来与服务器进行认证。
然而服务器挂了,下单请求被分发到另一台服务,自然小明再也找不到他的session了。
小明同学把问题反馈给了TT猫,小马哥一看这还得了,集群都做了还差这点,于是赶紧叫工程师们拿出解决方案。
工程师最终提出了两种方案:
服务器用户状态复制(成本大,需要软硬件支持,有延迟,存在失败的风险)
统一存储用户状态(我不说话,我就笑笑)
最终,工程师们采用第二种方案,使用Redis存储用户状态数据。
TT猫的负载均衡实现:参考下面文章相关部分
参考文章