Dubbo+Zookeeper框架总结

作者: 千淘萬漉 | 来源:发表于2018-03-13 22:02 被阅读306次

    一、背景介绍

    随着互联网的发展,网站应用或者企业应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。

    • 单一应用架构
      当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。

    • 垂直应用架构
      当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。

    • 分布式服务架构
      当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。

    • 流动计算架构
      当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。

    本人所参与的项目也是类似于此(【SSM集成Dubbo+Zookeeper实现服务化),由dubbo-service提供服务,提供数据增删改查服务,无页面及Controller。dubbo_client提供页面访问,具体的增删改查条用dubbo-service远程服务。

    【Dubbo介绍】

    服务架构的演进

    二、Dubbo的设计角色与架构

    角色与关系

    1.系统角色

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

    2.调用关系

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

    Dubbo架构与底层实现

    3.Dubbo的10层架构

    总体架构图
    服务接口层(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。

    三、Dubbo的底层实现

    1.协议支持

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

    2.默认使用Dubbo协议

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

    扩展出来的一些问题,了解即可:
    1. dubbo通信协议dubbo协议为什么要消费者比提供者个数多:
    因dubbo协议采用单一长连接,假设网络为千兆网卡(1024Mbit=128MByte),根据测试经验数据每条连接最多只能压满7MByte(不同的环境可能不一样,供参考),理论上1个服务提供者需要20个服务消费者才能压满网卡。

    2. dubbo通信协议dubbo协议为什么不能传大包:
    因dubbo协议采用单一长连接,如果每次请求的数据包大小为500KByte,假设网络为千兆网卡(1024Mbit=128MByte),每条连接最大7MByte(不同的环境可能不一样,供参考),单个服务提供者的TPS(每秒处理事务数)最大为:128MByte / 500KByte = 262。单个消费者调用单个服务提供者的TPS(每秒处理事务数)最大为:7MByte / 500KByte = 14。如果能接受,可以考虑使用,否则网络将成为瓶颈。

    3. dubbo通信协议dubbo协议为什么采用异步单一长连接:
    因为服务的现状大都是服务提供者少,通常只有几台机器,而服务的消费者多,可能整个网站都在访问该服务,比如Morgan的提供者只有6台提供者,却有上百台消费者,每天有1.5亿次调用,如果采用常规的hessian服务,服务提供者很容易就被压跨,通过单一连接,保证单一消费者不会压死提供者,长连接,减少连接握手验证等,并使用异步IO,复用线程池,防止C10K问题。

    【上海校区】整理的Dubbo面试题

    四、dubbo的核心问题

    1.服务定义

    服务是围绕服务提供方和服务消费方的,服务提供方实现服务,而服务消费方调用服务。

    2.服务注册

    对于服务提供方,它需要发布服务,而且由于应用系统的复杂性,服务的数量、类型也不断膨胀;对于服务消费方,它最关心如何获取到它所需要的服务,而面对复杂的应用系统,需要管理大量的服务调用。而且,对于服务提供方和服务消费方来说,他们还有可能兼具这两种角色,即既需要提供服务,有需要消费服务。
    通过将服务统一管理起来,可以有效地优化内部应用对服务发布/使用的流程和管理。服务注册中心可以通过特定协议来完成服务对外的统一。Dubbo提供的注册中心有如下几种类型可供选择:

    • Multicast注册中心
    • Zookeeper注册中心(默认推荐)
    • Redis注册中心
    • Simple注册中心

    3.服务监控

    无论是服务提供方,还是服务消费方,他们都需要对服务调用的实际状态进行有效的监控,从而改进服务质量。

    4.远程通信与信息交换

    远程通信需要指定通信双方所约定的协议,在保证通信双方理解协议语义的基础上,还要保证高效、稳定的消息传输。Dubbo继承了当前主流的网络通信框架,主要包括如下几个:

    • Mina
    • Netty(推荐默认)
    • Grizzly

    5.服务调用

    下面从Dubbo官网直接拿来,看一下基于RPC层,服务提供方和服务消费方之间的调用关系,如图所示:


    服务调用图

    上图中,蓝色的表示与业务有交互,绿色的表示只对Dubbo内部交互。上述图所描述的调用流程如下:

    1. 服务提供方发布服务到服务注册中心;
    2. 服务消费方从服务注册中心订阅服务;
    3. 服务消费方调用已经注册的可用服务

    Dubbo架构设计详解

    问:服务调用是阻塞的吗?
    默认是阻塞的,可以异步调用,没有返回值的可以这么做。

    问:服务提供者能实现失效踢出是什么原理?
    服务失效踢出基于zookeeper的临时节点原理。

    问:服务上线怎么不影响旧版本?
    采用多版本开发,不影响旧版本。

    问:如何解决服务调用链过长的问题?
    可以结合zipkin实现分布式服务追踪。

    问:说说核心的配置有哪些?
    核心配置有 dubbo:service/ dubbo:reference/ dubbo:protocol/ dubbo:registry/ dubbo:application/ dubbo:provider/ dubbo:consumer/ dubbo:method/

    问:同一个服务多个注册的情况下可以直连某一个服务吗?
    可以直连,修改配置即可,也可以通过telnet直接某个服务。

    问:别的分布式框架
    别的还有spring的spring cloud,facebook的thrift,twitter的finagle等。

    探索Dubbo面试题

    如果结合使用来学习可以参考

    dubbo学习过程、使用经验分享及实现原理简单介绍
    dubbo 注册中心 及负载均衡
    dubbo负载均衡策略(负载均衡是怎么配置的

    相关文章

      网友评论

      本文标题:Dubbo+Zookeeper框架总结

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