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

Hystrix研究-demo02

程序员文章站 2022-07-15 13:07:14
...

 

 

1、Hystrix示例2

import java.util.concurrent.TimeUnit;

import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import com.netflix.hystrix.HystrixCommandKey;
import com.netflix.hystrix.HystrixCommandProperties;
import com.netflix.hystrix.HystrixThreadPoolKey;

public class CommandHelloWorld2 extends HystrixCommand<String>{
	
	private final String name;

	protected CommandHelloWorld2(String name) {
		super(
				Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("HelloWorldGroup"))  	// 命令分组用于对依赖操作分组,便于统计,汇总等.
				.andCommandPropertiesDefaults(HystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(500)) // 配置依赖超时时间,500毫秒
				.andCommandKey(HystrixCommandKey.Factory.asKey("commandHelloWorld2"))			// HystrixCommondKey工厂定义依赖名称
				.andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("HelloWorldPool"))); 		// 使用HystrixThreadPoolKey工厂定义线程池名称
		this.name = name;
	}
	
	@Override
	protected String getFallback() {
		return "execute Falled";
	}
	
	@Override
	protected String run() throws Exception {
		//sleep 1秒 ,调用会超时
//		TimeUnit.MILLISECONDS.sleep(100);
		TimeUnit.MILLISECONDS.sleep(1000);
		return "Hello " + name + " thread : " + Thread.currentThread().getName();
	}
	
	public static void main(String[] args) throws Exception {

		CommandHelloWorld2 commandHelloWorld2 = new CommandHelloWorld2("test-Fallback");
		String s = commandHelloWorld2.execute();
		System.out.println(" 同步 ====== " + s);
		
		/**
		 * 注意:
		 * 1.除了HystrixBadRequestException异常之外,所有从run()方法抛出的异常都算作失败,并触发降级getFallback()和断路器逻辑。
           2.HystrixBadRequestException用在非法参数或非系统故障异常等不应触发回退逻辑的场景。
           3.每个CommandKey代表一个依赖抽象,相同的依赖要使用相同的CommandKey名称。依赖隔离的根本就是对相同CommandKey的依赖做隔离.
           4.CommandGroup是每个命令最少配置的必选参数,在不指定ThreadPoolKey的情况下,字面值用于对不同依赖的线程池/信号区分
           5.当对同一业务依赖做隔离时使用CommandGroup做区分,但是对同一依赖的不同远程调用如(一个是redis 一个是http),
           	可以使用HystrixThreadPoolKey做隔离区分.最然在业务上都是相同的组,但是需要在资源上做隔离时,可以使用HystrixThreadPoolKey区分.
           	
           6.以下四种情况将触发getFallback调用:
				 1.)run()方法抛出非HystrixBadRequestException异常。
				 2.)run()方法调用超时;
				 3.)熔断器开启拦截调用;
				 4.)线程池/队列/信号量是是否跑满实现getFallback()后,执行命令时遇到以上4中情况将被fallback接管,不会抛出异常或其他。
		 */
	}
}

说明:

1)定义一个类继承HystrixCommand;

2)定义一个构造器,初始化Hystrix相关配置;

    2.1)添加分组;

    2.2)添加依赖默认配置;

    2.3)添加依赖名称;

    2.4)添加线程池名称;

3)run()方法,执行具体的处理逻辑;

    3.1)在初始化中,定义了超时时间为100毫秒,当处理业务超过这个时间,将会调用getFallback()方法;

4)其中getFallback()用来处理run()中执行异常后调用的方法,可用来做容错处理;

 

 

2、以下四种情况将触发getFallback调用:

    1)run()方法抛出非HystrixBadRequestException异常。

    2.)run()方法调用超时;

    3)熔断器开启拦截调用;

    4)线程池/队列/信号量是是否跑满实现getFallback()后,执行命令时遇到以上4中情况将被fallback接管,不会抛出异常或其他。

 

 

3、注意

    1)除了HystrixBadRequestException异常之外,所有从run()方法抛出的异常都算作失败,并触发降级getFallback()和断路器逻辑。

   2)HystrixBadRequestException用在非法参数或非系统故障异常等不应触发回退逻辑的场景。

   3)每个CommandKey代表一个依赖抽象,相同的依赖要使用相同的CommandKey名称。依赖隔离的根本就是对相同CommandKey的依赖做隔离。

   4)CommandGroup是每个命令最少配置的必选参数,在不指定ThreadPoolKey的情况下,字面值用于对不同依赖的线程池/信号区分。

   5)当对同一业务依赖做隔离时使用CommandGroup做区分,但是对同一依赖的不同远程调用如(一个是redis 一个是http), 可以使用HystrixThreadPoolKey做隔离区分.最然在业务上都是相同的组,但是需要在资源上做隔离时,可以使用HystrixThreadPoolKey区分.

 

 

 

 

 

 

 

相关标签: Hystrix