dubbo+zookeeper

r囧r小猫 2023-06-13 06:20 14阅读 0赞

Dubbo

1.dubbo:是一款高性能的RPC(远程过程调用)框架。

它提供了三大核心能力:

  • 面向接口的远程方法调用
  • 智能容错和负载均衡
  • 服务自动注册和发现zookeeper。
1.1 RPC技术基本原理

在这里插入图片描述

stub是为了方便client,service交互而生成出来的代码。

影响RPC速度的两个核心点:

  • 序列化和反序列化(底层Io流 在传输)
  • 底层封装socket传递消息通信,影响dubbo的通信时间

2.zookeeper宕机之后,dubbo还能使用吗?

  • 可以,如果zookeeper集群中的某一台机器坏了,那么dubbo会自动访问zookeeper集群中的其他主机,zookeeper集群全部坏了,dubbo在第一次加载完的数据后,保存到数据本地(消费者端备份地址,ip,端口,包类名)一份,可以直接访问本地数据。
  • dubbo可以进行直连 ——>绕开zookeeper (消费者端保存信息,)
3.集群下的dubbo负载均衡策略:

在集群情况下,dubbo提供了多种负载均衡策略,默认值是random随机调用。

在这里插入图片描述

  • 方案一、random loadbalance:默认情况下,dubbo是random loadbalance随机调用实现负载均衡**(基于权重)**,可以对provider不同实例设置不同的权重,会按照权重来负载均衡,权重越大分配流量越高,一般就用这个默认的就可以了。

在这里插入图片描述

  • 方案二、roundrobin loadbalance:是基于轮询和权重将流量打入到各个机器上去。可以调整权重,来控制各个机器的流量大小,合理分配请求。

在这里插入图片描述

  • 方案三、leastactive loadbalance:这个是自动感知,如果这个机器性能越差,那么接收的请求越少,越不活跃,此时就会给不活跃的性能差的机器更少的请求。
    在这里插入图片描述
  • 方案四、consistanthash loadbalance:一致性hash算法,相同参数的请求一定分发到一个provider上去,provider挂掉的时候,会基于虚拟节点均匀分配剩余的流量,抖动不会太大。如果你需要的不是随机负载均衡,是要一类请求都到一个节点,那么就走了一致性hash策略。

3.1 dubbo和zookeeper机制

在这里插入图片描述

zookeeper专门处理分布式,统一管理注册服务

底层: 文件系统+通知

通知: 提供者模块发生变化即时消费者

容错机制: 随机调用一个服务地址,如果失败重试另一地址

流程: 生产者生产出来内容后,往zookeeper中注册。消费者去找zookeeper订阅,zookeeper具有通知的特征,生产者发生变化的时候,zookeeper会把变化推送给消费者,同时,dubbo自身也具备容错机制,调用服务器的时候,如果出错,会重试另一地址。长连接就是说一直处于连接状态。短连接是定时过一会连接一次。
在这里插入图片描述

4.集群容错:

当一个服务调用另一个服务,如果失败时的处理方案; 以下5种:

  • failover cluster模式:失败自动切换,自动重试其他机器,默认值。(重试多少次 )
  • failfast cluster模式:一次调用失败就立即失败。
  • failsafe cluster模式:出现异常,直接忽略,返回一个正常的空结果。(比价重要的数据)
  • failbackc cluster模式:失败了后台自动记录请求,然后隔一段时间再次重发,直到发送请求成功.比较适合于写消息队列这种。
  • forking cluster模式:(尽可能的保证成功)并行调用多个provider,只要一个成功就立即返回,forks设置最大并行数,消耗资源。
4.1 zookeeper宕 机与dubbo相连:

高可用的定义:通过设计,减少系统不能提供的服务时间

5.dubbo的服务降级:

**介绍:**当服务压力剧增时,根据实际业务情况和流量,对一些服务和页面有策略的不处理或做一种简单的方式处理,从而释放服务器资源以保证核心逻辑正确高效执行。

​ 两种手段: 1. 调用直接返回值为null,牺牲该模块,直接不发起远程调用。

​ 2.调用失败返回为null,不抛出异常,用来容忍服务不 稳定对调用方的影响。
在这里插入图片描述

6.dubbo原理:

dubbo的通信是实现了RPC技术,致力于封装通信的细节,通信底层是Netty。

netty:是一个异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端,它 极大的简化了TCP和UDP套接字服务器等网络编程,利用NIO(非阻塞io)实现。 底层是sockets

NIO原理

在这里插入图片描述

NIO主要有三大核心部分:

Channel(通道),Buffer(缓冲区),Selector(多路复用选择器)
传统IO基于字节流和字符流进行操作,而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择区)用于监听多个通 道的事件(比如:连接打开,数据到达)。因此,单个线程只要控制selectot就可用实现可以监听多个数据通道,从而线程非阻塞.一个多路复用器(Selector)可以负责成千上万个Channel,没有上限

#

1.zookeeper的概述

在这里插入图片描述






























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

