@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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Java)
最后
即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!
我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!
一共有20个知识点专题,分别是:
Dubbo面试专题
JVM面试专题
Java并发面试专题
Kafka面试专题
MongDB面试专题
MyBatis面试专题
MySQL面试专题
Netty面试专题
RabbitMQ面试专题
Redis面试专题
Spring Cloud面试专题
SpringBoot面试专题
zookeeper面试专题
常见面试算法题汇总专题
计算机网络基础专题
设计模式专题
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
**
[外链图片转存中…(img-lGbyW7LR-1713856660150)]
计算机网络基础专题
[外链图片转存中…(img-xZKUabBU-1713856660151)]
设计模式专题
[外链图片转存中…(img-8pZtRO3n-1713856660151)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!