项目运行一段时间后 zookeeper 注册中心宕机,还可以消费 dubbo 暴露的服务。
高可用:通过设计,减少系统不能提供服务的时间
我们可以通过**@Reference** 注解的 url属性设置 消费者直连提供者:
@Service
public class OrderServiceImpl implements OrderService {
@Reference(url = "127.0.0.1:20880")
UserService userService;
@Override
public List<UserAddress> initOrder(String userId) {
System.out.println( "用户id : " + userId );
//查询用户地址
List<UserAddress> addressList = userService.getUserAddressList( userId );
return addressList;
}
}
在集群负载均衡时,Dubbo 提供了多种均衡策略。
@Service(loadbalance = "roundrobin")
@Reference(loadbalance = "roundrobin")
通常我们是使用Dubbo控制台来调节,如下:
当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作。
可以通过服务降级功能临时屏蔽某个出错的非关键服务,并定义降级后的返回策略。 向注册中心写入动态配置覆盖规则:
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"));
其中:
##四、整合hystrix,服务熔断与降级处理 Hystrix 指在通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置等功能,在springcloud基础中,我写过对Hystrix的使用。下面我们使用Dubbo 和 hystrix 整合一下:
<!-- Hystrix的依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
然后在Application类上增加@EnableHystrix来启用hystrix starter:
@EnableHystrix
@EnableDubbo
@SpringBootApplication
public class UserServiceProviderApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceProviderApplication.class, args);
}
}
@Service
@Component
public class UserServiceImpl implements UserService{
//将该方法交给了 Hystrix 代理
@HystrixCommand
@Override
public List<UserAddress> getUserAddressList(String userId) {
List<UserAddress> list = new ArrayList<>();
UserAddress address1 = new UserAddress(1 , "上海市杨浦区xxx路xxx号" , "1" , "王某某","0");
UserAddress address2 = new UserAddress(2 , "上海市徐汇区xxx路xxx号" , "1" , "张某某","1");
list.add( address1 );
list.add( address2 );
//构造不定期访问错误
if(Math.random() > 0.5) {
throw new RuntimeException();
}
return list;
}
}
同服务提供者一样添加 Hystrix 的依赖
@EnableHystrix
@EnableDubbo
@SpringBootApplication
public class GmallOrderConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(GmallOrderConsumerApplication.class, args);
}
}
@Service
public class OrderServiceImpl implements OrderService {
@Reference
UserService userService;
@HystrixCommand(fallbackMethod = "hello")
@Override
public List<UserAddress> initOrder(String userId) {
System.out.println( "用户id : " + userId );
//查询用户地址
List<UserAddress> addressList = userService.getUserAddressList( userId );
return addressList;
}
public List<UserAddress> hello(String userId) {
return Arrays.asList( new UserAddress( 3, "出错地址", "1", "出错", "出错" ) );
}
}
启动提供者和消费者,访问测试如下:
评论