zoukankan      html  css  js  c++  java
  • Dubbo

    概念

      Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。

    同类型的框架

      Apache:Thrift、Hessian;WebService;java:RMI;淘宝:HSF;京东:JSF

    • Thrift对多语言的支持比较好,但是负载均衡和SOA服务治理比较缺乏;
    • Hessian、WebService都是一个传统的Http调用框架,由于Http调用时都是短连接形式,大部分的资源将会浪费掉服务器的io上面;
    • RMI只支持java语言且性能一般;
    • HSF、JSF并未开源;

    线上版本稳定;社区文档多;成熟的运维

    支持扩展;大量生产应用

    涉及的知识

    远程调用

      RMI;hassion;webservice;thrift

    通信交互

      HTTP;mina;netty

    容器

      jetty;spring

    多线程

      异步;线程池

    负载均衡

      zookeeper

    Dubbo的应用场景

      Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2000+个服务提供3000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点

    Dubbo应用

    • 作为对内提供服务应用的容器
    • 拆分复杂Web应用到服务容器
    • 应用负载均衡协调
    • 应用服务治理

    Dubbo模块

    Dubbo各个角色

    • consumer:服务的消费者,
    • provider:服务的提供者
    • registry:Dubbo服务的注册中心,实际上Dubbo并没有这样一个注册服务中心的应用,只是抽象出了这样一个注册中心的概念。
    • monitor:监控类型的一个角色

      首先provider将服务注册到registry注册中心上,然后consumer获取到这些服务来调用provider,或者当provider提供的服务有变化时,也会相应的通知consumer,provider和consumer在调用时都会发送相应的统计信息给monitor

    Dubbo的RPC过程

      由服务消费端发起,在用户的代码中调用了某个接口的方法,调用方法之后,就会调用到对应的代理层,而代理层根据提供的服务去调用对应的dubbo Invoker或者是Hessian RPC Invoker等等。Invoker再去调用对应的Exporter,在Exporter中就会调用到类的一个代理,服务端抽象出来的AbstractProxyInvoker,再调用到具体的实现类。这样就完成了一个简单的Dubbo RPC调用。

    Dubbo的服务注册

      这张图是Dubbo服务注册的主要过程。首先Dubbo会将xml配置生成对应的ServiceConfig Bean对象,ServiceConfig类拿到对外实际的引用ref,就是bean对象的名字,通过ProxyFactory的getInvoker方法来为这个引用的bean对象生成一个AbstractProxyInvoker的代理对象,这步就将服务的代理对象转化成Invoker的对象,然后相应的配置,将Invoker转化成Dubbo协议的DubboProtocol,根据相应配置来将Invoker Exporter从Exporter发布指令时可以指定Dubbo、Hessian、Rmi、WebService等等协议,当一个服务Exporter之后如果它有注册中心的话,它就会注册到对应的注册中心上。

    Dubbo的服务调用

      相应的消费者的xml配置也会转换成ReferenceConfig Bean对象,然后通过上面的指定转换成Dubb、Hessian等等协议的Invoker,再通过ProxyFactory来生成对应的ref的代理类,再将ref的代理类放到spring容器之中,在spring任意的地方就能使用这个ref来调用对应其接口的bean对象。

    Dubbo模块

    服务接口层(Service)

      该层是与实际业务逻辑相关的,根据服务提供方和服务消费方的业务设计对应的接口和实现。

    Config配置层

      dubbo源码:dubbo-config

      对外配置接口,以ServiceConfig和ReferenceConfig为中心,可以直接new配置类,也可以通过spring解析配置生成配置类。

    作用

    • 负责所有dubbo相关的xml配置和注释配置转换为config对象,我们知道,Spring的xml其实是将很多xml配置的bean转换为真正的bean对象,加载到容器中,而dubbo也是这样,dubbo可以配置例如dubbo:service、dubbo:reference这样的xml配置,最终通过dubbo.xsd将其转换为ServiceConfig和referenceConfig等。
    • Config中拥有ServiceConfig、referenceConfig、ProtocolConfig、RegisterConfig这样的API的配置类,我们也可以使用API的方法来注册一个dubbo服务,常用的我们都是使用xml方式

    核心类

    • ServiceBean、ReferenceBean(对应<dubbo:service /><dubbo:reference />)
    • ProtocolConfig、RegisterConfig(对应<dubbo:protocol /><dubbo:register />)

    Proxy服务代理层

      dubbo源码:dubbo-rpc

      服务接口透明代理,生成服务的客户端Stub和服务器端Skeleton,以ServiceProxy为中心,扩展接口为ProxyFactory。

    作用

    • 负责生成消费者的代理对象,以及服务提供方的Invoker。对于消费者来说,只能拿到一个接口,这个接口并没有真正实现,而我们在调用时,要像普通的调用bean对象一样来处理调用的话,就必须要对这个接口生成对应的代理对象,方便我们在Spring的开发

    核心类

    • ProxyFactory接口的2中实现JDKProxyFactory、JavassistProxyFactory

    Registry服务注册层

      dubbo源码:dubbo-registry

      封装服务地址的注册与发现,以服务URL为中心,扩展接口为RegistryFactory、Registry和RegistryService。可能没有服务注册中心,此时服务提供方直接暴露服务。

    作用

    • 负责服务注册与查询服务,以及注册服务的本地缓存
    • 支持多种协议注册发现服务(常用)。如redis、zookeeper(常用)、multicast

    核心类

    • 接口:RegistryFactory、Registry
    • AbstractRegistry以及ZookeeperRegistry、ZookeeperRegistryFactory

    Cluster集群层/路由层

      dubbo源码:dubbo-cluster

      封装多个提供者的路由及负载均衡,并桥接注册中心,以Invoker为中心,扩展接口为Cluster、Directory、Router和LoadBalance。将多个服务提供方组合为一个服务提供方,实现对服务消费方来透明,只需要与一个服务提供方进行交互。

    作用

    • 负责负载均衡的策略,以及失败策略
    • 缺省设置:RandomLoadBalance,FailoverCluster
    • 支持轮询、随机、一致性哈希等负载均衡策略

    核心类

    • 接口:LoadBalance、Cluster
    • RandomLoadBalance以及RoundRobinLoadBalance

    Monitor监控层

      dubbo源码:dubbo-monitor

    作用

    • RPC调用次数和调用时间监控
    • dubbo-simple下面的dubbo-monitor-simple提供了简单的控制台,我们可以在简单的控制台看到调用次数和调用时间

    核心类

    • DubboMonitor、Statistics

    Protocol远程调用层

      dubbo源码:dubbo-rpc

      封将RPC调用,以Invocation和Result为中心,扩展接口为Protocol、Invoker和Exporter。Protocol是服务域,它是Invoker暴露和引用的主功能入口,它负责Invoker的生命周期管理。Invoker是实体域,它是Dubbo的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起invoke调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。

    作用

    • 封将RPC调用,支持多种RPC协议,不包含IO通信部分
    • 支持多协议调用RMI、Hessian、Http、WebService、thrift等RPC调用方式

    核心类

    • 接口Protocol、Exporter、Invoker
    • DubboProtocol、DubboInvoker、DubboExporter、DubboCodec(编辑dubbo报文相关内容)

    Exchange信息交换层

      dubbo源码:dubbo-remoting

      封装请求响应模式,同步转异步,以Request和Response为中心,扩展接口为Exchanger、ExchangeChannel、ExchangeClient和ExchangeServer。

    作用

    • 封装请求响应模式,同步转异步
    • 处理各种协议的通信请求,支持netty、mina、http等
    • 默认采用Netty进行通信

    核心类

    • 接口:Server(网络模块监听所用,可以监听对应的端口)、Channel、Client
    • NettyClient、NettyServer

    Transport网络传输层

      dubbo源码:dubbo-remoting

      抽象mina和netty为统一接口,以Message为中心,扩展接口为Channel、Transporter、Client、Server和Codec。

    Serialize数据序列化层

      dubbo源码:dubbo-common

      可复用的一些工具,扩展接口为Serialization、 ObjectInput、ObjectOutput和ThreadPool。

    作用

    • 数据序列化层和可复用的一些工具,包括序列化线程池等
    • dubbo协议缺省为hessian2,rmi协议缺省为java,http协议缺省为json

    核心类

    • 接口:ThreadPool、Serialization
    • FixedThreadPool、Hessian2Serialization
  • 相关阅读:
    MVC Areas的使用
    每日踩坑 2019-07-30 H5 使用 iframe 底部有白边
    C# 使用 MsieJavaScriptEngine 引擎运行JavaScript
    Javascript获取value值的三种方法及注意点
    java编程(2)——servlet和Ajax异步请求的接口编程(有调用数据库的数据)
    java编程(1)——servlet和Ajax异步请求的接口编程(没有调用数据库的数据)
    eclipse的常用设置
    Junit4单元测试
    Java异常
    Java的抽象类和接口
  • 原文地址:https://www.cnblogs.com/xiaobaizhiqian/p/8249973.html
Copyright © 2011-2022 走看看