分布式: 
1.将不同功能数据放到不能的机器上。 
2.将同一数据放到不同的服务器上(数据副本),服务器之间通过网络互通。(涉及到数据的一致局性问题)。

分布式系统的CAP理论: 
● 一致性(C):在分布式系统中的所有数据备份,在同一时刻是同样的值。(等同于所有节点访问同一份最新的数据副本) 
● 可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。 
    1.对数据更新具备高可用性(一个坏了由另一个自动成为主节点进行处理。 
    2.不要因为一个节点通信不上(通过网络连接有时连接不上正常),就出现用户请求出错, 
      在强一致性要求下特别不可用(因为要求每个节点的数据都是最新的才返回成功,有 
      一个失败都返回失败)。 
● 分区容错性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。 
    1.就是是否能接受分区(分区就是意味着节点之间可能会通信不上,可能会长时间连接不上。 
    2.因为是分布式所以是肯定选择了分区的,所以你只能在C和A中权衡进行选择了: 
      1)、选择C,可能会因为有节点通信不上,所以用户请示可能长时间得不到正确的回应,影响A。 
      2)、先择了A,就意味你要牺牲C,道理同选择C是类似的。

集群: 
就是用多个服务器来处理同一个功能或存储数据(这个有点像分布式(数据备份)),来提高对多用户请求的处理,防止一个服务器处理不过来。一般会通过反向代理(分发请求)来实现集群的功能(nginx:一个反向代理的软件)。

nginx:反向代理软件

1.用户的请求都先到达nginx,nginx再跟据配置计算出把这个请求发到集群里的那个服务器进行处理,nginx再接收它处理完的结果,再把结果返回给用户。

分布式服务框架一般可以分为以下几个部分,

(1)RPC基础层:

包括底层通信框架,如NIO框架、通信协议,序列化和反序列化协议,
以及在这几部分上的封装,屏蔽底层通信细节和序列化方式差异

(2)服务发布/消费:

服务提供者根据消费者请求消息中的接口名,方法名,参数列表等信息,通过Java反射,调用本地的接口实现类;
服务消费者将服务提供者发布的接口封装成远程服务调用;

(3)服务调用链:

在服务调用的职责链中,通过在调用链切面的编码完成相关的监控和扩展,如负载均衡,服务调用性能统计,调用完成通知,
失败重发等功能

(4)服务注册中心:

注册中心负责服务的发布和通知,需要支持服务的平滑上线下线等

(5)服务治理中心:

服务治理中心是一个可视化的模块,提供对服务的可视化分析和维护,包括服务运行状态,调用关系和健康度等

下面以Dubbo为例来分析分布式服务框架的结构。

2.Dubbo的设计角色

(1)系统角色

Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。

(2)调用关系

服务容器负责启动,加载,运行服务提供者。
服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者在启动时,向注册中心订阅自己所需的服务。
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

3.Dubbo是如何架构的

Dubbo的总体架构如图所示:

框架分层架构中,各个层次的设计要点:

服务接口层(Service):该层是与实际业务逻辑相关的,根据服务提供方和服务消费方的业务设计对应的接口和实现。
配置层(Config):对外配置接口,以ServiceConfig和ReferenceConfig为中心,可以直接new配置类,也可以通过spring解析配置生成配置类。
服务代理层(Proxy):服务接口透明代理,生成服务的客户端Stub和服务器端Skeleton,以ServiceProxy为中心,扩展接口为ProxyFactory。
服务注册层(Registry):封装服务地址的注册与发现,以服务URL为中心,扩展接口为RegistryFactory、Registry和RegistryService。可能没有服务注册中心,此时服务提供方直接暴露服务。
集群层(Cluster):封装多个提供者的路由及负载均衡,并桥接注册中心,以Invoker为中心,扩展接口为Cluster、Directory、Router和LoadBalance。将多个服务提供方组合为一个服务提供方,实现对服务消费方来透明,只需要与一个服务提供方进行交互。
监控层(Monitor):RPC调用次数和调用时间监控,以Statistics为中心,扩展接口为MonitorFactory、Monitor和MonitorService。
远程调用层(Protocol):封将RPC调用,以Invocation和Result为中心,扩展接口为Protocol、Invoker和Exporter。Protocol是服务域,它是Invoker暴露和引用的主功能入口,它负责Invoker的生命周期管理。Invoker是实体域,它是Dubbo的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起invoke调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。
信息交换层(Exchange):封装请求响应模式,同步转异步,以Request和Response为中心,扩展接口为Exchanger、ExchangeChannel、ExchangeClient和ExchangeServer。
网络传输层(Transport):抽象mina和netty为统一接口,以Message为中心,扩展接口为Channel、Transporter、Client、Server和Codec。
数据序列化层(Serialize):可复用的一些工具,扩展接口为Serialization、 ObjectInput、ObjectOutput和ThreadPool。

