Dubbo

目录

一、什么是Apache  Dubbo 

二、Spring Boot 集成 Apache Dubbo

服务提供者的开发流程:

服务调用者的开发流程:

三、ZooKeeper

1.定义

2.ZooKeeper的数据结构

 3.ZooKeeper的特性

4.Watcher机制

5.ZooKeeper常见应用场景

分布式锁:

Master选举:

四、Apache Dubbo 集成 ZooKeeper 实现服务注册

1.优势

2.Apache Dubbo 集成 ZooKeeper 实现服务注册的步骤

3.ZooKeeper注册中心的实现原理

五、Dubbo Spring Cloud

定义

实现Dubbo服务提供方

实现Dubbo服务调用方

六、Apache Dubbo 的高级应用

1.集群容错

2.负载均衡

3.服务降级


一、什么是Apache  Dubbo 

Apache Dubbo 是一个分布式服务框架,简单来说就是一个RPC框架,和普通RPC框架不同的是,它提供了服务治理功能,比如服务注册、监控、路由、容错等。

二、Spring Boot 集成 Apache Dubbo

服务提供者的开发流程:

  • 创建一个普通的 Maven 工程 springboot-provider,并创建两个模块:sample-api 和 sample-provider,其中sample-provider模块是一个spring boot工程。
  • 在sample-api模块中定义一个接口,并且通过mvn install 安装到本地私服。
  • 在sample-provider中引入以下依赖(spring-boot-starter、dubbo-spring-boot-starter(是Apache Dubbo官方提供的开箱即用的组件)、sample-api)
  • 在sample-provider中实现api模块接口中定义的方法,并且使用Dubbo中提供的@Service注解发布服务
  • 在application.properties文件中添加Dubbo服务的配置信息

spring.application.name=springboot-dubbo-demo

dubbo.application.name=springboot-provider        提供方应用信息,用于计算依赖关系

dubbo.protocol.name=dubbo                                  协议

dubbo.protocol.port=20880                                     端口

dubbo.registry.address=N/A                                    服务注册中心的地址,N/A表示不注册

  • 启动Spring Boot,需要注意的是,需要在启动方法上添加@DubboComponentScan注解,它的作用和Spring Framework提供的@ComponentScan一样,只不过这里扫描的是Dubbo中提供的@Service注解。

服务调用者的开发流程:

  • 创建一个Spring Boot项目springboot-consumer,添加Jar包依赖:dubbo-spring-boot-starter、sample-api
  • 在application.properties中配置项目名称

dubbo.application.name=springboot-consumer

  • 在Spring Boot启动类中,使用Dubbo 提供的 @Reference注解来获得一个远程代理对象。

例:注解内参数(url="dubbo协议://IP:端口号/类的全路径")

@Reference (url="dubbo://192.168.13.1:20880/com.gupaoedu.book.dubbo.IHelloService")

private IHelloService  iHelloService;

总结:基于Dubbo-Spring-Boot-Starter组件来使用Dubbo完成服务发布和服务消费会使得开发更简单。另外,官方还提供了Dubbo-Spring-Boot-Actuator模块,可以实现针对Dubbo服务的监控检查。以上案例主要是使用Dubbo以点对点的形式来实现服务之间的通信,而且Dubbo还可以很好的集成注册中心来实现服务地址的统一管理,例如ZooKeeper

三、ZooKeeper

1.定义

ZooKeeper是一个高性能的分布式协调中间件,需要强调的是,ZooKeeper并不是注册中心,只是基于ZooKeeper本身的特性可以实现注册中心这个场景而已

2.ZooKeeper的数据结构

ZooKeeper的数据模型和分布式文件系统类似,是一种层次化的属性结构,和文件系统不同的是,ZooKeeper的数据结构是结构化存储的,并没有在物理上体现出文件和目录。 

ZooKeeper树中的每个节点被称为Znode,Znode维护了一个start状态信息,其中包含数据变化和版本等。ZooKeeper上的每个节点的数据都是允许读和写的。另外,节点的创建规则和文件系统类似,必须要按照层级创建。举个简单的例子,如果需要创建/node/node1/node1-1,那么必须先创建/node/node1这两个层级节点。

 3.ZooKeeper的特性

