美文网首页
Zookeeper & Dubbo

Zookeeper & Dubbo

作者: 极速魔法 | 来源:发表于2020-10-11 15:53 被阅读0次

    Zookeeper

    概述

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

    工作机制

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

    • 接过观察者注册
    • Zookeeper 通知已注册的观察者做出反应
    • Zookeeper = 文件系统 + 通知机制

    分布式和集群区别

    • 分布式 多台服务器负责的内容不一样,多个人共同完成一件事
    • 集群 多台服务器负责的内容一样

    特点

    • 一个leader 多个 follower(一头雄狮,多头母狮)
    • 集群要只要半数以上的节点存活,Zookeeper 就能正常工作
    • 全局数据一致性,每台服务器保存一份相同的数据副本
    • 数据更新原子性,要么成功,要么失败
    • 实时性,client能读取到最新数据
    • 更新请求顺序执行,按照发送过来的顺序逐一执行。

    数据结构

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

    配置参数

    /zoo.cfg/

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

    内部原理

    选举机制

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

    节点类型

    • 持久型
      • 持久化目录节点
      • 持久化顺序编号目录节点,序号是相当于i++
    • 短暂型
      • 临时目录节点
      • 临时顺序编号目录节点,序号是相当于i++

    监听器原理

    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

    系统架构

    • 单一应用架构,核心是ORM ,减少部署节点和成本,并发 1-10,
    • 垂直应用架构,应用拆分成几个互不相关的应用,采用MVC设计模式,并发10-1000
    • 分布式架构,并发1000-10000
    • 流动计算架构,基于访问压力调度,SOA(面向服务架构,Service-Oriented-Architecture)服务治理。

    简介

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

    RPC

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

    通信原理

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

    节点角色

    • Provider,服务提供方
    • Consumer,消费者
    • Registry,服务注册
    • Monitor,监控服务的统计中心
    • Container ,服务运行容器

    Dubbo整体架构

    配置说明

    • 启动检查,启动时会在注册中心检查依赖的服务是否可用,不可用时会抛出异常,服务提供方设置
    • 超时时间,服务提供方设置
    • 重试次数,服务提供方设置,总共调用次数 = 重试次数 + 1(第一次调用)
      • 消费者单独设置
    <dubbo:reference interface="service.HelloService" id="helloService">
        <dubbo:method name="sayHello" retries="3">
        <dubbo:method name="sayNo" retries="0">
    <dubbo:reference>   
    
    • 本地存根,消费者处理一些业务逻辑,再调用提供者的过程。使用构造方法的方式注入

    服务降级

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

    降级方式

    • 屏蔽,直接返回null值,不发起远程调用
    • 容错,服务方法调用失败,再返回null值

    相关文章

      网友评论

          本文标题:Zookeeper & Dubbo

          本文链接:https://www.haomeiwen.com/subject/kuyepktx.html