Hystrix关于HystrixCommand命令

一 通过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只能发射一次数据。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值