每日一练进击大厂【DAY14】Dubbo

144 阅读6分钟

一、什么是Dubbo

       Dubbo是阿里巴巴开源的基于java的高性能RPC分布式服务框架。        Dubbo提供的基础能力包括:面向接口代理的高性能RPC调用、智能容错和负载均衡、服务自动注册和发现、高度可扩展能力、运行期流量调度、可视化的服务治理与运维。

       Rpc:rpc是远程过程调用,是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

二、Dubbo的服务注册与发现的流程图

Dubbo的服务注册与发现

三、Dubbo核心配置

  • dubbo:service 服务配置 服务提供方配置
<dubbo:service interface="com.example.service.first.FirstService" ref="firstServiceImpl"timeout="2000">
 </dubbo:service>
  • dubbo:reference 引用配置 服务消费方配置
<dubbo:reference interface="com.example.service.first.FirstService" check="false" id="firstServiceImpl">
 <dubbo:method name="getFristStr" timeout="9000"/>
 </dubbo:reference>
  • dubbo:protocol 协议配置
<dubbo:protocol name="dubbo" port="20880"/>
  • dubbo:application 应用配置 生产者和消费者均需要配
<dubbo:application name="dubbo-provider"/>
  • dubbo:module 模块配置
  • dubbo:registry 注册中心配置 生产者和消费者均需要配
<dubbo:registry address="zookeeper://127.0.0.1:2181" check="false"/>
  • dubbo:monitor 监控中心配置
  • dubbo:provider 提供方配置
<dubbo:provider timeout="5000"/>
  • dubbo:consumer 消费方配置
<dubbo:consumer check="false"/>
  • dubbo:method 方法配置
<dubbo:service interface="com.example.service.first.FirstService" ref="firstServiceImpl"timeout="2000">
	<dubbo:method name=""/>
 </dubbo:service>
  • dubbo:argument 参数配置

四、Dubbo启动时如果依赖的服务不可用会怎样

       Dubbo缺省会在启动时检查依赖的服务是否可用,如果不可用则会抛出异常,阻止spring初始化完成, 默认check="true",可以通过设置 check="false"关闭检查,在启动的时候不检查服务是否可用,也就不会抛出异常。

<dubbo:registry address="zookeeper://127.0.0.1:2181" check="false"/>

五、Dubbo负载均衡策略

  • Random LoadBalance 随机,按权重设置随机概率(默认)
  • RoundRobin LoadBalance 轮询,按公约后的权重设置轮询比率
  • LeastActive LoadBalance 最少活跃调用数,相同活跃数的随机
  • ConsistenHash LoadBalance 一致性Hash,相同参数的请求总是发到同一提供者
  • ShortestResponseLoadBalance 最短响应优先 + 加权随机

六、Dubbo与Feign区别

       Dubbo支持多传输协议(Dubbo、Rmi、http、redis等),可以根据业务场景选择最佳的方式。Feign基于Http传输协议,短连接,不适合高并发的访问。        Dubbo支持4种负载均衡算法,而且算法里面引入权重。Feign只支持N种策略,轮询,随机,RespinseTime加权。负载均衡算法是Client级别的。        Dubbo支持多种容错策略,也引入的重试次数,超时等配置参数。Feign利用熔断机制来实现容错的,处理方式不一样。

七、Dubbo整合常用注解

  • @DubboService:就是服务暴露的注解,想要暴露什么服务就在接口实现类上加上该注解
  • @EnableDubbo:作用是在服务提供方扫描@DubboService注解,在服务消费者扫描@DubboReference注解的属性并且进行属性的依赖注入。
  • @DubboReference:在消费方添加该注解表示引用该服务。

八、Dubbo SPI机制

       SPI是一种服务发现机制,其实就是将结构的实现类写入配置当中,在服务加载的时候将配置文件读出,加载实现类,这样就可以在运行的时候,动态的帮助接口替换实现类,Dubbo的SPI其实是对java的SPI进行了一种增加,可以按需加载实现类之外,增加了IOC和AOP的特性,还有自适应扩展机制。 SPI在Dubbo应用很多,包括协议扩展,集群扩展,路由扩展,序列化扩展等。

Dubbo对于文件目录的配置分为了三类:

  • META-INF/services/ 目录:该目录下的 SPI 配置文件是为了用来兼容 Java SPI
  • META-INF/dubbo/ 目录:该目录存放用户自定义的 SPI 配置文件
  • META-INF/dubbo/internal/ 目录:该目录存放 Dubbo 内部使用的 SPI 配置文件

九、Dubbo中的SPI和JAVA的SPI区别

       JAVA SPI:在查找扩展实现类的时候遍历SPI的配置文件并且将实现类全部实例化。        Dubbo SPI:对Dubbo进行扩展,不需要改动Dubbo源码;延迟加载,可以一次只加载自己想要加载的扩展实现;增加了对扩展点IOC和AOP的支持,一个扩展点可以直接setter注入其它扩展点;Dubbo的扩展机制能很好的支持第三方IOC容器,默认支持Spring Bean。

十、Dubbo集群容错模式

  • Failover Cluster:默认提供了重试的容错机制,如果基于Dubbo进行服务间通信出现异常,服务消费者会对服务提供者集群中其他的节点发起重试,确保这次请求成功,默认的额外重试次数是2次。
  • Failfast Cluster:快速失败策略,服务消费者只发起一次请求,如果请求失败,直接把错误抛出去。通常用于非幂等性的写操作,比如新增记录。
  • Failsafe Cluster:失败安全策略,如果出现服务通信异常,直接把这个异常吞掉不做任何处理。通常用于写入审计日志等操作。
  • Failback Cluster:失败自动恢复策略,后台记录失败请求,然后通过定时任务来对这个失败的请求进行重发。通常用于消息通知操作。
  • Forking Cluster:并行调用多个服务策略,就是把这个消息广播给服务提供者集群,只要有任何一个节点返回就表示请求执行成功。通常用于实时性要求较高的读操作,但需要浪费更多服务资源,可通过forks=2来设置最大并行数。
  • Broadcast Cluster:广播调用所有提供者,逐个调用,任意一台报错则报错,通常用于通知所有提供者更新缓存或日志等本地资源消息。
  • Available Cluster:调用目前可用的实例(只调用一个),如果当前没有可用的实例,则抛出异常。通常用于不需要负载均衡的场景。

十一、怎么设计一个RPC框架

       首先我们需要一个注册中心,去管理消费者和提供者的节点信息,这样才会有消费者和提供者才可以去订阅服务,注册服务。        当有了注册中心后,可能会有多个provider节点,那么我们肯定会有一个负载均衡模块来负责节点的调用,至于用户指定路由配置可以是一个额外的优化点。        具体的调用肯定会需要牵扯到通信协议,所以需要一个模块来对通信协议进行封装,网络传输还要考虑序列化。        当调用失败后怎么去处理,所以我们还需要一个容错模块,来负责失败情况的处理。        其实做完这些一个基础的模型就已经搭建好了,我们还可以有很多的优化点,例如请求数据的监控,配置信息的处理,日志信息的处理等。

十二、Dubbo的注册中心集群挂掉,发布者和订阅者之间还能通信吗

       可以的,启动Dubbo时,消费者会从zookeeper拉取注册的生产者的地址接口等数据,缓存在本地,每次调用时,按照本地存储的地址进行调用。


总结

不要慌,不要慌,太阳下了有月光。