异常处理


HystrixCommand
实现的run方法中抛出异常,除了
HystrixBadRequestException之外,其他异常均会被Hystrix
认为命令执行失败并触发服务降级处理逻辑,所以当需要在命令中执行抛出不触发降级的异常时使用他,在使用注解配置实现
Hystrix
命令时,支持忽略指定异常类型功能,只需要通过设置 @HystrixCommand
注册的
ignoreException
参数,示例代码如下:

@HystrixCommand (ignoreExceptions = {IllegalStateException.class})

如果抛出了类型为
IllegalStateException
的异常,Hystrix
会将其包装为
HystrixBadRequestException
抛出,这样就不会触发后续的
fallback
逻辑。

如果需要在降级逻辑中获取触发的异常,我们可以通过
getExecutionException
方法来获取具体的异常,如果使用注解的方式,则需要在fallback实现的方法的参数中增加
Throwable
e
对象的定义,这样就可以在方法内部获取触发服务降级的具体异常内容,示例代码如下:

@HystrixCommand (ignoreExceptions = {IllegalStateException.class},fallbackMethod="helloFallback")

@GET

@Path ("get")

public String get(@QueryParam ("id") int id, @QueryParam ("name") String name) {

throw new
RuntimeException("get command failed.");

}

public String helloFallback(int id, String name, Throwable e) {

return
"error id=" + id + "\tname=" + name + "\tthrowable=" + e.getMessage();

}

请求缓存

当系统用户不断增长时,每个微服务需要承受的并发压力也越来越大,在分布式环境中,通常压力来自对依赖服务的调用,因为亲戚依赖服务的资源需要通过通信来实现,这样的依赖方式比起进程内的调用方式会引起一部分的性能损失,在高并发的场景下,Hystrix
提供了请求缓存的功能,我们可以方便的开启和使用请求缓存来优化系统,达到减轻高并发时的请求线程消耗、降低请求响应时间的效果

开启请求缓存功能

Spring Cloud Hystrix
请求缓存的使用非常简单,我们只需要在实现
HystrixCommand

HystrixObservableCommand
时,通过重载
getCacheKey()方法来开启请求缓存。

public class HelloGetCommand extends HystrixCommand<String> {

private RestTemplate restTemplate;

public
HelloGetCommand(Setter setter, RestTemplate restTemplate) {

super(setter);

this.restTemplate= restTemplate;

}

@Override

protected String run() throws Exception {

ResponseEntity<String> responseEntity=

restTemplate(getForEntity("http://ORG.DRSOFT.WEBSERVICE.HELLOSERVICE/hello/get", String.class);

return responseEntity.getBody();

}

@Override

protected String getFallback() {

return
"error id=" + id + "\tname=" + name;

}

@Override

protected String getCacheKey() {

return"get";

}

}

调用时候还需要在当前线程执行 HystrixRequestContext.initializeContext() 并且在结束时候需要进行释放,而且在Hystrix中带缓存的command是必须在request中调用的,示例代码如下:

HystrixRequestContext context = HystrixRequestContext.initializeContext();

try {

HystrixCommand<String> hystrixCommand = new
HelloGetCommand(setter, restTemplate);

return hystrixCommand.execute();

} finally {

context.shutdown();

}

清理失效缓存

在请求缓存时,如果只是读操作,那么不需要考虑缓存内容是否正确的问题,但是如果请求命令中还有更新数据的写操作,那么缓存中的数据就需要我们在进行写操作时及时处理,以防止读操作的请求命令获取到失效的数据,我们可以使用
HystrixRequestCache.clear
方法来进行缓存清理,示例代码如下:

/**

* 清除缓存

*/

public
void
flushCache() {

HystrixRequestCache.getInstance(this.getCommandKey()

, HystrixConcurrencyStrategyDefault.getInstance()).clear("get");

}

笔记:Spring Cloud Hystrix 异常处理、缓存和请求合并的更多相关文章

  1. Spring Cloud 微服务笔记(六)Spring Cloud Hystrix

