【Dubbo】Dubbo入门

版权声明:版权所有,转载请标明链接。 https://blog.csdn.net/happyniceyq/article/details/83151564

一、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能做什么

  1. 透明化的远程方法调用

    • 就像调用本地方法一样调用远程方法

    • 只需简单配置,没有任何API侵入

  2. 软负载均衡及容错机制

    • 可在内网替代F5等硬件负载均衡器

  3. 服务自动注册与发现

    • 不再需要写死服务提供方地址,注册中心基于接口名查询服务提 供者的IP地址,并且能够平滑添加或删除服务提供者

四、Dubbo基本原理

节点角色说明

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

调用关系说明

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

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

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

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

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

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

特点

  • 连通性

  • 健壮性

  • 伸缩性

  • 升级性

五、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 重试。

各节点关系:

  • 这里的 InvokerProvider 的一个可调用 Service 的抽象,Invoker 封装了 Provider 地址及 Service 接口信息

  • Directory 代表多个 Invoker,可以把它看成 List<Invoker> ,但与 List 不同的是,它的值可能是动态变化的,比如注册中心推送变更

  • ClusterDirectory 中的多个 Invoker 伪装成一个 Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个

  • Router 负责从多个 Invoker 中按路由规则选出子集,比如读写分离,应用隔离等

  • LoadBalance 负责从多个 Invoker 中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选

模式 说明
Failfast Cluster 快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。
Failsafe Cluster 失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。
Failback Cluster 失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
Forking Cluster 并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。
Broadcast Cluster 广播调用所有提供者,逐个调用,任意一台报错则报错 [2]。通常用于通知所有提供者更新缓存或日志等本地资源信息。

4、协议

dubbo://

Dubbo 缺省协议,采用单一长连接和 NIO 异步通讯

适用场景

  • 适合:常规远程服务方法调用,小数据量(< 100K)大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况

  • 不适合:传送大数据量的服务,比如传文件,传视频等,除非请求量很低。

特性

  1. 单连接 、长连接 、TCP协议

  2. NIO异步传输 、 Hessian二进制序列化

rmi://

RMI 协议,采用 JDK 标准的 java.rmi.* 实现,采用阻塞式短连接和 JDK 标准序列化方式

适用场景

  • 常规远程服务方法调用,与原生RMI服务互操作

  • 传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件

特性

  1. 多连接 、 短连接 、TCP协议

  2. 同步传输 、 Java标准二进制序列化

hessian://

Hessian协议,用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。

适用场景

  • 传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件

  • 页面传输,文件传输,或与原生hessian服务互操作

特性

  1. 多连接 、 短连接 、 HTTP协议

  2. 同步传输 、 Hessian二进制序列化

http://

基于 HTTP 表单的远程调用协议,采用 Spring 的 HttpInvoker 实现

适用场景

  • 传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件

  • 需同时给应用程序和浏览器 JS 使用的服务

特性

  1. 多连接 、 短连接 、HTTP协议

  2. 同步传输 、 表单序列化

webservice://

基于 WebService 的远程调用协议,基于 Apache CXF 的 frontend-simple 和 transports-http 实现

适用场景

  • 系统集成,跨语言调用

特性

  1. 多连接 、 短连接 、 HTTP协议

  2. 同步传输 、 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 服务,可以减少第三方依赖,使整体通讯方式一致。简单实现,不支持集群。

猜你喜欢

转载自blog.csdn.net/happyniceyq/article/details/83151564