Zookeeper & Dubbo

2020-10-11  本文已影响0人  极速魔法

Zookeeper

概述

开源分布式的(多台服务器干一件事),为分布式应用提供协调服务Apache项目。类似于平台,中介

工作机制

基于观察者模式设计的分布式服务管理框架

分布式和集群区别

特点

数据结构

整体看做一棵树,每个节点ZNode
每个ZNode 默认能存储 1M数据(元数据)

配置参数

/zoo.cfg/

tickTime=2000 #通信心跳 每隔2s

initLimit=10 # 初始通信时限,follower 和leader 之间启动时能容忍的多心跳数,超过则认为失效的连接
syncLimit=5 # 最大响应时间,超过认为 follower挂掉

内部原理

选举机制

半数机制:半数以上机器存活,集群可用,适合安装奇数台机器

节点类型

监听器原理

  1. main方法总创建 Zookeeper客户端同时创建两个线程,负责网络通信和监听
  2. 监听事件通过网络发送给Zookeeper
  3. Zookeeper获得注册的监听事件后,监听事件加到监听列表
  4. Zookeeper监听到数据变化或路径变化,将消息发送给客户端的监听线程
    监听节点数据变化
    监听子节点增减变化
  5. 监听线程内部调用process方法处理

客户端明令

ls /

# 查看详情
ls -s /

# 创建普通节点
create /ru

# 创建节点保存数据
create /ru "pujing"

# 创建多级节点,上级节点要存在
create /ru/city

# 创建短暂节点
create -e /uk

# 创建带序号的节点
create -s /ru/city

# 获得节点的值
get /ru/city

# 修改节点
set /ru/city "nan"

# 监听
addwatch /usa

# 递归删除
deleteall /ru

API

// 创建zookeeper客户端 
ZooKeeper zkcli = new ZooKeeper(connStr, sessionTimeout, new Watcher() { 
  public void process(WatchedEvent watchedEvent) {
        ...
  }
});

// 创建节点, Ids.OPEN_ACL_UNSAFE权限控制
String nodeCreated = zKcli.create("/lagou", "laosun".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

// 获取节点,false代表不监听
byte[] bs = zKcli.getData("/lagou", false, new Stat()); // 路径不存在时会报错
String data = new String(bs);

// 0 代表dataVersion
Stat stat = zKcli.setData("/lagou", "laosunA".getBytes(), 0);

// 删除节点,dataVersion = 1
zKcli.delete("/lagou", 1);

// 获取子节点
List<String> children = zKcli.getChildren("/",false); // false:不监听

// 节点是否存在
Stat stat = zKcli.exists("/lagou", false);
stat == null ? "存在" : "不存在";

分布式锁

  1. 所有请求进来,在/lock下创建 临时顺序节点
  2. 判断自己是不是/lock下最小的节点
      1. 是,获得锁(创建节点)
    1. 否,对前面小一级的节点进行监听
  3. 获得锁请求,处理完业务逻辑,释放锁
  4. 后一个节点得到通知重复步骤 2

Curator

// 重试策略 (1000毫秒试1次,最多试3次)
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);

//1.创建curator工具对象 
CuratorFramework client = CuratorFrameworkFactory.newClient(connectString, retryPolicy);

client.start();

//2.根据工具对象创建“内部互斥锁” 
InterProcessMutex lock = new InterProcessMutex(client, "/product_"+id);

try { 
    //3.加锁 
    lock.acquire(); 
    productService.reduceStock(id); 
}catch(Exception e){ 
    if(e instanceof RuntimeException){ throw e; } 
}finally{ 
    //4.释放锁 
    lock.release(); 
} 

Dubbo

系统架构

简介

Dubbo是分布式服务框架,提高性能和透明化的RPC远程服务调用方案

RPC

PRC(Remote Procedure Call)远程过程调用,进程通信方式

通信原理

  1. 客户端序列化对象,底层使用socket发送给服务方
  2. 服务方接收,反序列化,
  3. 服务端操作完毕,新对象序列化传输给客户端
  4. 客户端获得操作后的数据,反序列化,得到新对象

节点角色

Dubbo整体架构

配置说明

<dubbo:reference interface="service.HelloService" id="helloService">
    <dubbo:method name="sayHello" retries="3">
    <dubbo:method name="sayNo" retries="0">
<dubbo:reference>   

服务降级

根据实际情况和流量,对一些服务停止或换种简单的方式处理,释放服务器资源保证核心业务。

降级方式

上一篇下一篇

猜你喜欢

热点阅读