Hystrix关于HystrixCommand命令
程序员文章站
2024-03-20 22:15:04
...
一 通过HystrixCommand实现
它用来封装具体的依赖服务调用逻辑,可以通过继承的方式来实现。
public class CommandHelloWorld extends HystrixCommand<String> {
private final String name;
public CommandHelloWorld(String name) {
super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
this.name = name;
}
@Override
protected String run() {
// a real example would do work like a network call here
return "Hello " + name + "!";
}
}
通过上面实现的CommandHelloWorld,既可以实现请求的同步执行也可以实现异步执行。
同步执行示例:
String s = new CommandHelloWorld("World").execute();
异步执行示例:
Future<String> fs = new CommandHelloWorld("World").queue();
String s = fs.get();
二 通过注解实现实战
1 代码
package com.didispace.web;
import java.util.concurrent.ExecutionException;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.command.AsyncResult;
import org.springframework.stereotype.Service;
import java.util.concurrent.Future;
/**
* 用@HystrixCommand的方式来实现
*/
@Service
public class UserServiceCommand {
/**
* 同步的方式。
* fallbackMethod定义降级
*/
@HystrixCommand(fallbackMethod = "helloFallback")
public String getUserId(String name) {
int i = 1/1; //此处把除数改为零抛异常,测试服务降级
return "你好:" + name;
}
public String helloFallback(String name) {
return "error";
}
@HystrixCommand(fallbackMethod = "getUserNameError")
public Future<String> getUserName(final Long id) throws InterruptedException, ExecutionException {
return new AsyncResult<String>() {
@Override
public String invoke() {
int i = 1/1;//此处把除数改为零抛异常,测试服务降级
return "小明:" + id;
}
@Override
public String get() {
return invoke();
}
};
}
public String getUserNameError(Long id) {
return "faile";
}
}
class UserServiceCommandTest2 {
private UserServiceCommand userServiceCommand = new UserServiceCommand();
/**
* 测试同步
*/
public void testGetUserId() {
System.out.println("=================" + userServiceCommand.getUserId("lisi"));
}
/**
* 测试异步
*/
public void testGetUserName() throws ExecutionException, InterruptedException {
System.out.println("=================" + userServiceCommand.getUserName(30L).get());
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
UserServiceCommandTest2 userServiceCommandTest2 = new UserServiceCommandTest2();
userServiceCommandTest2.testGetUserId();
userServiceCommandTest2.testGetUserName();
}
}
2 执行结果
=================你好:lisi
=================小明:30
三 说明
虽然HystrixCommand命令具备了observe()和toObservable()的功能,但是它的实现有一定的局限性,它返回的Observable只能发射一次数据。
上一篇: Windows环境下安装Opencv-python
下一篇: 微服务架构-eureka
推荐阅读
-
Hystrix关于HystrixCommand命令
-
关于appium-doctor 不是内部命令 博客分类: appium appium-doctor
-
关于appium-doctor 不是内部命令 博客分类: appium appium-doctor
-
【Shell】关于shell脚本中执行cd命令无效的分析
-
Spring Cloud Hystrix入门和Hystrix命令原理分析
-
Spring Cloud Hystrix入门和Hystrix命令原理分析
-
关于MYSQL 远程登录的授权方法 命令
-
关于ubuntu中mysqldump命令无法使用的问题
-
关于数据库命令操作的9篇文章推荐
-
mysql小误区关于set global sql_slave_skip_counter=N命令的迷惑_MySQL