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