Hystrix-服务容错处理:什么是Hystrix

本文详细介绍了如何在Hystrix框架中实现异步调用、回退逻辑、信号量和线程隔离策略,以及结果缓存的使用和清除,还涉及到了合并请求和Java开发者面试题的相关内容。
摘要由CSDN通过智能技术生成

@Override
protected String run() {
return this.name + “:” + Thread. currentThread() .getName();
}
}

首先需要继承HystrixCommand,通过构造函数设置一个Groupkey。具体的逻辑在run方法中,我们返回了一个当前线程名称的值。写一个main方法来调用上面编写的MyHystrixCommand程序,如以下代码所示:

public static void main(String[] args)throws InterruptedException, ExecutionException {
String result = new MyHystrixCommand(“yinjihuan”).execute();
System.out.println(result);
}

输出结果是: yinjihuan:hystrix-MyGroup。由此可以看出,构造函数中设置的组名变成了线程的名字。

上面是同步调用,如果需要异步调用可以使用一下代码所示方法:

public static void main(String[] args)throws InterruptedException, ExecutionException {
Futurefuture = new MyHystrixCommand(“yinjihuan”).queue();
System.out.println( future.get());
}

二、 回退支持

下面我们通过增加执行时间模拟调用失败的情况,首先改造MyHystrixCommand,增加getFallback方法返回回退内容,如以下代码所示:

