一、Dubbo是什么
-
分布式服务框架
-
高性能和透明化的RPC远程服务调用方案
-
SOA服务治理方案
二、如何使用Dubbo
本地服务
<bean id=“xxxService” class=“com.xxx.XxxServiceImpl” /> <bean id=“xxxAction” class=“com.xxx.XxxAction”> <property name=“xxxService” ref=“xxxService” /> </bean>
远程服务
<!-- 和本地服务一样实现远程服务 --> <bean id=“xxxService” class=“com.xxx.XxxServiceImpl” /> <!-- 增加暴露远程服务配置 --> <dubbo:service interface=“com.xxx.XxxService” ref=“xxxService” />
<!-- 增加引用远程服务配置 --> <dubbo:reference id=“xxxService” interface=“com.xxx.XxxService” /> <!-- 和本地服务一样使用远程服务 --> <bean id=“xxxAction” class=“com.xxx.XxxAction”> <property name=“xxxService” ref=“xxxService” /> </bean>
三、Dubbo能做什么
-
透明化的远程方法调用
-
就像调用本地方法一样调用远程方法
-
只需简单配置,没有任何API侵入
-
-
软负载均衡及容错机制
-
可在内网替代F5等硬件负载均衡器
-
-
服务自动注册与发现
扫描二维码关注公众号,回复: 3889568 查看本文章-
不再需要写死服务提供方地址,注册中心基于接口名查询服务提 供者的IP地址,并且能够平滑添加或删除服务提供者
-
四、Dubbo基本原理
节点角色说明
节点 | 角色说明 |
---|---|
Provider |
暴露服务的服务提供方 |
Consumer |
调用远程服务的服务消费方 |
Registry |
服务注册与发现的注册中心 |
Monitor |
统计服务的调用次数和调用时间的监控中心 |
Container |
服务运行容器 |
调用关系说明
-
服务容器负责启动,加载,运行服务提供者。
-
服务提供者在启动时,向注册中心注册自己提供的服务。
-
服务消费者在启动时,向注册中心订阅自己所需的服务。
-
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
-
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
-
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
特点
-
连通性
-
健壮性
-
伸缩性
-
升级性
五、Dubbo-RPC功能
1、配置
-
方法级优先,接口级次之,全局配置再次之。
-
如果级别一样,则消费方优先,提供方次之。
-
服务提供方配置,通过 URL 经由注册中心传递给消费方。
2、服务匹配
-
服务分组、多版本
当一个接口有多种实现时,可以用group区分。
//服务提供者 <dubbo:service group="feedback" interface="com.xxx.IndexService" /> <dubbo:service group="member" interface="com.xxx.IndexService" /> //服务消费者 <dubbo:reference id=“fservice" group="feedback" interface="com.xxx.IndexService" /> <dubbo:reference id=“mservice" group="member" interface="com.xxx.IndexService" />
当一个接口实现,出现不兼容升级时,可以用版本号过渡, 版本号不同的服务相互间不引用。
//服务提供者 <dubbo:service interface="com.foo.BarService" version="1.0.0" /> <dubbo:service interface="com.foo.BarService" version="2.0.0" /> //服务消费者 <dubbo:reference id="barService" interface="com.foo.BarService" version="1.0.0" /> <dubbo:reference id="barService" interface="com.foo.BarService" version="2.0.0" />
-
只订阅
共用注册中心, 开发人员机器上的服务提供者被误 调, 影响其他开发人员(开发、 测试环境)
<dubbo:registry register="false" />
-
只注册
如果有两个注册中心A,B,a服务只在其中A注册中心有部署,B注册中心没有a服务,其它应用都需要依赖a服务。此时,可以让服务提供者方只注册服务到A注册中心。
<dubbo:registry id="aRegistry" address="10.20.153.10:9090" /> <dubbo:registry id="bRegistry" address="10.20.141.150:9090" subscribe="false" />
3、集群容错
-
集群原理
在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。
各节点关系:
-
这里的
Invoker
是Provider
的一个可调用Service
的抽象,Invoker
封装了Provider
地址及Service
接口信息 -
Directory
代表多个Invoker
,可以把它看成List<Invoker>
,但与List
不同的是,它的值可能是动态变化的,比如注册中心推送变更 -
Cluster
将Directory
中的多个Invoker
伪装成一个Invoker
,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个 -
Router
负责从多个Invoker
中按路由规则选出子集,比如读写分离,应用隔离等 -
LoadBalance
负责从多个Invoker
中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选
模式 | 说明 |
---|---|
Failfast Cluster | 快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。 |
Failsafe Cluster | 失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。 |
Failback Cluster | 失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。 |
Forking Cluster | 并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。 |
Broadcast Cluster | 广播调用所有提供者,逐个调用,任意一台报错则报错 [2]。通常用于通知所有提供者更新缓存或日志等本地资源信息。 |
4、协议
dubbo://
Dubbo 缺省协议,采用单一长连接和 NIO 异步通讯
适用场景
-
适合:常规远程服务方法调用,小数据量(< 100K)大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况
-
不适合:传送大数据量的服务,比如传文件,传视频等,除非请求量很低。
特性
-
单连接 、长连接 、TCP协议
-
NIO异步传输 、 Hessian二进制序列化
rmi://
RMI 协议,采用 JDK 标准的 java.rmi.* 实现,采用阻塞式短连接和 JDK 标准序列化方式
适用场景
-
常规远程服务方法调用,与原生RMI服务互操作
-
传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件
特性
-
多连接 、 短连接 、TCP协议
-
同步传输 、 Java标准二进制序列化
hessian://
Hessian协议,用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。
适用场景
-
传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件
-
页面传输,文件传输,或与原生hessian服务互操作
特性
-
多连接 、 短连接 、 HTTP协议
-
同步传输 、 Hessian二进制序列化
http://
基于 HTTP 表单的远程调用协议,采用 Spring 的 HttpInvoker 实现
适用场景
-
传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件
-
需同时给应用程序和浏览器 JS 使用的服务
特性
-
多连接 、 短连接 、HTTP协议
-
同步传输 、 表单序列化
webservice://
基于 WebService 的远程调用协议,基于 Apache CXF 的 frontend-simple 和 transports-http 实现
适用场景
-
系统集成,跨语言调用
特性
-
多连接 、 短连接 、 HTTP协议
-
同步传输 、 SOAP文本序列化
thrift://
当前 dubbo 支持的thrift 协议是对 thrift 原生协议的扩展,在原生协议的基础上添加了一些额外的头信息
memcached://
基于 memcached 实现的 RPC 协议
redis://
基于 Redis [1] 实现的 RPC 协议
rest://
基于标准的Java REST API——JAX-RS 2.0 实现的REST调用支持
Dubbo默认通信协议是dubbo,是单一长连接NIO异步传输的,解决了大并发小数据量的常规服务调用,防止C10K问题。
如果需要传文件,可以用Hessian;需要页面也调用的,用http;需要跨语言调用的,用webservice;这几个都是多连接短连接形式的。
5、多协议
-
不同服务不同协议
不同服务在性能上适用不同协议进行传输,比如大数据用短连接协议,小数据大并发用长连接协议。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> <dubbo:application name="world" /> <dubbo:registry id="registry" address="10.20.141.150:9090" username="admin" password="hello1234" /> <!-- 多协议配置 --> <dubbo:protocol name="dubbo" port="20880" /> <dubbo:protocol name="rmi" port="1099" /> <!-- 使用dubbo协议暴露服务 --> <dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" protocol="dubbo" /> <!-- 使用rmi协议暴露服务 --> <dubbo:service interface="com.alibaba.hello.api.DemoService" version="1.0.0" ref="demoService" protocol="rmi" /> </beans>
-
同一服务多协议暴露
比如:需要与http客户端互操作
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> <dubbo:application name="world" /> <dubbo:registry id="registry" address="10.20.141.150:9090" username="admin" password="hello1234" /> <!-- 多协议配置 --> <dubbo:protocol name="dubbo" port="20880" /> <dubbo:protocol name="hessian" port="8080" /> <!-- 使用多个协议暴露服务 --> <dubbo:service id="helloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" protocol="dubbo,hessian" /> </beans>
六、 注册中心
zookeeper注册中心
Zookeeper 是 Apacahe Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境。
流程说明:
-
服务提供者启动时: 向
/dubbo/com.foo.BarService/providers
目录下写入自己的 URL 地址 -
服务消费者启动时: 订阅
/dubbo/com.foo.BarService/providers
目录下的提供者 URL 地址。并向/dubbo/com.foo.BarService/consumers
目录下写入自己的 URL 地址 -
监控中心启动时: 订阅
/dubbo/com.foo.BarService
目录下的所有提供者和消费者 URL 地址。
支持以下功能:
-
当提供者出现断电等异常停机时,注册中心能自动删除提供者信息
-
当注册中心重启时,能自动恢复注册数据,以及订阅请求
-
当会话过期时,能自动恢复注册数据,以及订阅请求
-
当设置
<dubbo:registry check="false" />
时,记录失败注册和订阅请求,后台定时重试 -
可通过
<dubbo:registry username="admin" password="1234" />
设置 zookeeper 登录信息 -
可通过
<dubbo:registry group="dubbo" />
设置 zookeeper 的根节点,不设置将使用无根树 -
支持
*
号通配符<dubbo:reference group="*" version="*" />
,可订阅服务的所有分组和所有版本的提供者
其他注册中心 | 说明 |
---|---|
Multicast 注册中心 | Multicast 注册中心不需要启动任何中心节点,只要广播地址一样,就可以互相发现。 <dubbo:registry address="multicast://224.5.6.7:1234" /> |
Redis 注册中心 | 使用 Redis 的 Key/Map 结构存储数据结构, Publish/Subscribe 事件通知数据变更。 <dubbo:registry address="redis://10.20.153.10:6379" /> |
Simple 注册中心 | Simple 注册中心本身就是一个普通的 Dubbo 服务,可以减少第三方依赖,使整体通讯方式一致。简单实现,不支持集群。 |