我是靠谱客的博主 冷傲电灯胆,最近开发中收集的这篇文章主要介绍HystrixRPC保护的原理,HystrixCommand命令的执行方法,java微服务面试题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

08:20:05.488 [hystrix-testThreadPool-1] INFO c.c.d.h.HttpGetterCommand - 第1次请求-> begin…

08:20:08.698 [hystrix-testThreadPool-1] INFO c.c.d.h.HttpGetterCommand - 第1次请求-> end!

08:20:08.708 [main] INFO c.c.d.h.CommandTester - 第1次请求的结果:{“status”:200,“msg”:“操作成功”,“data”:{“hello”:“world”}}

08:20:08.710 [hystrix-testThreadPool-2] INFO c.c.d.h.HttpGetterCommand - 第2次请求-> begin…

08:20:10.741 [hystrix-testThreadPool-2] INFO c.c.d.h.HttpGetterCommand - 第2次请求-> end!

08:20:10.744 [main] INFO c.c.d.h.CommandTester - 第2次请求的结果:{“status”:200,“msg”:“操作成功”,“data”:{“hello”:“world”}}

08:20:10.751 [hystrix-testThreadPool-3] INFO c.c.d.h.HttpGetterCommand - 第3次请求-> begin…

08:20:12.766 [hystrix-testThreadPool-3] INFO c.c.d.h.HttpGetterCommand - 第3次请求-> end!

08:20:12.767 [main] INFO c.c.d.h.CommandTester - 第3次请求的结果:{“status”:200,“msg”:“操作成功”,“data”:{“hello”:“world”}}

//省略后面的重复请求输出

从结果中可以看出,Hystrix会从线程池中取一个线程来执行HttpGetterCommand命令的run()方法,命令执行过程中,main线程一直在等待其返回值。

queue()方法

=========

HystrixCommand的queue()方法以异步非阻塞方式执行run()方法,该方法直接返回一个Future对象。可通过Future.get()拿到run()的返回结果,但Future.get()是阻塞执行的。

HystrixCommand的queue()方法的使用示例程序如下:

package com.crazymaker.demo.hystrix;

@Slf4j

public class HystryxCommandExcecuteDemo

{

@Test

public void testQueue() throws Exception {

/**

*使用统一配置

*/

HystrixCommand.Setter setter = getSetter(

“group-1”,

“testCommand”,

“testThreadPool”);

List<Future> flist = new LinkedList<>();

/**

*同时发起5个异步的请求

*/

for (int i = 0; i < COUNT; i++) {

Future future = new HttpGetterCommand(TEST_URL, setter).queue();

flist.add(future);

}

/**

*统一获取异步请求的结果

*/

Iterator<Future> it = flist.iterator();

int count = 1;

while (it.hasNext()) {

Future future = it.next();

String result = future.get(10, TimeUnit.SECONDS);

log.info(“第{}次请求的结果:{}”, count++, result);

}

Thread.sleep(Integer.MAX_VALUE);

}

}

运行这个示例程序前需要启动demo-provider实例,确保它的REST接口/api/demo/hello/v1可以正常访问。执行这个示例程序,主要的输出结果如下:

08:30:54.618 [hystrix-testThreadPool-2] INFO c.c.d.h.HttpGetterCommand - 第3次请求-> begin…

08:30:54.618 [hystrix-testThreadPool-1] INFO c.c.d.h.HttpGetterCommand - 第4次请求-> begin…

08:30:54.618 [hystrix-testThreadPool-4] INFO c.c.d.h.HttpGetterCommand - 第5次请求-> begin…

08:30:54.618 [hystrix-testThreadPool-3] INFO c.c.d.h.HttpGetterCommand - 第2次请求-> begin…

08:30:54.618 [hystrix-testThreadPool-5] INFO c.c.d.h.HttpGetterCommand - 第1次请求-> begin…

08:30:58.358 [hystrix-testThreadPool-2] INFO c.c.d.h.HttpGetterCommand - 第3次请求-> end!

08:30:58.358 [hystrix-testThreadPool-3] INFO c.c.d.h.HttpGetterCommand - 第2次请求-> end!

08:30:58.358 [hystrix-testThreadPool-1] INFO c.c.d.h.HttpGetterCommand - 第4次请求-> end!

08:30:58.358 [hystrix-testThreadPool-4] INFO c.c.d.h.HttpGetterCommand - 第5次请求-> end!

08:30:58.358 [hystrix-testThreadPool-5] INFO c.c.d.h.HttpGetterCommand - 第1次请求-> end!

08:30:58.364 [m

【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】

浏览器打开:qq.cn.hn/FTf 免费领取

ain] INFO c.c.d.h.CommandTester - 第1次请求的结果:{“status”:200,“msg”:“操作成功”,“data”:{“hello”:“world”}}

08:30:58.365 [main] INFO c.c.d.h.CommandTester - 第2次请求的结果:{“status”:200,“msg”:“操作成功”,“data”:{“hello”:“world”}}

08:30:58.365 [main] INFO c.c.d.h.CommandTester - 第3次请求的结果:{“status”:200,“msg”:“操作成功”,“data”:{“hello”:“world”}}