public class MyHystrixCommand extends HystrixCommand {
private final String name ;
pub1ic MyHystrixCommand( String name) {
super (HystrixCommandGroupKey.Factory.asKey(“MyGroup”));
this.name = name;
}
@Override
protected String run() {
try {
Thread. sleep(1000 * 10);
} catch (InterruptedExceptione) {
e.printStackTrace();
}
return this.name + “:” + Thread.currentThread() . getName();
@Override
protected String getFallback() {
return"失败了";
}
}

重新执行调用代码,可以发现返回的内容是“失败了”,证明已经触发了回退。

三、 信号量策略配置

信号量策略配置方法如以下代码所示:

public MyHystrixCommand(String name) {
super ( HystrixCommand . Setter
.Wi thGroupKey(Hystr ixCommandGroupKey .Factory .asKey( “MyGroup”))
. andCommandPropertiesDefaults (
Hystr ixCommandProperties . Setter( )
. withExecut ionIsolationStrategy(
Hystr ixCommandProperties
. ExecutionIsolat ionStrategy . SEMAPHORE
)
)
);
this.name = name;
}

之前在run方法中特意输出了线程名称,通过这个名称就可以确定当前是线程隔离还是信号量隔离。

四、 线程隔离策略配置

系统默认采用线程隔离策略,我们可以通过andThreadPoolPropertiesDefaults配置线程池的一些参数,如以下代码所示:

public MyHystrixCommand(String name) {
super(HystrixCommand.Setter.withGroupKey (
HystrixCommandGroupKey.Factory .asKey( “MyGroup”))
.andCommandPropertiesDefaults (
HystrixCommandProperties.Setter()
.withExecutionIsolationStrategy (
HystrixCommandProperties.ExecutionIsolationStrategy.THREAD
)
) . andThreadPoolPropertiesDefaults (
HystrixThreadPoolProperties. Setter()
. withCoreSize(10 )
. withMaxQueueSize(100)
.withMax. imumSize(100)
)
);
this.name = name ;
}

五、 结果缓存

缓存在开发中经常用到,我们常用Redis这种第三方的缓存数据库来对数据进行缓存处理。Hystrix 中也为我们提供了方法级别的缓存。通过重写getCacheKey来判断是否返回缓存的数据,getCacheKey 可以根据参数来生成,这样同样的参数就可以都用到缓存了。

改造之前的 MyHystrixCommand ,在其中增加 getCacheKey 的重写实现,如以下代码所示:

@verride
protected String getCacheKey() {
return String.valueOf(this.name);
}

在上面的代码中,我们创建对象时传进来的name参数作为缓存的key。

为了证明能够用到缓存,在run方法中加一行输出,在调用多次的情况下,如果控制台只输出了一次,那么可以知道后面的都是走的缓存逻辑,如以下代码所示:

@override
protected String run() {
System.err.print1n(“get data”);
return this.name + “:” + Thread. currentThread().getName();
}

执行main方法,发现报错了:

根据错误提示可以知道,缓存的处理取决于请求的上下文,我们必须初始化Hystrix-RequestContext

改造main方法中的调用代码,初始化HystrixRequestContext,如以下代码所示:

public static void main(String[] args)throws InterruptedException, ExecutionException {
HystrixRequestContext context = HystrixRequestContext. initializeContext();
String result = new MyHystrixCommand(“yinjihuan”).execute();
System.out.println(result);
Futurefuture = new MyHystrixCommand(“yinjihuan”) .queue();
System.out.println(future.get());
context . shutdown() ;
}

改造完之后重写执行main方法,可以做正常运行了,输出结果如下

可以看到只输出一次 get data ,缓存生效。

六、 缓存清除

在上一节中我们学习了如何使用Hystrix来实现数据缓存功能。有缓存必然就有清除缓存的动作,当数据发生变动时,必须将缓存中的数据也更新掉,不然就会产生脏数据的问题。同样,Hystrix 也有清除缓存的功能。

增加一个支持缓存清除的类,如以下代码所示:

public class ClearCacheHystrixCommand extends HystrixCommand {
private final String name ;
private static final HystrixCommandKey GETTER_ KEY =
HystrixCommandKey.Factory . asKey(“MyKey”);
public ClearCacheHystrixCommand (String name) {
super ( HystrixCommand . Setter .withGroupKey ( HystrixCommandGroupKey .
Factory .asKey( “MyGroup” )) . andCommandKey (GETTER_ KEY )
);
this.name = name;
}
public static void fushCache(String name) {
HystrixRequestCache.getInstance ( GETTER_ KEY ,HystrixConcurrencyStrategyDefault. getInstance()). clear (name);
}

@Override
protected String getCacheKey() {
return String.valueOf(this.name);
}

@Override
protected String run() {
System.err.println(“get data”);
return this.name + “:” + Thread.currentThread(). getName();
}
@Override
protected String getFallback() {
return “失败了”;
}
}

flushCache方法就是清除缓存的方法,通过HystrixRequestCache来执行清除操作,根据getCacheKey返回的key来清除。

修改调用代码来验证清除是否有效果,如以下代码所示:

HystrixRequestContext context = HystrixRequestContext.initializeContext();
String result = new ClearCacheHystrixCommand(“yinjihuan”). execute();
System.out.println(result);
ClearCacheHystrixCommand.flushCache(“yinjihuan”);
Future future = new ClearCacheHystrixCommand(“yinjihuan”).queue();
System.out.println( future.get());

执行两次相同的key,在第二次执行之前调用缓存清除的方法,也就是说第二次用不到缓存,输出结果如下:

由上可以看到,输出两次get data,这证明缓存确实被清除了。可以把ClearCache-HystrixCommandflushCache这行代码注释掉再执行一次,就会发现只输出了一次get data,缓存是有效的,输入结果如下:

get data
yinjihuan:hystrix-MyGroup-1
yinjihuan:hystrix-MyGroup-1

七、 合并请求

Hystrix支持将多个请求自动合并为一个请求(见下方代码),利用这个功能可以节省网络开销,比如每个请求都要通过网络访问远程资源。如果把多个请求合并为一个一起执行,将多次网络交互变成一次,则会极大节省开销。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Java)

最后

即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!

我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!
一共有20个知识点专题,分别是:

Dubbo面试专题

JVM面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Java并发面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Kafka面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MongDB面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MyBatis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MySQL面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Netty面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

RabbitMQ面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Redis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Spring Cloud面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

SpringBoot面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

zookeeper面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

常见面试算法题汇总专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

计算机网络基础专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

设计模式专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
**

[外链图片转存中…(img-lGbyW7LR-1713856660150)]

计算机网络基础专题

[外链图片转存中…(img-xZKUabBU-1713856660151)]

设计模式专题

[外链图片转存中…(img-8pZtRO3n-1713856660151)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 25
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值