分布式基础理论

1、什么是分布式系统

《分布式系统原理与范型》定义:

“分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统”

分布式系统(distributed system)是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。

随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。

2、发展演变

ORB----->MVC----->RPC----->SOA

2.1 单一应用架构

当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。

适用于小型网站,小型管理系统,将所有功能都部署到一个功能里,简单易用。

优点:(1)易于开发:现在很多开发工具都是支持开发单一应用结构的应用

           (2)易于部署:可以以一个WAR包的形式在适合的环境中部署

           (3)易于伸缩:可以通过负载均衡服务运行多个应用实例,达到可用性及可伸缩性的目的

缺点: (1)性能扩展比较难

            (2)协同开发问题

            (3)不利于升级维护

            (4) 技术栈捆绑问题

2.2 垂直应用架构

当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。

优点:(1)通过切分业务来实现各个模块独立部署

           (2)降低了维护和部署的难度

           (3)团队各司其职更易管理

             (4)   性能扩展也更方便,更有针对性

缺点:(1)复杂应用的开发维护成本变高,部署效率逐渐降低。因为随着业务功能的不断膨胀,代码全量编译和部署一次所需的时间非常长。更为严重的是只要某个功能编译出错或者功能测试出问题,就需要重新打包编译,软件的部署效率极低。

           (2)团队协作效率差,部分公共功能重复开发,代码重复率居高不下。随着业务的发展,团队规模不断扩大,研发被打散到不同的开发小组中。不同的功能模块可能会依赖一些公共能力组件,由于没有类似服务化这种技术契约约束,很难在不同团队间实现无缝沟通和共享,加之公共能力都是些本地API实现,这就导致公共API被重复开发,不能在团队间有效重用,这会导致编写大量的重复代码。

           (3)系统可靠性变差。随着业务的发展,访问量逐渐攀升,网络流量、负载均衡、数据库连接等都面临着巨大的压力。某个节点的故障会导致分摊到其他节点的流量陡增,引起“雪崩效应”,高并发、大流量对系统的可靠性要求非常高。垂直架构将所有的应用模块都部署到一个进程中,如果某个应用接口发生故障,例如内存泄漏,会导致整个节点宕机。由于是对等集群部署,这就意味着其他节点也有类似的问题,宕机可能会此起彼伏,严重影响业务的正常运行。

           (4)维护和定制困难。由于业务代码不断膨胀,功能越来越复杂,已有垂直架构模式下无法对复杂的业务进行拆分,代码修改牵一发而动全身,维护和定制都非常困难。

          (5)新功能上线周期变长。主要有两个原因导致交付效率下降。

2.3 分布式服务架构

当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。\

2.4 流动计算架构

当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)[ Service Oriented Architecture]是关键。

                                           

3、RPC

3.1 什么叫RPC

RPC【Remote Procedure Call】是指远程过程调用,是一种进程间通信方式,他是一种技术的思想,而不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的函数,本质上编写的调用代码基本相同。

RPC基本原理

 

RPC两个核心模块:通讯,序列化。

3.2 RPC调用过程

3.2.1、服务消费者(client客户端)通过本地调用的方式调用服务

3.2.2、客户端存根(client stub)接收到调用请求后负责将方法、入参等信息序列化(组装)成能够进行网络传输的消息体

3.2.3、客户端存根(client stub)找到远程的服务地址,并且将消息通过网络发送给服务端

3.2.4、服务端存根(server stub)收到消息后进行解码(反序列化操作)

3.2.5、服务端存根(server stub)根据解码结果调用本地的服务进行相关处理

3.2.6、本地服务执行具体业务逻辑并将处理结果返回给服务端存根(server stub)

3.2.7、服务端存根(server stub)将返回结果重新打包成消息(序列化)并通过网络发送至消费方

3.2.8、客户端存根(client stub)接收到消息,并进行解码(反序列化)

3.2.9、服务消费方得到最终结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值