    Spring Cloud Hystrix Hystrix是一个延迟和容错库,旨在隔离远程系统.服务和第三方库,阻止链接故障,在复杂的分布式系统中实现恢复能力. 一.快速入门 1)依赖: <dep ...

  2. 笔记:Spring Cloud Hystrix 服务容错保护

    由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身问题出现调用故障或延迟,而这些问题会直接导致调用方的对外服务也出现延迟,若此时调用方的请求不断增加 ...

  3. 第五章 服务容错保护:Spring Cloud Hystrix

    在微服务架构中,我们将系统拆分为很多个服务,各个服务之间通过注册与订阅的方式相互依赖,由于各个服务都是在各自的进程中运行,就有可能由于网络原因或者服务自身的问题导致调用故障或延迟,随着服务的积压,可能 ...

  4. spring cloud: Hystrix(一):简单使用

    在微服务架构中,我们将系统拆分为很多个服务,各个服务之间通过注册与订阅的方式相互依赖,由于各个服务都是在各自的进程中运行,就有可能由于网络原因或者服务自身的问题导致调用故障或延迟,随着服务的积压,可能 ...

  5. 第五章 服务容错保护: Spring Cloud Hystrix

    在微服务架构中, 存在着那么多的服务单元, 若一个单元出现故障, 就很容易因依赖关系而引发故障的蔓延,最终导致整个系统的瘫痪,这样的架构相较传统架构更加不稳定.为了解决这样的问题, 产生了断路器等一系 ...

  6. SpringCloud---服务容错保护---Spring Cloud Hystrix

    1.概述 1.1 在分布式架构中,存在着许多的服务单元,若一个单元出现故障,很容易因依赖关系引发故障的蔓延,最终导致整个系统的瘫痪: 为了解决这样的问题,产生了断路器等服务保护机制: 1.2 分布式架 ...

  7. Spring Cloud 微服务四:熔断器Spring cloud hystrix

    前言:在微服务架构中,一般都是进程间通信,有可能调用链都比较长,当有底层某服务出现问题时,比如宕机,会导致调用方的服务失败,这样就会发生一连串的反映,造成系统资源被阻塞,最终可能造成雪崩.在sprin ...

  8. Spring Cloud Hystrix理解与实践(一):搭建简单监控集群

    前言 在分布式架构中,所谓的断路器模式是指当某个服务发生故障之后,通过断路器的故障监控,向调用方返回一个错误响应,这样就不会使得线程因调用故障服务被长时间占用不释放,避免故障的继续蔓延.Spring ...

  9. Spring Cloud Hystrix 服务容错保护

    目录 一.Hystrix 是什么 二.Hystrix断路器搭建 三.断路器优化 一.Hystrix 是什么 ​ 在微服务架构中,我们将系统拆分成了若干弱小的单元,单元与单元之间通过HTTP或者TCP等 ...

随机推荐

  1. 转:彻底搞清referrer和origin

    在http协议中有这两个字段,之前一直隐隐约约的觉得是,一种标记请求来源的方法(的确是),但是更细致的对这两个字段的比较却没有一个清楚的认识. referrer 到底是referer还是referre ...

  2. 【DDD】领域驱动设计实践 —— 一些问题及想法

    在社区系统的DDD实践过程中,将遇到一些问题和产生的想法记录下来,共讨论. 本文为[DDD]系列文章中的其中一篇,其他内容可参考:使用领域驱动设计思想实现业务系统. 1.dto.model和entit ...

  3. android自定义View的绘制原理

    每天我们都会使用很多的应用程序,尽管他们有不同的约定,但大多数应用的设计是非常相似的.这就是为什么许多客户要求使用一些其他应用程序没有的设计,使得应用程序显得独特和不同. 如果功能布局要求非常定制化, ...

  4. Android 进程常驻、进程守护、进程保活技术的总结

    转载自:http://blog.csdn.net/marswin89/article/details/50917098 这是一个轻量级的库,配置几行代码,就可以实现在Android上实现进程常驻,也就 ...

  5. document.forms[].submit()

    document.forms['exportServlet'].submit(); (1)document.forms:表示获取当前页面的所有表单 (2)document.forms[0]:表示获取当 ...

  6. zTree实现多选树

    zTree实现多选树 1.实现源码 <!DOCTYPE html> <html> <head> <title>多选树</title> < ...

  7. C# 图解教程 第一章 C#和.NET框架

    C#和.NET框架 在.NET之前.NET时代 .NET框架的组成大大改进的编程环境 编译成CIL编译成本机代码并执行CLR Common Language RuntimeCLI Common Lan ...

  8. Android外部存储

    WeTest 导读 外部存储作为开发中经常接触的一个重要系统组成,在Android历代版本中,有过许许多多重要的变更.我也曾疑惑过,为什么一个简简单单外部存储,会存在存在这么多奇奇怪怪的路径:/sdc ...

  9. 第三篇:爬虫框架 - Scrapy

    前言 Python提供了一个比较实用的爬虫框架 - Scrapy.在这个框架下只要定制好指定的几个模块,就能实现一个爬虫. 本文将讲解Scrapy框架的基本体系结构,以及使用这个框架定制爬虫的具体步骤 ...

  10. 【BZOJ2440】完全平方数(二分答案,莫比乌斯反演)

    [BZOJ2440]完全平方数(二分答案,莫比乌斯反演) 题面 BZOJ 题解 很显然,二分一个答案 考虑如何求小于等于这个数的非完全平方数倍数的个数 这个明显可以直接,莫比乌斯反演一下 然后这题就很 ...