ZooKeeper中的Znode在被创建时,需要指定节点的类型,节点类型分为:

  • 持久化节点,节点的数据会持久化到磁盘
  • 临时节点,节点的生命周期和创建该节点的客户端生命周期一致,一旦该客户端回话结束,则该客户端所创建的临时节点会被自动删除
  • 有序节点,在创建的节点后面会增加一个递增的序列,该序列在同一级父节点之下是唯一的。需要注意的是,持久化节点和临时节点也是可以设置为有序节点的
  • 容器节点,当容器节点下的最后一个子节点被删除时,容器节点就会被自动删除
  • TTL节点,针对持久化节点或者持久化有序节点,我们可以设置一个存活时间,如果在存活时间之内该节点没有任何修改并且没有任何子节点,它就会被自动删除

注意:在同一级目录下,节点的名称必须是唯一的,就像我们在同一个目录下不能创建两个有相同名字的文件夹一样

4.Watcher机制

Watcher机制是ZooKeeper可以当注册中心的根本原因

ZooKeeper提供了一种针对Znode的订阅/通知机制,也就是当Znode节点状态发生变化时或者ZooKeeper客户端连接状态发生变化时,会触发事件通知。这个机制在服务注册与发现中,针对服务调用者及时感知到服务提供者的变化提供了非常好的解决方案。

在ZooKeeper提供的java API中,提供了三种机制来针对Znode进行注册监听,分别是:

  • getData(),用于获取指定节点的value信息,并且可以注册监听,当监听的节点进行创建、修改、删除操作时,会触发相应的事件通知。
  • getChildren(),用于获取指定节点的所有子节点,并且允许注册监听,当监听节点的子节点进行创建、修改、删除操作时,触发相应的事件通知。
  • exists(),用于判断指定节点是否存在,同样可以注册针对指定节点的监听,监听的事件类型和getData()相同。

注意:Watcher事件的触发都是一次性的,比如客户端通过getData('/node',true)注册监听,如果/node节点发生数据修改,那么该客户端会收到一个修改事件通知,但是/node再次发生变化时,客户端无法收到Watcher事件,为了解决这个问题,客户端必须在收到的事件回调中再次注册事件

5.ZooKeeper常见应用场景

基于ZooKeeper中节点特性,可以为多种应用场景提供解决方案。

分布式锁:

临时节点+同父节点的子节点唯一性

  • 获得锁的过程:在获得排他锁时,所有客户端都去ZooKeeper服务器上/Exclusive_Locks节点下创建一个临时节点/lock。ZooKeeper基于同级节点的唯一性,会保证所有客户端中只有一个客户端能创建成功,创建成功的客户端获得排他锁,没有获得锁的客户端就通过Watcher机制监听/Exclusive_Locks节点下子节点的变更事件,用于实时监听/lock节点的变化情况以做出反应。
  • 释放锁的过程:获得锁的客户端因为异常断开了和服务器的连接,基于临时锁的特性,/lock节点会被自动删除;获得锁的客户端执行完成逻辑后,主动删除了创建的/lock节点。当/lock节点被删除后,ZooKeeper服务器会通知所有监听了/Exclusive_Locks子节点变化的客户端。这些客户端收到通知后,再次发起创建/lock节点的操作来获得排他锁

Master选举:

集群模式中,需要选取一个节点作为Master节点,如果Master节点故障之后,还需要从其他子节点中选举一个节点作为Master节点。ZooKeeper有两种方式可以帮助集群中的节点完成Master选举

  1. 同一级节点不能重复创建一个已经存在的节点,比如集群有3个客户端,同时去ZooKeeper服务器上创建一个临时节点/master-election,由于节点的特性只有一个能成功,这个客户端就是master节点。其他客户端针对该节点注册Watcher事件,用于监控当前Master节点是否存活,一旦发现Master挂了,也就是/master-election节点被删除,那么其他客户端将会重新发起master选举
  2. 利用临时有序节点的特性来实现。所有参与选举的客户端在ZooKeeper服务器的/master节点下创建一个临时有序节点,编号最小的节点表示Master,后续节点可以监听前一个节点的删除事件,用于触发重新选举。

四、Apache Dubbo 集成 ZooKeeper 实现服务注册

1.优势

服务动态上下线感知、负载均衡