虚线都是异步访问,实线都是同步访问
蓝色虚线:在启动时完成的功能
红色虚线(实线)都是程序运行过程中执行的功能

调用关系说明:

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

Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目。

Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应,从而实现集群中类似Master/Slave管理模式。

Zookeeper

1 Zookeeper=文件系统+通知机制

2.zookeeper能做什么?

  • 统一命名服务(dubbo)
  • 配置维护(如果数据发生改变,dubbo会自动通知其他的服务)
  • 集群管理
  • 分布式消息同步和协调机制(类似配置维护)
  • 负载均衡
  • 对dubbo的支持

备注:zookeeper提供了一套很好的分布式集群管理的机制,就是它基于层次型的目录树的数据结构,并对树种的节点进行有效的管理,从而设计出多种多样的分布式的分布式管理模式,作为分布式调度和沟通的桥梁。

3.配置参数解读

​ 解读zoo.cfg 文件中参数含义

  • tickTime:通信心跳数,Zookeeper服务器心跳时间,单位毫秒

Zookeeper使用的基本时间,服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳,时间单位为毫秒。

它用于心跳机制,并且设置最小的session超时时间为两倍心跳时间。(session的最小超时时间是2*tickTime)

  • initLimit:LF初始通信时限

集群中的follower跟随者服务器(F)与leader领导者服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量),用它来限定集群中的Zookeeper服务器连接到Leader的时限。

投票选举新leader的初始化时间

Follower在启动过程中,会从Leader同步所有最新数据到Follower,然后确定自己能够对外服务的起始状态。

Leader允许Follower 在initLimit时间内完成这个工作。

  • syncLimit:LF同步通信时限

集群中Leader与Follower之间的最大响应时间单位,假如响应超过syncLimit ***** tickTime,

Leader认为Follwer死掉,从服务器列表中删除Follwer。

在运行过程中,Leader负责与ZK集群中所有机器进行通信,例如通过一些心跳检测机制,来检测机器的存活状态。

如果L发出心跳包在syncLimit之后,还没有从F那收到响应,那么就认为这个F已经不在线了。

  • dataDir:数据文件目录+数据持久化路径保存内存数据库快照信息的位置,如果没有其他说明,更新的事务日志也保存到数据库。
  • clientPort:客户端连接端口

4.数据结构

4.1 文件系统
  • zookeeper维护了一个类型文件系统的数据结构
  • 类似windows的注册表,有名称,有树的节点, key–value的形式
  • 可以看成一个数的结构的数据库,分布在不同的机器上叫做名称管理
4.1.1 初始节点Znode:
  • ZooKeeper数据模型的结构与Unix文件系统很类似,整体上可以看作是一棵树,每个节点(都是键值对形式 key value )称做一个ZNode。
  • 很显然zookeeper集群自身维护了一套数据结构。这个存储结构是一个树形结构,其上的每一个节点,我们称之为”znode”,每一个znode默认能够存储1MB的数据,每个ZNode都可以通过其路径唯一标识。
4.1.2 深入节点Znode:

zookeeper的stat结构体:

znode维护一个stat结构体,这个stat包含数据变化的版本号,访问控制列表变化,还有时间戳。版本号和时间戳一起,可让zookeeper验证缓存和协调更新,每个znode数据发生了变化,版本号就增加。

例如:无论何时客户端检索数据,它也一起检索数据的版本号,并且客户端执行更新或删除时,客户端必须提供它正在改变的znode版本号,如果它提供的版本号和真实版本号不一致,更新。

  • czxid:引起这个znode创建的zxid,创建节点的事务zxid,为了保证顺序性
  • zkid:必须单调递增,因此zookeeper使用一个64位的数来表示,高32位是leader的epoch,从1开始,每次选出新的leader,epoch加1,低32位为该epoch内的序号,每次epoch变化,都将低32位的序号重置,这样保证zkid的全局递增性
  • ctime:znode被创建的毫秒数(1970年开始)
  • mzxid:znode最后更新的zxid
  • mtime:znode最后被修改的时间
  • pzxid:znode最后更新的子节点zxid
4.1.3 znode存在的类型
  • 创建节点方式 -e临时数据 -s防止节点存在,

  • PERSISTENT 持久化目录节点

  • PERSISTENT_SEQUENTIAL 持久化顺序编号目录节点
  • EPHEMERAL 临时目录节点
  • EPHEMERAL SEQUENTIAL 临时顺序编号目录节点

小结:zookeeper的一个节点对应一个应用,节点存储的数据就是应用需要的配置信息

4.2.watch 通知机制

数据观察和节点观察

客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、删除、子节点增加、zookeeper会通知客户端)

zookeeper支持watch的概念,客户端可以在每个znode节点上设置一个监听watch,如果被观察服务端的znode节点有变更,那么watch就被触发process,然后去重新取出数据,这个watch所属的客户端将收到一个通知包被告知那个节点发生了变化,把相应的时间通知给设置watcher的client端

在getData() getChildren()和exist()都有设置watch的选项。

发表评论

表情:
评论列表 (有 0 条评论,14人围观)

还没有评论,来说两句吧...

相关阅读