Dubbo的高可用性
1.zookeeper宕机和dubbo直连
zookeeper任意一台宕掉后,将自动切换到另一台。注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯。
除此之外,zookeeper宕机,提供者和消费者之间可以通过dubbo直连的方式(URL)进行远程通信。
2.负载均衡
在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 random 随机调用。
Random LoadBalance
随机,按权重设置随机概率。RoundRobin LoadBalance
轮询,按公约后的权重设置轮询比率。LeastActive LoadBalance
最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。ConsistentHash LoadBalance
一致性 Hash,相同参数的请求总是发到同一提供者。
配置:
整体配置
<dubbo:service interface="..." loadbalance="roundrobin" />
<dubbo:reference interface="..." loadbalance="roundrobin" />
方法配置
<dubbo:service interface="...">
<dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:service>
<dubbo:reference interface="...">
<dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:reference>
springboot配置
@Referenc(loadbalance="roundrobin")
对于相同服务的权重,可以通过dubbo admin来调节。
3.服务降级
可以通过服务降级功能,临时屏蔽某个出错的非关键服务,并定义降级后的返回策略。
可在控制台快捷操作禁用:即禁止远程调用,返回null;容错:远程调用失败后返回null,而不返回异常。
4.整合hystrix
Hystrix 旨在通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。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。
@EnableDubbo
@EnableHystrix
@SpringBootApplication
public class BootUserServiceProviderApplication {
public static void main(String[] args) {
SpringApplication.run(BootUserServiceProviderApplication.class, args);
}
}
------------------------------------------------------
服务:
@Service
@Component
public class UserServiceImpl implements UserService {
@HystrixCommand//启用Hystrix代理
@Override
public List<UserAddress> getUserAddressList(String userId) {
UserAddress address1 = new UserAddress(1, "北京", "1", "笨蛋", "123456", "Y");
UserAddress address2 = new UserAddress(2, "南京", "1", "钢蛋", "123457", "N");
return Arrays.asList(address1,address2);
}
}
- 消费者
启动:
@EnableDubbo
@EnableHystrix
@SpringBootApplication
public class BootOrderServiceConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(BootOrderServiceConsumerApplication.class, args);
}
}
---------------------------------------------------------------------
消费:
@Service
public class OrderServiceImpl implements OrderService {
@Reference
UserService userService;
@HystrixCommand(fallbackMethod = "initOrder1")//处理错误请求
@Override
public List<UserAddress> initOrder(String userId) {
// TODO Auto-generated method stub
System.out.println("用户id:" + userId);
//1、查询用户的收货地址
List<UserAddress> addressList = userService.getUserAddressList(userId);
return addressList;
}
public List<UserAddress> initOrder1(String userId) {
return Arrays.asList(new UserAddress(10,"test","test",
"test","test","test"));
}
}