08:30:58.365 [main] INFO c.c.d.h.CommandTester - 第4次请求的结果:{“status”:200,“msg”:“操作成功”,“data”:{“hello”:“world”}}

08:30:58.365 [main] INFO c.c.d.h.CommandTester - 第5次请求的结果:{“status”:200,“msg”:“操作成功”,“data”:{“hello”:“world”}}

实际上,前面介绍的HystrixCommand的execute()方法是在内部使用queue().get()的方式完成同步调用的。

observe()方法

===========

HystrixCommand的observe()方法会返回一个响应式编程Observable主题,可以为该主题对象注册上Subscriber观察者回调实例,或者注册上Action1不完全回调实例来响应式处理命令的执行结果。

HystrixCommand的observe()方法的使用示例程序如下:

package com.crazymaker.demo.hystrix;

@Slf4j

public class HystryxCommandExcecuteDemo

{

@Test

public void testObserve() throws Exception

{

/**

*使用统一配置类

*/

HystrixCommand.Setter setter = SetterDemo.buildSetter(

“group-1”,

“testCommand”,

“testThreadPool”);

Observable observe = new HttpGetterCommand(HELLO_TEST_URL, setter).observe();

Thread.sleep(1000);

log.info(“订阅尚未开始!”);

//订阅3次

observe.subscribe(result -> log.info(“onNext result={}”, result),

error -> log.error(“onError error={}”, error));

observe.subscribe(result -> log.info(“onNext result ={}”, result),

error -> log.error(“onError error={}”, error));

observe.subscribe(

result -> log.info(“onNext result={}”, result),

error -> log.error(“onError error ={}”, error),

() -> log.info(“onCompleted called”));

Thread.sleep(Integer.MAX_VALUE);

}

}

运行这个示例程序前需要启动demo-provider实例,确保其REST接口/api/demo/hello/v1可以正常访问。执行这个示例程序,主要的输出结果如下:

[hystrix-testThreadPool-1] INFO c.c.d.h.HttpGetterCommand - req1 begin…

[main] INFO c.c.d.h.HystryxCommandExcecuteDemo - 订阅尚未开始!

[hystrix-testThreadPool-1] INFO c.c.d.h.HttpGetterCommand - req1 end: {“respCode”:0,“respMsg”:“操作成功”,“datas”:{“hello”:"wor

[hystrix-testThreadPool-1] INFO c.c.d.h.HystryxCommandExcecuteDemo - onNext result=req1:{“respCode”:0,“respMsg”:“操作成功”,"dat

[hystrix-testThreadPool-1] INFO c.c.d.h.HystryxCommandExcecuteDemo - onNext result =req1:{“respCode”:0,“respMsg”:“操作成功”,"da

[hystrix-testThreadPool-1] INFO c.c.d.h.HystryxCommandExcecuteDemo - onNext result=req1:{“respCode”:0,“respMsg”:“操作成功”,"dat

[hystrix-testThreadPool-1] INFO c.c.d.h.HystryxCommandExcecuteDemo - onCompleted called

通过执行结果可以看出,如果HystrixCommand的run()方法执行成功,就会触发订阅者的onNext()和onCompleted()回调方法,如果执行异常,就会触发订阅者的onError()回调方法。

调用HystrixCommand的observe()方法会返回一个热主题(Hot Observable)。什么是热主题呢?就是无论主题是否存在观察者订阅,都会自动触发执行它的run()方法。另外还有一点,observe()方法所返回的主题可以重复订阅。

toObservable()方法

=================

HystrixCommand的toObservable()方法会返回一个响应式编程Observable主题。同样可以为该主题对象注册上Subscriber观察者回调实例,或者注册上Action1不完全回调实例,来响应式处理命令的执行结果。不过,与observe()返回的主题不同,Observable主题返回的是冷主题,并且只能被订阅一次。

HystrixCommand的toObservable()方法的使用示例程序如下:

package com.crazymaker.demo.hystrix;

@Slf4j

public class HystryxCommandExcecuteDemo

{

@Test

public void testToObservable() throws Exception

{

/**

*使用统一配置类

*/

HystrixCommand.Setter setter = SetterDemo.buildSetter(

“group-1”,

“testCommand”,

“testThreadPool”);

for (int i = 0; i < COUNT; i++)

{

Thread.sleep(2);

new HttpGetterCommand(HELLO_TEST_URL, setter)

.toObservable()

.subscribe(result -> log.info(“result={}”, result),

error -> log.error(“error={}”, error)

);

}

Thread.sleep(Integer.MAX_VALUE);

}

}

运行这个示例前需要启动demo-provider实例,确保它的REST接口/api/demo/hello/v1可以正常访问。执行这个示例程序,主要的输出结果如下:

最后

以上就是冷傲电灯胆为你收集整理的HystrixRPC保护的原理,HystrixCommand命令的执行方法,java微服务面试题的全部内容,希望文章能够帮你解决HystrixRPC保护的原理,HystrixCommand命令的执行方法,java微服务面试题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部