4.Dubbo的底层实现

(1)协议支持

Dubbo支持多种协议,如下所示:
Dubbo协议 Hessian协议
HTTP协议 RMI协议
WebService协议
Thrift协议 Memcached协议 Redis协议
在通信过程中,不同的服务等级一般对应着不同的服务质量,那么选择合适的协议便是一件非常重要的事情。你可以根据你应用的创建来选择。例如,使用RMI协议,一般会受到防火墙的限制,所以对于外部与内部进行通信的场景,就不要使用RMI协议,而是基于HTTP协议或者Hessian协议。

(2)默认使用Dubbo协议

连接个数:单连接
连接方式:长连接
传输协议:TCP
传输方式:NIO异步传输
序列化:Hessian二进制序列化
适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要使用dubbo协议传输大文件或超大字符串
使用场景:常规远程服务方法调用
从上面的适用范围总结,dubbo适合小数据量大并发的服务调用,以及消费者机器远大于生产者机器数的情况,不适合传输大数据量的服务比如文件、视频等,除非请求量很低。

(3)Dubbo源码模块图

Dubbo以包结构来组织各个模块,各个模块及其关系,如图所示:

可以通过Dubbo的代码(使用Maven管理)组织,与上面的模块进行比较。简单说明各个包的情况:
dubbo-common 公共逻辑模块,包括Util类和通用模型。
dubbo-remoting 远程通讯模块,相当于Dubbo协议的实现,如果RPC用RMI协议则不需要使用此包。
dubbo-rpc 远程调用模块,抽象各种协议,以及动态代理,只包含一对一的调用,不关心集群的管理。
dubbo-cluster 集群模块,将多个服务提供方伪装为一个提供方,包括:负载均衡、容错、路由等,集群的地址列表可以是静态配置的,也可以是由注册中心下发。
dubbo-registry 注册中心模块,基于注册中心下发地址的集群方式,以及对各种注册中心的抽象。
dubbo-monitor 监控模块,统计服务调用次数,调用时间的,调用链跟踪的服务。
dubbo-config 配置模块,是Dubbo对外的API,用户通过Config使用Dubbo,隐藏Dubbo所有细节。
dubbo-container 容器模块,是一个Standalone的容器,以简单的Main加载Spring启动,因为服务通常不需要Tomcat/JBoss等Web容器的特性,没必要用Web容器去加载服务。

5.服务暴露和消费的详细过程

(1)服务提供者暴露一个服务的详细过程

服务提供者暴露服务的主过程:

首先ServiceConfig类拿到对外提供服务的实际类ref(如:HelloWorldImpl),然后通过ProxyFactory类的getInvoker方法使用ref生成一个AbstractProxyInvoker实例,

到这一步就完成具体服务到Invoker的转化。接下来就是Invoker转换到Exporter的过程。

Dubbo处理服务暴露的关键就在Invoker转换到Exporter的过程(如上图中的红色部分),下面我们以Dubbo和RMI这两种典型协议的实现来进行说明:

Dubbo的实现

Dubbo协议的Invoker转为Exporter发生在DubboProtocol类的export方法,它主要是打开socket侦听服务,并接收客户端发来的各种请求,通讯细节由Dubbo自己实现。

RMI的实现

RMI协议的Invoker转为Exporter发生在RmiProtocol类的export方法,
它通过Spring或Dubbo或JDK来实现RMI服务,通讯细节这一块由JDK底层来实现,这就省了不少工作量。

(2)服务消费者消费一个服务的详细过程

服务消费的主过程:


首先ReferenceConfig类的init方法调用Protocol的refer方法生成Invoker实例(如上图中的红色部分),这是服务消费的关键。

接下来把Invoker转换为客户端需要的接口(如:HelloWorld)。

