可视化服务降级处理
当短时间内服务出现网络故障时,或者我们希望让程序以最大的算力去保证核心业务的运行,对于非核心业务暂时屏蔽调用,我们可以采用服务降级的方式来实现这一服务治理。
屏蔽
:表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。
容错
:表示消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。
禁止
: 表示消费方服务直接被禁止,外界无法访问该服务。
集群容错
当部署了集群模式时,为了实现服务的高可用,我们希望某台服务器的宕机不影响其他服务器的使用。这个时候可以采用dubbo的cluster
属性来实现。
cluster属性值及作用
属性值 | 效果 |
---|---|
Failfast Cluster | 快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。 |
Failsafe Cluster | 失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。 |
Failback Cluster | 失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。 |
Forking Cluster | 并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。 |
Broadcast Cluster | 广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。 |
cluster使用
在服务提供端使用
<dubbo:service cluster="failsafe" />
在服务消费端使用
<dubbo:reference cluster="failsafe" />
整合hystrix实现服务降级细处理
当我们不希望只返回用户一个null对象时,我们希望当出现超时响应问题时能够返回一个简单的响应。从而达到不占用系统资源的目的。
服务熔断和服务降级:
服务熔断
是在一定时间内错误访问次数达到阈值时,服务将启动熔断服务,在阈值未恢复时将不会在访问原来的接口,转而访问预先设置的熔断类。
服务降级
是当服务错误访问时,服务为了提升用户体验或者保护服务接口的正常运行,为我们的接口增加一个保护层,从而将访问转到余下设置的熔断类中去处理。
而hystrix
springcloud的一个子组件,当然也允许我们配合dubbo一起使用,如果想对hystrix
有更深的了解,可以参阅官方文档也可以查看关于springcloud-hystrix的博客。
这里对dubbo简单整合hystrix做一个示例
-
先在服务提供端随机抛出异常用于测试
@Component @Service(methods = {@Method(name = "hello",timeout = 1000)}) public class ProviderServiceImpl implements ProviderService { @Override public String hello(String name) { //随机抛出异常 if (Math.random()>0.5){ throw new RuntimeException(); } return new Message().toString(); } }
-
服务消费端导入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> <version>2.2.1.RELEASE</version> </dependency>
注意:注意与springboot版本号对应关系
-
主启动类加入
@EnableHystrix
注解启用hystrix@SpringBootApplication @EnableDubbo public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }
-
为接口方法添加注解设置服务容错方法
@Component public class ConsumerServiceImpl implements ConsumerService { /** * 负载均衡策略 */ @Reference(loadbalance = "random") private ProviderService providerService; @Override @HystrixCommand(fallbackMethod = "world") public String hello(String name) { return providerService.hello(name); } public String world(String name){ return "哦那恭喜"; } }
启动服务即可使用。
关于服务降级应该放在哪个位置的描述
服务降级只需要放在我们需要放置的地方,如果我们希望服务降级在消费者端做,只需要在消费端配置相应配置即可。
如果我们希望服务降级放在服务端做,同样只需要在服务提供端增加相对应配置即可。