高可用(HA):通过设计,减少系统不能提供服务的时间
<mark>通常由三种策略:</mark>
1. Zookeeper宕机与dubbo直连
默认情况下,当Zookeeper宕机时,服务还是可以正常提供,并且消费者还是可以正常访问生产者,这中间靠的是本地缓存通信,这体现了Zookeeper注册中心的健壮性。
dubbo直连:指的是生产者可以通过配置@Reference(url = "127.0.0.1:20880")
来执行目标的生产者,实现服务间的指向性通信。
2. 集群下Dubbo的负载均衡配置
- 按权设置随机访问
orderService的调用都是随机的,只不过1,2,3的命中概率随着权重的分配而不同罢了。
2. 按权设置轮询访问
也比较好理解,就是按照权重比例,轮流调用。
- 最少活跃数
按照调用服务的响应时间来提高可用性,时间最短的优先获取调用权,时间最长的以后的调用次数会越来越少。 - 一致性hash
通过请求参数的hash运算,将请求命中到指定服务,类似与nginx里面的ip_hash实现效果
3. 整合Hystrix实现服务熔断降级
- 服务降级
在服务器压力剧增的情况下,为了保证核心业务的正常进行,有时候可能会使部分非紧急业务进行降级处理,举个例子:双11下单服务的请求通常情况下会剧增,此时广告服务(非关键服务)就可以先降级处理,以保证订单服务的正常工作。
向注册中心写入配置:
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"));
dubbo提供两种服务降级的处理方式,其中
- mock=force:return+null:表示的是请求服务直接返回null,不管有没有出错
- mock=force:fail+null:表示的是请求服务出现异常后返回null,不抛异常
- 集群容错
集群调用失败时,dubbo也提供多种容错的处理方案,默认是failover重试
- 失败自动切换:dubbo默认的集群容错机制,当出现失败,会重试其它的服务器,但重试可能会带来更长的延迟,可以通过
retries = 2
来指定重试的次数(不包含第一次)。 - 快速失败:发起请求,失败就立即报错,通常用于非幂等性操作,比如新增记录。
- 失败安全:出现异常时,直接忽略,通常用于写入审计日志等操作
- 失败自动恢复:失败自动恢复,后台记录失败请求,定时重发,通常用于消息通知操作。
- 并行请求:并行调用多个服务器,只要有一个成功返回即可。通常用于实时性较高的读操作,但需要浪费更多的资源,可通过
forks = 2
来设置最大并行数。 - 广播请求:广播调用所有服务器提供者,逐个调用,任意一台报错则报错,通常用于通知所有提供者更新缓存或日志等本地资源信息。
-
整合Hystrix
Hystrix是springcloud非常优秀的组件,提供了服务的容错降级的一套解决方案。
使用权需要在启动类上开启@EnableHystrix
功能
在方法上通过注解@HystrixCommand
来配置容错降级的具体方案,并且可以通过指定fallbackMethod = "reliable"
的兜底方法来返回给服务消费者友好的失败请求。
这里需要注意的是兜底方法必须参数和可能出现异常的方法完全一致。