2.Apache Dubbo 集成 ZooKeeper 实现服务注册的步骤

  • 在springboot-provider项目的sample-provider模块中添加ZooKeeper相关依赖:zookeeper、curator-framework、curator-recipes(后面两个依赖为ZooKeeper的开源客户端)
  • 修改application.properties文件,修改dubbo.registry.address的地址为ZooKeeper服务器的地址,表示当前Dubbo服务需要注册到ZooKeeper上

spring.application.name=springboot-dubbo-demo

dubbo.application.name=springboot-provider        提供方应用信息,用于计算依赖关系

dubbo.protocol.name=dubbo                                  协议

dubbo.protocol.port=20880                                     端口

dubbo.registry.address=zookeeper://192.168.13.106:2181             服务注册中心的地址

  • 服务调用方只需修改application.properties,设置Dubbo服务注册中心的地址即可,当Dubbo调用方发起远程调用时,会去注册中心获取目标服务的URL地址即可完成最终通信

dubbo.registry.address=zookeeper://192.168.13.106:2181             服务注册中心的地址

3.ZooKeeper注册中心的实现原理

当提供者Dubbo服务启动时,会去ZooKeeper服务器的指定目录下创建当前服务的URL,其中com.gupaoedu.book.dubbo.IHelloService是发布服务接口的全路径;providers表示服务提供者的类型,dubbo://ip:port表示该服务的协议类型和访问地址。其中URL删除临时节点,求他为持久化节点。临时节点的好处是注册该节点的服务下线啦,那么这个服务的URL会从ZooKeeper服务器上消失

当Dubbo服务消费者启动时,会对/dubbo/com.gupaoedu.book.dubbo.IHelloService/providers节点下的子节点注册Watcher监听,这样便可以感知到服务提供方节点的上下线变化,从而防止请求发送到已经下线的服务器造成访问失败。同时,服务消费者会在 /dubbo/com.gupaoedu.book.dubbo.IHelloService/consumers 下写入自己的URL,这样做的目的是可以在监控平台上看到某个Dubbo服务正在被哪些服务调用。最重要的是服务的消费者要调用服务,会去providers下获取所有URL,然后通过负载均衡算法计算一个地址进行访问。

服务注册和动态感知的功能用到了Zookeeper中的临时节点、持久化节点、Watcher。Dubbo还可以针对不同的情况来实现以下功能

  • 基于临时节点的特性,当服务提供者宕机或者下线时,注册中心会自动删除该服务提供者的信息
  • 注册中心重启时,Dubbo能够自动恢复注册数据及订阅请求
  • 为了保证节点操作的安全性,Zookeeper提供了ACL权限控制,在Dubbo中可以通过dubbo.registry.username/dubbo.registry.password设置节点的验证信息
  • 当注册中心默认的根节点是/dubbo时,如果需要针对不同环境设置不同的根节点,可以使用dubbo.registry.group修改根节点名称

五、Dubbo Spring Cloud

定义

Dubbo Spring Cloud 是Spring Cloud Alibaba 的核心组件,Dubbo 既能够完全整合到Spring Cloud的技术栈中,享受Spring Cloud生态中的技术支持和标准化输出,又能够填补Spring Cloud中服务治理这方面的短板

实现Dubbo服务提供方

  • 创建一个普通的Maven工程,并在该工程中创建两个模块:spring-cloud-dubbo-sample-api(普通maven工程)、spring-cloud-dubbo-sample-provider(Spring Boot 工程)
  • 在spring-cloud-dubbo-sample-api中声明接口,并执行mvn install 将Jar包安装到本地仓库
  • 在spring-cloud-dubbo-sample-provider中添加依赖

spring-cloud-starter:Spring Cloud 核心包

spring-cloud-dubbo-sample-api:API接口声明

spring-cloud-starter-dubbo:引入Spring Cloud Alibaba Dubbo

spring-cloud-starter-zookeeper-discovery:基于ZooKeeper实现服务注册发现的artifactId            

  • 在spring-cloud-dubbo-sample-provider中创建api工程接口的实现类,其中@Service是Dubbo服务的注解,表示当前服务会发布一个远程服务
  • 在application.properties中配置Dubbo相关的信息

dubbo.protocol.port=20880

dubbo.protocol.name=dubbo

