专注于Java、Golang、软件架构、项目管理

Back

hystrix在微服务中扮演重要作用,其实现了隔离、熔断、降级等重要组件

但在spring cloud中,常与feign搭配起来使用。故本文仅包含其余feign整合后的相关源码。

hystrix资源隔离#

共有两种:线程池的资源隔离,信号量的资源隔离

线程池:适合绝大多数的场景,99%的,线程池,对依赖服务的网络请求的调用和访问,timeout这种问题

信号量:适合对内部的一些比较复杂的业务逻辑的访问,但是像这种访问,系统内部的代码,其实不涉及任何的网络请求,那么只要做信号量的普通限流就可以了,因为不需要去捕获timeout类似的问题。但算法+数据结构的效率不是太高,并发量突然太高,因为这里稍微耗时一些,导致很多线程卡在这里的话,不太好,所以进行一个基本的资源隔离和访问,避免内部复杂的低效率的代码,导致大量的线程被hang住

feign与hystrix整合的核心原理

feign集成hystrix以后,HystrixFeign.Builder则被替换为HystrixFeign.Builder。以支持hystrix相关组件

HystrixInvocationHandler重要代码

@Override
public HystrixCommand.Setter create(Target<?> target, Method method) {
  String groupKey = target.name();
  String commandKey = Feign.configKey(target.type(), method);
  return HystrixCommand.Setter
      .withGroupKey(HystrixCommandGroupKey.Factory.asKey(groupKey))
      .andCommandKey(HystrixCommandKey.Factory.asKey(commandKey));
}
java

一个接口一个线程池即groupKey,一个方法一个线程即commandKey

hystrixCommand.execute()中源码大量用到了rxjava来实现,暂时不太熟悉rxjava。后续填坑~

大致的逻辑是,hystrix内部实现了一个线程池来管理接口的调用,实现熔断限流降级等功能。

hystrixCommand.execute() 底层返回一个future.get()的对象,实现了异步调用