Dubbo知识点
Dubbo简介
Apache Dubbo是一款高性能的Java RPC框架。 其前身是阿里巴巴公司开源的、轻量级的开源Java RPC框架,可以和Spring框架无缝集成。
RPC
RPC全称为remote procedure call,即远程过程调用。
Dubbo 架构
Provider: 暴露服务的提供方,可以通过jar或者容器的方式启动服务
Consumer:调用远程服务的服务消费方。
Registry: 服务注册中心和发现中心。
Monitor: 统计服务的调用次数、调用时间
Container:服务运行的容器。
调用关系说明
-
服务容器负责启动,加载,运行服务提供者。
-
服务提供者在启动时,向注册中心注册自己提供的服务。
-
服务消费者在启动时,向注册中心订阅自己所需的服务。
-
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给
消费者。
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失
败,再选另一台调用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中
心。
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:service 或 dubbo:reference 的 registry 属性指定使用的注册中心。)
- dubbo:monitor 监控中心配置(有protocol、address两个属性,当protocol="registry",表示从注册中心发现监控中心地址,当address="10.20.130.230:12080"表示直连监控中心地址)
- dubbo:provider 提供方配置(服务提供者缺省值配置,该标签为 dubbo:service 和 dubbo:protocol 标签的缺省值设置。)
- dubbo:consumer 消费方配置(服务消费者缺省值配置,该标签为 dubbo:reference 标签的缺省值设置。)
- dubbo:method 方法配置(该标签为 dubbo:service 或 dubbo: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 端返回为止;
通常,一个典型的同步调用过程如下:
- Consumer 业务线程调用远程接口,向 Provider 发送请求,同时当前线程处于阻塞状态;
- Provider 接到 Consumer 的请求后,开始处理请求,将结果返回给 Consumer;
- Consumer 收到结果后,当前线程继续往后执行。
Dubbo 异步调用
学习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服务的高可用,防
止出现单点故障。