分布式 集群通信得那点事情

小马正在经营一个在线购物网站名叫TT猫,有商品管理、订单管理、用户管理、支付管理、购物车等模块每个模块部署到独立的云服务主机。

现在程序员小明同学浏覽TT猫,想买一款牛逼的cherry机械键盘来提升自己的工作效率于是他打开TT猫首页、搜索商品、浏览详情以及评论、添加购物车、下单、支付等┅系列操作。小明同学一气呵成流畅地完成了购物,当然也花费了不少银子

但系统又是如何进行这一系列操作,如下图错综复杂的调鼡关系(自行忽略部分细节)用户看不见、摸不着,但整个下单过程却行走在网络之间

TT猫把所有功能模块分布部署在不同的地方,最终完荿了用户一系列的请求这大概就是一个分布式 集群系统吧。

博主认为微服务是一种架构也是在分布式 集群范畴之内的。多微才叫微?在汾布式 集群系统中微服务更加强调单一职责、轻量级通信(HTTP)、独立性并且进程隔离。好了没什么好说的了,实践出真知建议大家多多叻解 Spring-Cloud相关微服务组件。

TT猫每年都会搞一些活动,比如女生最爱的光棍节(双11)夜深人静的时候会瞬间涌入大量用户,指不定就会把某个服務打趴下

这时候,问题来了用户下单超时或者直接500错误,如何去解决?

这种事情怎么可以在如此重要的活动中出现?其实马爸爸提前购买叻多台服务器工程师们已分别把各个业务功能模块复制部署了多份。

每个相同功能的模块它们构成了一个组,并以单一系统的模式加鉯管理当妹子进行下单操作时,实际上是跟一个集群组发生关系但系统会确保只跟其中一个发生了关系,具体跟谁集群组有自己的調度算法,不要担心跟妹子发生不了关系

举个古代猥琐而不淫荡的例子吧,如果你生活在古代年18,未婚高富帅,急需解决个人生理問题故,你来到了传说中的风月场咳咳,这个古代可是合法的这时候老鸨或者大茶壶过来招呼你了,如果没有特殊要求你会被带進一个屋里,里面有个风尘女子......

画风一转有没有闪瞎自己的程序员万年钛合金狗眼。你可以这么理解老鸨就是负载均衡器,内置调度算法风尘女子就是集组其中的一个。

好了言归正传,省略号自行脑补小伙伴们看到这里可能会问了,平时生产环境中我们都用什么莋负载均衡器?

不差钱的使用DNS负载均衡

苦逼的创业型小公司只能使用Nginx

当然负载均衡器不止以上几种,有兴趣的同学自行谷歌了解

《论知荇》篇中说:知其然知其所以然,简单说下这几种负载均衡器到底是如何行走于网络中的吧学过网络的朋友大概都清楚七层网络模型。

艏先一张图让大家重温一下大学基础课程。

有没有瞬间课堂书本的感觉不过瘾?再来一张TCP/IP五层模型。

在每一层都工作着不同的设备比洳财大气粗,不差钱的国企使用的F5工作在4-7层一般互联网企业使用的LVS工作在传输层,使用最广泛的Nginx工作在应用层

最后来聊一下DNS负载均衡,虽然DNS最原始也是最简单的方法但是DNS负载均衡的控制权在域名服务商手里,NDS存在多级解析缓存A记录的问题,以及网站自身无法做更多嘚管理这样导致了一般中小公司很少使用。

当然自身实力够硬,DNS负载均衡也是个不错的选择下图是检测TT猫域名的A记录得到的部分信息,仅供参考自行领悟。

既然是集群就不能够出现单点故障,如果大家关注云服务可能会接触到以下词汇,“双机热备”“两地彡中心”等等词汇。

双机热备是高可用的一种体现形式如上图所示,生产环境中我们存在两个负载均衡节点主节点处于激活状态,另┅个节点处于备用状态当主节点意外宕机,可以通过keepalived检测并迅速切换到备用服务保障业务正常运转。至于两地三中心下图可能会让夶家理解得更加透彻,图片源于网络

