欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

相关标签: Hystrix