一.分布式和集群的区别?
相同点: 无论分布式和集群,都是服务器在做事情。
异同点:
例如:
分布式: 三个服务器负责的工作不一样。
集群: 三个服务器的工作一样。
二.ZooKeeper是什么?
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,在Dubbo架构充当服务注册和发现的角色。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper 为我们提供了高可用、高性能、稳定的分布式数据一致性解决方案,通常被用于实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。
ZooKeeper 将数据保存在内存中,性能是非常棒的。在“读”多于“写”的应用程序中尤其地高性能,因为“写”会导致所有的服务器间同步状态。(“读”多于“写”是协调服务的典型场景)。
三.ZooKeeper的特点?
1. 是一个leader和多个follower来组成的集群(狮群中,一头雄狮,N头母狮)。
2. 集群中只要有半数以上的节点存活,Zookeeper就能正常工作(5台服务器挂2台,没问题;4台服务器挂2台,就停止)。
3. 单一系统映像:全局数据一致性,每台服务器都保存一份相同的数据副本,无论client连接哪台server,数据都是一致的。
4. 原子性:更新原子性,一次数据要么成功,要么失败(不成功便成仁)。
5. 实时性,在一定时间范围内,client能读取到最新数据。
6. 顺序一致性:新的请求按照顺序执行,会按照发送过来的顺序,逐一执行(发来123,执行123,而不是321或者别的)。
四.ZooKeeper的应用场景?
用于实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。
提供的服务包括:统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。
1.统一命名服务
在分布式环境下,通常需要对应用或服务进行统一的命名,便于识别。例如:服务器的IP地址不容易记,但域名相比之下却是很容易记住,把不同的ip映射成统一的域名
2.统一配置管理
分布式环境下,配置文件做同步是必经之路。
1000台服务器,如果配置文件作出修改,那一台一台的修改,运维人员肯定会疯,如何做到修改一处就快速同步到每台服务器?
答: 将配置管理交给Zookeeper
1、将配置信息写入到Zookeeper的某个节点上。
2、每个客户端都监听这个节点。
3、一旦节点中的数据文件被修改,Zookeeper这个话匣子就会通知每台客户端服务器。
3.服务器节点动态上下线
客户端能实时获取服务器上下线的变化(例如: 在美团APP上实时可以看到商家是否正在营业或打样)。
4.软负载均衡
Zookeeper会记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户请求。
5.分布式锁
通过创建唯一节点获得分布式锁,当获得锁的一方执行完相关代码或者是挂掉之后就释放锁。
五.ZooKeeper内部原理
1.选举机制
(注意:半数机制:集群中半数以上机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。)
虽然在配置文件中并没有指定Master和Slave。但是,Zookeeper工作时,是有一个节点为Leader,其他则为Follower,Leader是通过内部的选举机制临时产生的。
1.1. Server1先投票,投给自己,自己为1票,没有超过半数,根本无法成为leader,顺水推舟将票数投给了id比自己大的Server2。
1.2. Server2也把自己的票数投给了自己,再加上Server1给的票数,总票数为2票,没有超过半数,也无法成为leader,也学习Server1,顺水推舟,将自己所有的票数给了id比自己大的Server3。
1.3. Server3得到了Server1和Server2的两票,再加上自己投给自己的一票。3票超过半数,顺利成为leader。
1.4. Server4和Server5都投给自己,但是无法改变Server3的票数,只好听天由命,承认Server3是leader。
2.节点类型
持久型(persistent):
持久化目录节点(persistent)客户端与zookeeper断开连接后,该节点依旧存在。
持久化顺序编号目录节点(persistent_sequential)客户端与zookeeper断开连接后,该节
点依旧存在,创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调
递增的计数器,由父节点维护,例如:Znode001,Znode002...
短暂型(ephemeral):
临时目录节点(ephemeral)客户端和服务器端断开连接后,创建的节点自动删除
临时顺序编号目录节点(ephemeral_sequential)客户端与zookeeper断开连接后,该节点
被删除,创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增
的计数器,由父节点维护,例如:Znode001,Znode002...
3.监听器原理
1. 在main方法中创建Zookeeper客户端的同时就会创建两个线程,一个负责网络连接通信,一个负
责监听
2. 监听事件就会通过网络通信发送给zookeeper
3. zookeeper获得注册的监听事件后,立刻将监听事件添加到监听列表里
4. zookeeper监听到 数据变化 或 路径变化,就会将这个消息发送给监听线程
常见的监听:
1. 监听节点数据的变化:get path [watch]
2. 监听子节点增减的变化:ls path [watch]
5. 监听线程就会在内部调用process方法(需要我们实现process方法内容)
4.写数据流程
1. Client 想向 ZooKeeper 的 Server1 上写数据,必须的先发送一个写的请求
2. 如果Server1不是Leader,那么Server1 会把接收到的请求进一步转发给Leader。
3. 这个Leader 会将写请求广播给各个Server,各个Server写成功后就会通知Leader。
4. 当Leader收到半数以上的 Server 数据写成功了,那么就说明数据写成功了。
5. 随后,Leader会告诉Server1数据写成功了。
6. Server1会反馈通知 Client 数据写成功了,整个流程结束
六.Dubbo是什么?
Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架,现已成为 Apache 基金会孵化项目。
1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
3.服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。
(Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载)
七.为什么使用Dubbo?
因为是阿里开源项目,国内很多互联网公司都在用,已经经过很多线上考验。内部使用了 Netty、Zookeeper,保证了高性能高可用性。
使用 Dubbo 可以将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,可用于提高业务复用灵活扩展,使前端应用能更快速的响应多变的市场需求。
八.Dubbo的核心组件(节点角色)
节点 | 角色说明 |
Provider | 服务的提供方(洗浴中心) |
Consumer | 服务的消费方(客人) |
Registry | 服务注册与发现的注册中心(便民服务中心,所有的饭店娱乐场所都在已在本中心 注册) |
Monitor | 监控服务的统计中心(统计服务被调用的次数) |
Container | 服务运行容器(烧烤一条街,洗浴一条街) |
图例:
九.Dubbo核心的配置有哪些?
配置 | 配置说明 |
dubbo:service | 服务配置 |
dubbo:reference | 引用配置 |
dubbo:protocol | 协议配置 |
dubbo:application | 应用配置 |
dubbo:module | 模块配置 |
dubbo:registry | 注册中心配置 |
dubbo:monitor | 监控中心配置 |
dubbo:provider | 提供方配置 |
dubbo:consumer | 消费方配置 |
dubbo:method | 方法配置 |
dubbo:argument | 参数配置 |
十. Dubbo在安全机制方面是如何解决?
Dubbo通过Token令牌防止用户绕过注册中心直连,然后在注册中心上管理授权。Dubbo还提供服务黑白名单,来控制服务所允许的调用方。
十一. 为什么要服务降级? 服务降级实现方式?
为什么要使用服务降级,这是防止分布式服务发生雪崩效应。
什么是雪崩?就是蝴蝶效应,当一个请求发生超时,一直等待着服务响应,那么在高并发情况下,很多请求都是因为这样一直等着响应,直到服务资源耗尽产生宕机,而宕机之后会导致分布式其他服务调用该宕机的服务也会出现资源耗尽宕机,这样下去将导致整个分布式服务都瘫痪,这就是雪崩。
实现方式:
在 管理控制台配置服务降级:屏蔽和容错。
屏蔽:mock=force:return+null 表示消费方对该服务的方法调用都 直接返回 null 值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。
容错:mock=fail:return+null 表示消费方对该服务的方法调用在 失败后,再返回 null 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。