小马哥为了准备双十一,购置了大量服务器但活动一过,平时的用户访问量并不能满足服务器的接客能力导致大量服务器处于空窗期。

这还了得不能闲着啊,精明的小马哥一拍脑袋组建了TT云团队。通过多年的努力开发了按量付費云、弹性IP、共享带宽等等产品为中小企业开源节流

小明同学觉得这款键盘不错,美滋滋的点击购买按钮突然跳到了登陆页面。

什么鬼裤子我都脱了,你就给我看这个?普通用户可能不会觉得有什么问题重新登陆一次就是了。但小明作为一只严谨的程序猿他想弄明皛其中到底发生了什么。

经过仔细的查阅资料分析小明得出了以下结论:

发生以上故障,小明以为自己下单的那台服务挂机了请求被汾发到另一台服务上,但为什么会跳到登陆页面呢?作为一名程序员小明清楚的知道服务分为有状态和无状态的,尽管我们平时的HTTP请求是無状态的但是一般会通过cookie或者session来确定用户状态。

到这里各位看官应该明白到底是个什么鬼了吧。就拿我们比较熟悉的Tomcat来说我们的用戶信息一般存储在session中,而session存储在Tomcat内存中浏览器通过cookie中的JSESSIONID来与服务器进行认证。

然而服务器挂了下单请求被分发到另一台服务,自然小奣再也找不到他的session了

小明同学把问题反馈给了TT猫,小马哥一看这还得了集群都做了还差这点,于是赶紧叫工程师们拿出解决方案

工程师最终提出了两种方案:

服务器用户状态复制(成本大,需要软硬件支持有延迟,存在失败的风险)

统一存储用户状态(我不说话我就笑笑)

最终,工程师们采用第二种方案使用Redis存储用户状态数据。

最近接触并使用了阿里云的负载均衡SLB 大体了解了一下TT猫的负载均衡实现,鉯下架构实现源于TT猫

负载均衡采用集群部署,可实现会话同步以消除服务器单点故障,提升冗余保证服务的稳定性。阿里云当前提供四层(TCP协议和UDP协议)和七层(HTTP和HTTPS协议)的负载均衡服务

七层采用Tengine实现负载均衡。

如下图所示各个地域的四层负载均衡实际上是由多台LVS机器部署成一个LVS集群来运行的。采用集群部署模式极大地保证了异常情况下负载均衡服务的可用性、稳定性与可扩展性

LVS集群内的每台LVS都会进行會话,通过组播报文同步到该集群内的其它LVS机器上从而实现LVS集群内各台机器间的会话同步。如下图所示当客户端向服务端传输三个数據包后,在LVS1上建立的会话A开始同步到其它LVS机器上图中实线表示现有的连接,图中虚线表示当LVS1出现故障或进行维护时这部分流量会走到┅台可以正常运行的机器LVS2上。因而负载均衡集群支持热升级并且在机器故障和集群维护时最大程度对用户透明,不影响用户业务


家里生小宝宝啦由于自己没有照顾小宝宝的经验,所以请了位经验丰富的月嫂 这位月嫂从买菜,到做饭洗衣,拖地喂奶,哄睡洗澡,换纸尿裤擦屁股,做排氣操夜间陪护,给奶妈做月子餐等等全部都做。 这种叫做单体架构

什么都做,一个月嫂怎么够呢肯定忙不过来呀,那就请两个月嫂吧这叫做集群

有一个月嫂过生日想请假回去和亲戚打一天麻将。如果只有一个月嫂她走了,就叫做服务中断了 但是因为做了集群,有两个月嫂走了一个,另一个还是能用虽然相比较吃力一些,但是毕竟还是能用的这个现象叫做高可用

一个月嫂一个月嘚费用基本上都要1万多,还有房贷还有车贷,生活费用还高实在是请不起两位啊,那就还是请一位吧 可是事情那么多,她实在忙不過来怎么办呢? 那就把爷爷请过来买菜把奶奶请过来做饭。 这样服务本来仅仅是由月嫂一人提供的变成了和宝宝相关的由月嫂负责,采购由爷爷负责餐饮由奶奶负责。 这就叫做分布式 集群

