Hystrix注意项
@HystrixCommand修饰的方法为什么不能再private上?
代理机制的要求 Spring Cloud Netflix Hystrix 使用代理来实现对方法的拦截和熔断逻辑的添加。 对于基于代理的 AOP(Aspect - Oriented Programming)实现,代理需要能够访问被代理方法的元信息,包括方法签名等内容。 如果将@HystrixCommand标注在private方法上,代理无法访问private方法,因为private方法的访问权限仅限于类内部。 这就导致 Hystrix 无法为这样的private方法创建代理,从而不能正确地实现熔断、降级等功能。 动态代理的限制 Spring Cloud Hystrix 通常是基于动态代理(如 Java 的 JDK 动态代理或 CGLIB 动态代理)来实现的。 JDK 动态代理要求被代理的方法必须是定义在接口中的方法,并且通过接口来进行代理。 private方法不能在接口中定义,所以 JDK 动态代理无法对private方法进行操作。 即使是 CGLIB 动态代理,虽然它可以代理类而不是接口,但是它也需要能够访问方法的元信息来生成代理类。 private方法的访问限制使得 CGLIB 无法有效地对其进行代理,从而不能应用@HystrixCommand的相关功能。
@HystrixCommand 注解参数解释
/**
* 此注解用于指定某些应作为Hystrix命令进行处理的方法。
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface HystrixCommand {
/**
* 命令组键(group key)用于将多个命令分组,例如用于报告、告警、仪表盘展示或者区分团队/库的所属关系等用途。
* <p/>
* 默认值 => 被注解方法的运行时类名。
*/
String groupKey() default "";
/**
* Hystrix命令键(command key)。
* <p/>
* 默认值 => 被注解方法的名称。例如:
* <code>
* ...
* @HystrixCommand
* public User getUserById(...)
* ...
* 命令名称将会是:'getUserById'
* </code>
*
* @return 命令键(command key)
*/
String commandKey() default "";
/**
* 线程池键(thread-pool key)用于表示一个HystrixThreadPool,以便进行监控、指标发布、缓存以及其他类似用途。
*/
String threadPoolKey() default "";
/**
* 指定用于处理回退(fallback)逻辑的方法。
* 回退方法应定义在使用了HystrixCommand注解的同一个类中。
* 并且回退方法的签名应与作为Hystrix命令调用的方法签名相同。
* 例如:
* <code>
* @HystrixCommand(fallbackMethod = "getByIdFallback")
* public String getById(String id) {...}
*
* private String getByIdFallback(String id) {...}
* </code>
*/
String fallbackMethod() default "";
/**
* 指定命令属性。
*/
HystrixProperty[] commandProperties() default {};
/**
* 指定线程池属性。
*/
HystrixProperty[] threadPoolProperties() default {};
/**
* 定义应该被忽略的异常。
* 如果 raiseHystrixExceptions 包含 RUNTIME_EXCEPTION,这些异常可以选择性地被包装在HystrixRuntimeException中。
*/
Class<? extends Throwable>[] ignoreExceptions() default {};
/**
* 指定用于执行Hystrix可观察命令(observable command)的模式。
* 更多信息请参见 {@link ObservableExecutionMode}。
*/
ObservableExecutionMode observableExecutionMode() default ObservableExecutionMode.EAGER;
/**
* 当包含 RUNTIME_EXCEPTION时,任何未被忽略的异常都会被包装在HystrixRuntimeException中。
*/
HystrixException[] raiseHystrixExceptions() default {};
/**
* 为命令指定默认的回退方法。如果同时指定了 {@link #fallbackMethod} 和 {@link #defaultFallback} 方法,
* 则会使用特定的那个方法。
* 注意:默认回退方法不能有参数,其返回类型应与命令的返回类型兼容。
*/
String defaultFallback() default "";
}
groupKey
用途:指定用于执行此命令的线程池的键。通过指定不同的线程池,可以隔离不同类型的命令,防止一个命令的故障影响到其他命令。例如,将高优先级的命令放在一个线程池,低优先级的命令放在另一个线程池。
@HystrixCommand(threadPoolKey = "highPriorityThreadPool", groupKey = "userService")
public User getUserById(Long id) {
// 调用远程服务获取用户信息
return userServiceClient.getUserById(id);
}
fallbackMethod
@HystrixCommand(fallbackMethod = "getUserByIdFallback", groupKey = "userService")
public User getUserById(Long id) {
// 调用远程服务获取用户信息
return userServiceClient.getUserById(id);
}
public User getUserByIdFallback(Long id) {
// 返回一个默认用户或者空用户对象
return new User();
}
commandProperties
本文来自博客园,作者:余生请多指教ANT,转载请注明原文链接:https://www.cnblogs.com/wangbiaohistory/p/18656416

浙公网安备 33010602011771号