Dubbo

392

什么是Dubbo

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册) 其核心部分包含:

  1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
  2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
  3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

Dubbo下载及安装

在安装Dubbo之前,需要先安装zookeeper服务及maven服务

  1. 在Github上下载dubbo-admin项目,下载地址为github.com/apache/dubb…
  2. 将项目下载下来以后修改/dubbo-admin-develop/dubbo-admin-server/src/main/resources/application.properties中zookeeper的地址
  3. 在/dubbo-admin-develop目录下执行命令mvn -clean package,将项目打包成一个jar文件,该文件在/dubbo-admin-develop/dubbo-admin-distribution/target下
  4. 将dubbo-admin-0.1.jar包上传到linux目录,然后执行jar -jar dubbo-admin-0.1.jar即可
  5. 启动完成,通过http://localhost:8080访问

dubbo机制

  • Provider: 暴露服务的服务提供方。
  • Consumer: 调用远程服务的服务消费方。
  • Registry: 服务注册与发现的注册中心。
  • Monitor: 统计服务的调用次调和调用时间的监控中心。
  • Container: 服务运行容器。

dubbo底层

容错策略

  • Failover Cluster[failover]:失败重试(默认)
    当服务消费方调用服务提供者失败后自动切换到其他服务提供者服务器进行重试。这通常用于读操作或者具有幂等的写操作,需要注意的是重试会带来更长延迟。可通过 retries="2" 来设置重试次数(不含第一次)。
  • Failfast Cluster[failfast]:快速失败
    当服务消费方调用服务提供者失败后,立即报错,也就是只调用一次。通常这种模式用于非幂等性的写操作。
  • Failsafe Cluster[failsafe]:失败安全
    当服务消费者调用服务出现异常时,直接忽略异常。这种模式通常用于写入审计日志等操作。
  • Failback Cluster[failback]:失败自动恢复
    当服务消费端用服务出现异常后,在后台记录失败的请求,并按照一定的策略后期再进行重试。这种模式通常用于消息通知操作。
  • Forking Cluster[forking]:并行调用
    当消费方调用一个接口方法后,Dubbo Client会并行调用多个服务提供者的服务,只要一个成功即返回。这种模式通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。
  • Broadcast Cluster[broadcast]:广播调用
    当消费者调用一个接口方法后,Dubbo Client会逐个调用所有服务提供者,任意一台调用异常则这次调用就标志失败。这种模式通常用于通知所有提供者更新缓存或日志等本地资源信息。

我们可以通过<dubbo:service cluster="failfast" />或<dubbo:reference cluster="failfast" />来设置容错策略

负载均衡

当服务提供方是集群的时候,为了避免大量请求一直落到一个或几个服务提供方机器上,从而使这些机器负载很高,甚至打死,需要做一定的负载均衡策略。Dubbo提供了多种均衡策略,缺省为random,也就是每次随机调用一台服务提供者的机器。下面介绍下dubbo提供的负载均衡策略

  • Random LoadBalance:(默认)随机策略。按照概率设置权重,比较均匀,并且可以动态调节提供者的权重。
  • RoundRobin LoadBalance:轮询策略。轮询,按公约后的权重设置轮询比率。会存在执行比较慢的服务提供者堆积请求的情况,比如一个机器执行的非常慢,但是机器没有挂调用(如果挂了,那么当前机器会从Zookeeper的服务列表删除),当很多新的请求到达该机器后,由于之前的请求还没有处理完毕,会导致新的请求被堆积,久而久之,所有消费者调用这台机器上的请求都被阻塞。
  • LeastActive LoadBalance:最少活跃调用数。如果每个提供者的活跃数相同,则随机选择一个。在每个服务提供者里面维护者一个活跃数计数器,用来记录当前同时处理请求的个数,也就是并发处理任务的个数。所以如果这个值越小说明当前服务提供者处理的速度很快或者当前机器的负载比较低,所以路由选择时候就选择该活跃度最小的机器。如果一个服务提供者处理速度很慢,由于堆积,那么同时处理的请求就比较多,也就是活跃调用数目越大,这也使得慢的提供者收到更少请求,因为越慢的提供者的活跃度越来越大。
  • ConsistentHash LoadBalance:一致性Hash策略。一致性Hash,可以保证相同参数的请求总是发到同一提供者,当某一台提供者挂了时,原本发往该提供者的请求,基于虚拟节点,平摊到其他提供者,不会引起剧烈变动。

我们可以通过<dubbo:service loadbalance="random" />或<dubbo:reference loadbalance="random" />来设置容错策略

注册中心

Dubbo支持多种注册中心

  • zookeeper(官方建议)
  • redis
  • multicast
  • simple

协议支持

  • dubbo: 单一长连接和NIO异步通讯,适合大并发小数据量的服务调用,以及消费者远大于提供者。传输协议TCP,异步,Hessian序列化;
  • rmi: 采用JDK标准的rmi协议实现,传输参数和返回参数对象需要实现Serializable接口,使用java标准序列化机制,使用阻塞式短连接,传输数据包大小混合,消费者和提供者个数差不多,可传文件,传输协议TCP。 多个短连接,TCP协议传输,同步传输,适用常规的远程服务调用和rmi互操作。在依赖低版本的Common-Collections包,java序列化存在安全漏洞;
  • webservice: 基于WebService的远程调用协议,集成CXF实现,提供和原生WebService的互操作。多个短连接,基于HTTP传输,同步传输,适用系统集成和跨语言调用;
  • http: 基于Http表单提交的远程调用协议,使用Spring的HttpInvoke实现。多个短连接,传输协议HTTP,传入参数大小混合,提供者个数多于消费者,需要给应用程序和浏览器JS调用;
  • hessian: 集成Hessian服务,基于HTTP通讯,采用Servlet暴露服务,Dubbo内嵌Jetty作为服务器时默认实现,提供与Hession服务互操作。多个短连接,同步HTTP传输,Hessian序列化,传入参数较大,提供者大于消费者,提供者压力较大,可传文件;
  • memcache: 基于memcached实现的RPC协议
  • redis: 基于redis实现的RPC协议

springboot集成dubbo

采用的springboot为2.x版本

  1. 引入jar包
<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>0.2.0</version>
</dependency>
  1. 服务端配置
# dubbo服务名称
dubbo.application.name=springboot-service-impl
# dubbo采用的注册中心
dubbo.registry.protocol=zookeeper
# 注册中心地址
dubbo.registry.address=192.168.1.102:2181
# 分组
dubbo.registry.group=dubbo
# 采用的协议
dubbo.protocol.name=dubbo
# 端口
dubbo.protocol.port=20880
# 监控中心
#dubbo.monitor.protocol=registry
# 扫描路径
dubbo.scan.base-packages=com.demo.impl.user
  1. 客户端配置
# dubbo服务名称
dubbo.application.name=springboot-service-impl
# 注册中心地址
dubbo.registry.address=zookeeper://192.168.1.102:2181
# 扫描路径
dubbo.scan.base-packages=com.demo.impl.user
# 配置dubbo缓存地址,该文件会缓存注册中心及服务提供者列表,这样即使Dubbo不可用,客户端依然可以读取服务
dubbo.registry.file=E://dubbo.cache
  1. 在启动类上添加@EnableDubbo注解