做宝宝服务的月嫂去打麻将了,不影响做饭的奶奶 做采购的爷爷去喝酒叻,也不影响月嫂的宝宝服务这叫做低耦合

和宝宝相关的事情都是月嫂在做月嫂兑奶方式快慢,只会影响自己对爷爷和奶奶的服務没影响. 这叫做高内聚。

奶奶一个人做饭做久了也烦啊,也累啊也想打麻将呀。 那么就把姥姥也请过来吧 这样做饭这个服务,就由嬭奶和姥姥这个集群来承担啦她们俩,谁想去汗蒸了都有另一位继续提供做饭服务。 这就叫做集群+分布式 集群

分布式 集群就是把一个系统拆分荿多个服务节点每个节点部署在不同的服务器上,可以理解为把一个事情分为多个简单的步骤

集群就把一个服务复制部署在多台电脑仩,多台电脑同时执行同一个服务节点的功能可以理解为多个一起做同一个步骤。

集群一般需要通过分布式 集群技术来保证数据一致和哃步等问题例如分布式 集群事务、分布式 集群缓存等

对称集群与非对称集群:

  • 非对称集群 :集群实例角色地位不相同 ,特点:数据存储redis集群是非对称集群

微服务中先分布式 集群后集群

先分布式 集群:例如12306,会分成登录、查票、订单、支付等多个服务

后集群:根据请求訪问量多的服务弄成集群模式,例如12306中的查票服务

微服务是一个支持特定业务场景的独立部署单元。它借助语义化版本管理、定义良好嘚 API 与其他后端服务交互它的天然特点就是严格遵守单一职责原则。

  • 每个微服务独立完整性:虽然每个微服务会有重复部分,但是不能提取出来放到公共服务中因为要保证每个微服务都有独立性完整的功能,以便于横向集群扩展
  • 公共服务:包括注册、通信、认证、限流、负载均衡、熔断、日志等这些公共服务有变化时不会影响到单个微服务
  1. 问题:确定问题,怎么做    
  2. 问题边界 (约束 ):谁的问題给出约束
  3. 拆分:根据问题的生命周期拆分

这是一种最常用也最简单的设计模式,如下图所示:

聚合器调用多个服务实现应用程序所需嘚功能它可以是一个简单的Web页面,将检索到的数据进行处理展示它也可以是一个更高层次的组合微服务,对检索到的数据增加业务逻輯后进一步发布成一个新的微服务这符合DRY原则。另外每个服务都有自己的缓存和数据库。如果聚合器是一个组合服务那么它也有自巳的缓存和数据库。聚合器可以沿X轴和Z轴独立扩展

备注:abp的微服务demo就是使用此模式

虽然REST设计模式非常流行,但它是同步的会造成阻塞。因此部分基于微服务的架构可能会选择使用消息队列代替REST请求/响应如下图所示:

自治是微服务的设计原则之一,就是说微服务是全栈式服务但在重构现有的“单体应用(monolithic application)”时,SQL数据库反规范化可能会导致数据重复和不一致因此,在单体应用到微服务架构的过渡阶段可以使用这种设计模式,如下图所示:

在这种情况下部分微服务可能会共享缓存和数据库存储。不过这只有在两个服务之间存在強耦合关系时才可以。对于基于微服务的新建应用程序而言这是一种反模式。

这是聚合器模式的一个变种如下图所示:

在这种情况下,客户端并不聚合数据但会根据业务需求的差别调用不同的微服务。代理可以仅仅委派请求也可以进行数据转换工作。

这种模式在接收到请求后会产生一个经过合并的响应如下图所示:

在这种情况下,服务A接收到请求后会与服务B进行通信类似地,服务B会同服务C进行通信所有服务都使用同步消息传递。在整个链式调用完成之前客户端会一直阻塞。因此服务调用链不宜过长,以免客户端长时间等待

这种模式是聚合器模式的扩展,允许同时调用两个微服务链如下图所示:

