Dubbo的学习笔记(二)高可用

1、zookeeper 宕机与 dubbo 直连

现象:zookeeper 注册中心宕机,还可以消费 dubbo 暴露的服务。
原因:
健壮性
监控中心宕掉不影响使用,只是丢失部分采样数据
数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
注册中心对等集群,任意一台宕掉后,将自动切换到另一台
注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
服务提供者无状态,任意一台宕掉后,不影响使用
服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复
高可用:通过设计,减少系统不能提供服务的时间;

dubbo 直连:在@Reference注解里面直接添加提供者的url地址,如:@Reference(url="127.0.0.1:20882"),可以绕过zookeeper与提供者直接连接。

2、集群下 dubbo 负载均衡配置

在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 random 随机调用。

负载均衡策略

Random LoadBalance

随机,按权重设置随机概率。
在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

RoundRobin LoadBalance

轮循,按公约后的权重设置轮循比率。
存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

LeastActive LoadBalance

最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。即总是会挑一个最快的

ConsistentHash LoadBalance

一致性 Hash,相同参数的请求总是发到同一提供者。
当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
注:还可以通过设置倍权、半权或权重调节动态设置,按照权重进行随机。

3 整合 hystrix,服务熔断与降级处理

3.1 服务降级

当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作。
可以通过服务降级功能临时屏蔽某个出错的非关键服务,并定义降级后的返回策略。
向注册中心写入动态配置覆盖规则:
RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181"));
registry.register(URL.valueOf("override://0.0.0.0/com.foo.BarService?category=configurators&dynamic = false&application=foo&mock=force:return+null"));
其中:
直接返回为空:mock=force:return+null表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。相当于下图的屏蔽。
调用失败返回为空:还可以改为 mock=fail:return+null 表示消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。相当于下图的容错。
注:这两个都是在消费者端进行设置的。

3.2 集群容错

3.3 整合 hystrix

Hystrix 旨在通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix 具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置等功能。

3.3.1 配置 spring-cloud-starter-netflix-hystrix

spring boot 官方提供了对 hystrix 的集成,直接在 pom.xml 里加入依赖:
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  <version>1.4.4.RELEASE</version>
</dependency>
然后在 Application 类上增加@EnableHystrix 来启用 hystrix starter:
@SpringBootApplication
@EnableHystrix
public class ProviderApplication {

3.3.2 配置 Provider 端

在 Dubbo 的 Provider 上增加@HystrixCommand 配置,这样子调用就会经过 Hystrix 代理。(@HystrixCommand里面是一些参数
@Service(version = "1.0.0") 
public class HelloServiceImpl implements HelloService { 
    @HystrixCommand(commandProperties = { 
        @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), 
        @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000") }) 
    @Override 
    public String sayHello(String name) {
        // System.out.println("async provider received: " + name); 
        // return "annotation: hello, " + name; 
        throw new RuntimeException("Exception to show hystrix enabled."); 
    } 
}

3.3.3 配置 Consumer 端

对于 Consumer 端,则可以增加一层fallbackMethod调用,并在fallbackMethod上配置@HystrixCommand。当调用出错时,会走到 fallbackMethod = "reliable"的调用里。
@Reference(version = "1.0.0")
private HelloService demoService;

@HystrixCommand(fallbackMethod = "reliable")
public String doSayHello(String name) {
    return demoService.sayHello(name);
}
public String reliable(String name) {
    return "hystrix fallback value";
}

 

 

posted @ 2020-09-25 15:11  Mistolte  阅读(176)  评论(0编辑  收藏  举报