spring.application.name=spring-cloud-dubbo-sample

spring.cloud.zookeeper.discovery.register=true    (表示服务是否需要注册到注册中心)

spring.cloud.zookeeper.connect-string=192.168.13.106:2181 表示ZooKeeper的连接字符串

  • 在启动类中声明@DubboComponentScan注解并启动服务,@DubboComponentScan扫描当前注解所在包路径下的@Service注解,实现服务发布。在发布之后,就可以在ZooKeeper服务器上看一个 /service/${project-name}节点,这个节点保存了服务提供方相关的地址信息

实现Dubbo服务调用方

  • 创建一个名为spring-cloud-dubbo-consumer的Spring Boot工程,添加同服务提供方
  • 在application.properties文件中添加Dubbo相关配置信息

dubbo.cloud.subscribed-services=spring-cloud-dubbo-provider   (表示服务调用者订阅的服务提供方的应用名称列表,如果有多个应该名称,可以用,分割开)

spring.application.name=spring-cloud-dubbo-consumer

spring.cloud.zookeeper.discovery.registry=false (表示当前服务不需要注册到ZooKeeper上,默认是true)

spring.cloud.zookeeper.connect-string=192.168.13.106:2181

  • 创建一个类,@Reference注解可以调用一个远程服务,启动Spring Boot服务即可完成调用

六、Apache Dubbo 的高级应用

Apache Dubbo 的功能除了RPC通信框架、服务注册中心外还有服务治理方面的功能:集群容错、服务路由、负载均衡、服务降级、服务限流、服务监控、安全验证等。

1.集群容错

当服务调用者调用服务提供者接口时,如果因为网络延迟、网络中断、服务异常等原因出现请求失败,那对于服务调用者来说,需要一种机制来应对,Dubbo提供了优雅的容错机制

容错模式:

  • Failover Cluster ,失败自动切换。当服务调用失败后,会自动切换到集群的其他服务器中进行重试,默认重试2次
  • Failfast Cluster,快速失败,当服务调用失败后,立即报错
  • Failsafe Cluster,失败安全,也就是出现异常时,直接忽略异常
  • Failback Cluster,失败后自动回复,服务调用出现异常,在后台记录这条失败的请求定时重发。
  • Forking Cluster,并行调用集群中的多个服务,只要一个成功就返回
  • Broadcast Cluster,广播调用所有服务提供者,有一个失败则表示服务调用失败

配置方式:在服务的@Service注解上增加一个参数即可。 

例:@Service(cluster="failfast")   表示当前的容错方式为快速失败

2.负载均衡

Dubbo提供了4种负载均衡策略,默认是random。如果4种策略不满足需求,可以用SPI机制来扩展

  • Random  LoadBalance,随机算法。可以针对性能较好的服务器设置较大的权重值,权重值越大随机的概率就越大
  • RoundRobin LoadBalance,轮询。按照公约后的权重设置轮询比例
  • LeastActive LoadBalance,最少活跃调用书。处理较慢的节点将会收到更少的请求
  • ConsistentHash LoadBalance,一致性Hash。相同参数的请求总是发送到同一个服务提供者

配置方式:在@Service注解上增加loadbalance参数

例:@Service(cluster="failfast",loadbalance="roundrobin")

3.服务降级

服务降级是一种系统保护策略,当服务器访问压力较大时,可以根据当前业务情况对不重要的服务进行降级,以白虎核心服务的正常运行。就是把一些非必要的功能在流量较大时关闭。

Dubbo提供了一种Mock配置来实现服务降级,也就是说当服务提供方出现网络异常无法访问时,客户端不抛出异常,而是通过降级配置返回兜底数据,操作如下

  • 在spring-cloud-dubbo-consumer项目中创建MockHelloService类,这个类只需要实现自动降级的接口即可,然后重写接口中的抽象方法,自己定义要返回的内容
  • 在调用者类中修改@Reference注解增加Mock参数,其中设置了属性cluster="failfast",因为默认的容错策略会发起两次重试,等待时间太长

例:@Reference(mock="com.gupaoedu.book.springcloud.MockHelloService",cluster="failfast")

  • 在不启动Dubbo服务端或者服务端的返回值超过默认超时时间时,访问服务提供者接口得到的数据就是MockHelloService中返回的数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值