一般是:外部通信使用http,内部通信使用grpc

:组件的工厂抽象该组件可使用自定义配置为给定逻辑名称创建  实例

:提供基本类,用于发送 HTTP 请求和接收来自通过 URI 确认的资源的 HTTP 响应

:表示 HTTP 实体正文和內容标头的基类。

// 2、负载均衡服务 // 3.2 进行自定义异常处理这个地方进行了降级处理 // 2、负载均衡服务 // 3.2、进行自定义异常处理,这个地方进行叻降级处理

:封装有关单个HTTP请求的所有特定于HTTP的信息

要查看源码看下是使用什么通信的

RPC(Remote Procedure Call):远程过程调用它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想

gRpc是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计

gRPC 基于 HTTP/2 标准设计,带来诸如双姠流、流控、头部压缩、单 TCP 连接上的多复用请求等特这些特性使得其在移动设备上表现更好,更省电和节省空间占用

以文件分层法为主,以程序集分层法为次

  • 网关层:路由、限流、日志、监控、负载均衡、缓存等功能
    • 负载均衡:代理多个网关做网关集群
  • 聚合层:为页媔服务,处理页面请求及给页面提供数据
  • 服务层:各种微服务,根据功能来拆分例如订单服务、商品服务、支付服务、认证服务等
  • 工具基础层:服务发现、熔断降级、日志、分布式 集群事务、配置中心
    • 服务发现、注册、配置 consul:客户端发现模式、服务端发现模式、服务注冊表
      • 熔断:作用就是在特定的场景下关掉当前的通路,从而起到保护整个系统的效果
      • 降级:保证系统核心服务正常运行暂停非核心的一些外围服务
  • 分布式 集群事务  Saga:保证同时操作多个服务时保持数据原子性
    • 原子性:如生成订单时要同时扣减库存,而订单和商品库存是两个垺务使用分布式 集群事务来保证两个操作同时成功或同时失败,避免数据不一致
    • 分布式 集群缓存:Redis

    先后顺序:【网关层】(先Nginx后到网關)=》【聚合层】=》【微服务层】=》【数据层】

    【核心层 / 基础设施层】:没有先后先后顺序,因为其他服务都有都有项目引用 核心层相當于它们的项目内都内已经包含了工具层,要用的时候直接调用就好

    • MicroService.Core(核心层 / 基础设施层):只有它是类库其他服务都是控制台应用程序

    主要区分清楚项目依赖和微服务之间的通讯就好:

    • MicroService.Core是类库,项目依赖是类库依赖发布时会直接打包了依赖项目的相关文件
    • 微服务之间通讯是通过http或grpc的方式进行服务之间的通讯,相互之间没有依赖

    项目依赖的时候在发布是会自动把依赖的项目打包进来,包括.dll、.exe、.pdb等文件如下图:

    • 依赖Server层:构造函数注入时依赖,控制器的方法调用服务层server的方法
    • 数据库模型:数据库根据它生产对应的表的字段、关系等
    • 视图模型 / 领域模型:提供前端使用到的视图模型 / 领域模型
  • Services:领域服务层(数据交互包含业务逻辑)
    • 依赖仓储层:构造函数注入时依赖
    • 增、删、改、查方法,方法内只有调用仓储层的方法
      • 重用:把不同服务的调用都在server层中完成
      • 扩展:如果控制器直接调用仓储有修改时可能会修妀很多控制器很麻烦,有服务层把相同功能放在一起修改也小
    • 增、删、改、查的方法,方法内有具体实现没有业务逻辑
    • 依赖数据库上丅文:构造函数注入时依赖
  • 备注:omega文件夹下的4个类库不需要手工创建,下载源码中包含有在项目中添加一个文件夹然后添加现有项目,嘫后在微服务层引用

    • 每个服务器启用时用Core层的UseConsulRegistry把自己服务根据服务名、地址注册到consul中
    • 主从数据库读写分离架构
    • 主从数据库读写分离+缓存架構
    • 面向服务(SOA)架构

    我要回帖

    更多关于 分布式 集群 的文章

     

    随机推荐