Dubbo

106 阅读6分钟

Dubbo知识点

Dubbo简介

Apache Dubbo是一款高性能的Java RPC框架。 其前身是阿里巴巴公司开源的、轻量级的开源Java RPC框架,可以和Spring框架无缝集成。

RPC

RPC全称为remote procedure call,即远程过程调用。

Dubbo 架构

image.png

Provider: 暴露服务的提供方,可以通过jar或者容器的方式启动服务
Consumer:调用远程服务的服务消费方。
Registry: 服务注册中心和发现中心。
Monitor: 统计服务的调用次数、调用时间
Container:服务运行的容器。

调用关系说明

  1. 服务容器负责启动,加载,运行服务提供者。

  2. 服务提供者在启动时,向注册中心注册自己提供的服务。

  3. 服务消费者在启动时,向注册中心订阅自己所需的服务。

  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给

消费者。

  1. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失

败,再选另一台调用。

  1. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中

心。

Dubbo提供的序列化方式

  • dubbo:Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况
  • rmi:RMI协议采用JDK标准的java.rmi.*实现,采用阻塞式短连接和JDK标准序列化方式
  • Hessian:Hessian协议用于集成Hessian的服务,Hessian底层采用Http通讯,采用Servlet暴露服务,Dubbo缺省内嵌Jetty作为服务器实现
  • http:采用Spring的HttpInvoker实现
  • Webservice:基于CXF的frontend-simple和transports-http实现

Dubbo的注册中心

默认是zk,其他还有Redis、Multicast、Simple 注册中心,但不推荐。

Dubbo的配置方式

Spring 配置方式(XML文件)
Java API 配置方式(注解方式)

Dubbo的核心配置

  • dubbo:service       服务配置(作为服务的提供者,暴露服务的配置)
  • dubbo:reference     引用配置(需要调用外部服务)
  • dubbo:protocol      协议配置(服务支持的协议配置,若需要支持多个协议,可以声明多个dubbo:protocol标签)
  • dubbo:application   应用配置(应用信息配置,包括当前应用名、应用负责人、应用版本、应用环境等)
  • dubbo:module        模块配置(模块信息配置,包括当前模块名、模块负责人、模块版本等)
  • dubbo:registry      注册中心配置(同时如果有多个不同的注册中心,可以声明多个 dubbo:registry 标签,并在 dubbo:servicedubbo:reference 的 registry 属性指定使用的注册中心。)
  • dubbo:monitor       监控中心配置(有protocol、address两个属性,当protocol="registry",表示从注册中心发现监控中心地址,当address="10.20.130.230:12080"表示直连监控中心地址)
  • dubbo:provider      提供方配置(服务提供者缺省值配置,该标签为 dubbo:servicedubbo:protocol 标签的缺省值设置。)
  • dubbo:consumer      消费方配置(服务消费者缺省值配置,该标签为 dubbo:reference 标签的缺省值设置。)
  • dubbo:method        方法配置(该标签为 dubbo:servicedubbo:reference 的子标签,用于控制到方法级。)
  • dubbo:argument      参数配置(该标签为 dubbo:method 的子标签,用于方法参数的特征描述)

Dubbo支持的序列化框架

推荐使用Hessian序列化,还有Duddo、FastJson、Java自带序列化。

Dubbo使用的通信框架

Dubbo 默认使用 Netty 框架,也是推荐的选择,另外内容还集成有Mina、Grizzly

Dubbo的集群容错方案

  • Failover Cluster    失败自动切换,自动重试其它服务器(默认) 
  • Failfast Cluster    快速失败,立即报错,只发起一次调用 
  • Failsafe Cluster    失败安全,出现异常时,直接忽略 
  • Failback Cluster    失败自动恢复,记录失败请求,定时重发 
  • Forking Cluster     并行调用多个服务器,只要一个成功即返回 
  • Broadcast Cluster   广播逐个调用所有提供者,任意一个报错则报错

Dubbo的负载均衡策略

  • Random LoadBalance          随机,按权重设置随机概率(默认) 
  • RoundRobin LoadBalance      轮询,按公约后的权重设置轮询比率
  • LeastActive LoadBalance     最少活跃调用数,相同活跃数的随机 
  • ConsistentHash LoadBalance  一致性 Hash,相同参数的请求总是发到同一提供者

Dubbo 同步调用

同步调用是一种阻塞式的调用方式,即 Consumer 端代码一直阻塞等待,直到 Provider 端返回为止;
通常,一个典型的同步调用过程如下:

  1. Consumer 业务线程调用远程接口,向 Provider 发送请求,同时当前线程处于阻塞状态;
  2. Provider 接到 Consumer 的请求后,开始处理请求,将结果返回给 Consumer;
  3. Consumer 收到结果后,当前线程继续往后执行。

Dubbo 异步调用

image.png

学习Dubbo可能遇到的问题

思考一:上面的Dubbo入门案例中我们是将HelloService接口从服务提供者工程

(dubbodemo_provider)复制到服务消费者工程(dubbodemo_consumer)中,这种做法是否合适?还有

没有更好的方式?

答:这种做法显然是不好的,同一个接口被复制了两份,不利于后期维护。更好的方式是单独创建一个

maven工程,将此接口创建在这个maven工程中。需要依赖此接口的工程只需要在自己工程的

pom.xml文件中引入maven坐标即可。

思考二:在服务消费者工程(dubbodemo_consumer)中只是引用了HelloService接口,并没有提供实现

类,Dubbo是如何做到远程调用的?

答:Dubbo底层是基于代理技术为HelloService接口创建代理对象,远程调用是通过此代理对象完成

的。可以通过开发工具的debug功能查看此代理对象的内部结构。另外,Dubbo实现网络传输底层是基

于Netty框架完成的。

思考三:上面的Dubbo入门案例中我们使用Zookeeper作为服务注册中心,服务提供者需要将自己的服

务信息注册到Zookeeper,服务消费者需要从Zookeeper订阅自己所需要的服务,此时Zookeeper服务

就变得非常重要了,那如何防止Zookeeper单点故障呢?

答:Zookeeper其实是支持集群模式的,可以配置Zookeeper集群来达到Zookeeper服务的高可用,防

止出现单点故障。