分布式、集群、分布式服务框架相关推荐

  1. 关于分布式集群的几个问题

    本文来说下关于分布式集群的几个问题 文章目录 什么是集群 什么是分布式 分布式集群 什么是集群 集群:同一个业务,分别部署在不同的服务器上 什么是分布式 分布式:一个业务分拆多个子业务,部署在不同的服 ...

  2. 利用ZooKeeper框架在Vmware虚拟机中搭建3台Linux分布式集群

    利用ZooKeeper框架在Vmware虚拟机中搭建3台Linux分布式集群 概述 配置 具体步骤 node1虚拟机制作 安装及固定IP 关闭防火墙 JDK安装 关闭SELinux 虚拟机克隆 固定I ...

  3. 百度开源联邦学习框架 PaddleFL:简化大规模分布式集群部署

    百度开源联邦学习框架 PaddleFL:简化大规模分布式集群部署 作者 | 钰莹近两年,联邦学习技术发展迅速.作为分布式的机器学习范式,联邦学习能够有效解决数据孤岛问题,让参与方在不共享数据的基础上联 ...

  4. SpringCloud(第 054 篇)简单 Quartz-Cluster 微服务,采用注解配置 Quartz 分布式集群...

    2019独角兽企业重金招聘Python工程师标准>>> SpringCloud(第 054 篇)简单 Quartz-Cluster 微服务,采用注解配置 Quartz 分布式集群 一 ...

  5. 集群,分布式,微服务的区别

    参考文献: 集群,分布式,微服务概念和区别理解 谢谢作者分享!

  6. SpringCloud(第 054 篇)简单 Quartz-Cluster 微服务,采用注解配置 Quartz 分布式集群... 1

    SpringCloud(第 054 篇)简单 Quartz-Cluster 微服务,采用注解配置 Quartz 分布式集群 - 一.大致介绍 1.因网友提到有没有采用注解式配置的Quartz例子,因此 ...

  7. 集群,分布式和微服务的区别

    一.概念 集    群: 同一个业务,部署在多个服务器上 分布式: 同一个业务,拆分成多个子业务,部署在不同的服务器上 微服务: 同一个业务,按照功能模块拆分,每一个服务只对应一个功能模块 二.区别 ...

  8. tcp out of order解决_分布式集群解决方案 学习笔记

    回到目录: OrangeZh:拉勾教育:JAVA高薪训练营 学习技术篇​zhuanlan.zhihu.com 介绍 文章内容输出来源:拉勾教育 Java高薪训练营 分布式集群解决方案相关 什么是分布式 ...

  9. Hadoop+Hbase分布式集群架构“完全篇”

    本文收录在Linux运维企业架构实战系列 前言:本篇博客是博主踩过无数坑,反复查阅资料,一步步搭建,操作完成后整理的个人心得,分享给大家~~~ 1.认识Hadoop和Hbase 1.1 hadoop简 ...

  10. 手把手教你搭建Hadoop生态系统伪分布式集群

    Hello,我是 Alex 007,一个热爱计算机编程和硬件设计的小白,为啥是007呢?因为叫 Alex 的人太多了,再加上每天007的生活,Alex 007就诞生了. 手把手教你搭建Hadoop生态 ...

最新文章

  1. 8种方案解决重复提交问题!
  2. PI-安装SoapUI on Windows
  3. C++ Q16: dereferencing
  4. [编程入门]宏定义的练习:输入两个整数,求他们相除的余数。用带参的宏来实现,编程序。
  5. 小程序沉浸式_企业开发小程序:客户裂变式增长
  6. CSS+HTML+JQuery简单菜单
  7. C#快速找出磁盘内的所有文件
  8. 网络协议笔记-数据链路层
  9. Python 在数据科学中一直打压 R 语言?
  10. (宏)Word 仅修改选中图片的尺寸
  11. Maven搭建SpringMVC+Mybatis项目详解
  12. 如何把电视盒子做成游戏机? —— 破解电视IPTV盒子(Skyworth E900-S)
  13. df满足条件的值修改_python – 如何根据其他列中的条件将pandas df列中的多个值更改为np.nan?...
  14. J-link 固件版本问题
  15. 控制面板Plesk, cPanel, DirectAdmin, whmcs,WDCP, AMH比较
  16. 并行程序设计导论 概念总结
  17. TzT233的大盘鸡(未完成)
  18. JetsonXavierAGX配置Yolov5环境
  19. windows 建立软连接
  20. {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证...

热门文章

  1. 4.5 案例9 使用QVector处理数组
  2. 本地运行vue的dist文件
  3. [968]程序运行时报错:由于找不到mfc110.dll,无法继续执行代码的解决方法
  4. python手绘代码_Python实现手绘功能
  5. 工业互联网的发展阶段划分
  6. 微众银行软件测试笔试题,微众银行--java面试题一
  7. 阿卡索获近亿元B轮融资,少儿在线英语为什么这么火?
  8. javaScript中创建数组的3种方式
  9. python 人像合成_用 Python 实现抖音上的“人像动漫化”特效,原来这么简单!
  10. 体验 服务器正在维护升级中 给大,关于未收录SSR降临! 限时活动的相关说明