一.Dubbo集群容错有几种方案?
- Failover Cluster(失败自动切换):这是默认的容错方案。当调用失败时,会自动切换到其他机器进行重试。可以通过配置retries属性来设置重试次数(不包括第一次调用)。这种方案通常适用于读操作,但如果重试的操作是写入,可能会存在重复处理的风险。
- Failfast Cluster(快速失败):只发起一次调用,如果失败则立即报错。这种方案通常用于非幂等性的写操作,比如新增记录,因为它不会进行重试,从而避免了可能的重复处理。
- Failsafe Cluster(失败安全):调用失败时,直接忽略错误,不返回异常给调用方。这种方案通常用于写入审计日志等操作,因为即使写入失败,也不会对业务产生严重影响。
- Failback Cluster(失败自动恢复):后台记录失败请求,并定时重发。这种方案通常用于消息通知操作,因为它允许系统在后台尝试恢复失败的操作。
- Forking Cluster:并行调用多个服务器,只要其中一个成功即返回结果。这种方案适用于实时性要求较高且对服务资源消耗不敏感的读操作。
- Broadcast Cluster:广播调用所有提供者,逐个调用,任意一台报错则报错。这种方案通常用于通知所有提供者更新缓存或日志等本地资源信息。
二.Dubbo服务降级,失败重试怎么做?
服务降级:
服务降级是Dubbo中的一种容错机制,旨在当远程服务调用失败或超时时,通过提供备用方案来保持部分功能的正常运行。其核心思想是避免整个业务流程因某个服务的故障而崩溃。
在Dubbo中,服务降级可以通过设置合适的容错策略来实现。例如,当远程调用失败时,可以配置mock值或抛出特定的异常,或者直接执行自定义的mock类。这样,当服务调用失败时,Dubbo会执行mock方法而不是继续远程调用,从而保障了部分功能的可用性。
服务降级的常见场景包括远程调用失败、超时、资源限制以及异常等。在这些情况下,Dubbo会根据预设的容错策略进行服务降级,以保障业务的连续性。
失败重试:
Dubbo默认提供了失败重试的机制,以减少因单个节点故障或网络波动导致的服务不可用问题。当服务请求失败时,Dubbo会根据配置自动进行重试。
Dubbo的失败重试机制使用了环形数组来存储重试请求,每个请求被分配到一个槽位上。当槽位的时间到达时,对应的请求会被触发进行重试。这种方式避免了连续重试造成的资源浪费和系统负载过高的问题。
在Dubbo中,可以配置重试次数和超时时间等参数来控制重试行为。例如,可以通过设置retries属性来指定最大重试次数。如果在配置的调用次数内都失败,则认为此次请求异常,抛出异常。
三.Dubbo使用哪些设计模式?
- 责任链和装饰器模式:Dubbo在启动和调用阶段大量使用了装饰器模式。装饰器模式允许用户通过在一个对象上动态地添加一些额外的职责来扩展对象的功能。责任链模式则允许多个对象有机会处理请求,从而避免请求的发送者和多个请求处理者之间的耦合关系。
- 观察者模式:Dubbo的provider在启动时,需要与注册中心交互,先注册自己的服务,再订阅自己的服务。订阅时采用了观察者模式,开启一个listener。注册中心会每5秒定时检查是否有服务更新,如果有更新,向该服务的提供者发送一个notify消息。Provider接收到notify消息后,即运行NotifyListener的notify方法,执行监听器方法。
- 代理模式:Dubbo consumer使用动态代理模式,默认使用JavassistProxyFactory。这种模式的目的是调用invoker的相关函数后,将本地调用转为网络调用并获得结果,屏蔽了网络通信的细节。
四.Dubbo配置文件是如何加载到Spring中的?
- 在Spring的配置文件中使用Dubbo相关的标签来配置Dubbo的基本信息、注册中心地址以及通信协议等。例如,使用标签来配置Dubbo的应用名称,使用标签来配置注册中心的地址,以及使用标签来配置通信协议和端口等信息。这种方式适用于传统的Spring项目。
- 对于Spring Boot项目,可以通过配置类的注解来导入Dubbo的配置。例如,使用@SpringBootApplication和@ImportResource注解来导入Dubbo的配置文件。你可以在@ImportResource注解中指定Dubbo的配置文件位置,如classpath:dubbo-provider.xml。这样,Spring Boot会自动加载并解析这些配置文件,将配置加载成Spring容器的bean。
- 另外,Spring Boot与Dubbo的整合还可以通过其他方式实现。例如,你可以导入dubbo-starter,并在application.properties中配置相关属性。然后,使用@Service注解来暴露服务,使用@Reference注解来引用服务。你还可以使用@EnableDubbo注解来启用Dubbo的支持。这种方式更加简洁和方便,无需手动加载和解析XML配置文件。