Hystrix的组件和架构

2023-04-08 11:08:05 浏览数 (2)

Hystrix的组件

Hystrix的组件包括:

1.1 Hystrix命令(Command)

Hystrix命令是服务的调用者,它包含了服务的执行逻辑、熔断器状态等信息。Hystrix命令使用HystrixCommand或HystrixObservableCommand注解进行标注,并通过execute()或observe()方法执行服务调用。

1.2 熔断器(Circuit Breaker)

Hystrix的熔断器是一种状态机,用于判断服务调用是否正常,当服务调用失败或超时时,会自动打开熔断器,避免不必要的服务调用,降低系统的负载和风险。

1.3 线程池(Thread Pool)

Hystrix线程池用于隔离服务调用,将服务调用限制在特定的线程池中,避免因某个服务的故障和延迟而影响整个系统的性能和稳定性。

1.4 请求缓存(Request Cache)

Hystrix的请求缓存可以缓存相同参数的请求结果,避免重复的服务调用,提高系统的性能和效率。

1.5 请求合并(Request Collapser)

Hystrix的请求合并可以将多个相同类型的请求合并成一个请求,从而减少服务调用的次数和延迟,提高系统的性能和效率。

Hystrix的架构

Hystrix的架构包括:

2.1 命令执行流程

Hystrix命令的执行流程如下:

1)判断请求是否应该被缓存,如果是,则从缓存中获取请求结果并返回;

2)如果请求未被缓存,则尝试从线程池中获取线程执行服务调用,如果线程池已满,则将请求丢弃或返回Fallback结果;

3)执行服务调用,并判断服务调用是否成功或超时,如果失败或超时,则打开熔断器并返回Fallback结果;

4)将请求结果写入缓存,并返回结果。

2.2 熔断器状态

Hystrix的熔断器有三种状态:关闭状态、半开状态和打开状态。

1)关闭状态:熔断器处于正常状态,服务调用正常执行,请求不会被熔断器拒绝;

2)半开状态:熔断器已经被打开一段时间后,进入半开状态,可以尝试执行一些服务调用,如果服务调用正常,则熔断器关闭,否则重新进入打开状态;

3)打开状态:熔断器处于打开状态,所有服务调用都会被拒绝,并返回Fallback结果。

2.3 Hystrix监控

Hystrix提供了监控和统计的功能,可以对服务调用的响应时间、成功率、失败率等指标进行实时监控和统计,并通过Hystrix Dashboard和Turbine等工具进行可视化展示和分析。

Hystrix的示例

以下是一个基于Spring Cloud和Hystrix的服务调用示例:

3.1 服务提供者

代码语言:javascript复制
@RestController
public class ProviderController {
  
  @GetMapping("/hello/{name}")
  public String hello(@PathVariable String name) {
    try {
      Thread.sleep(new Random().nextInt(200));
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return "Hello, "   name;
  }
  
}

3.2 服务消费者

代码语言:javascript复制
javaCopy code@RestController
public class ConsumerController {
  
  @Autowired
  private HelloService helloService;
  
  @GetMapping("/hello/{name}")
  public String hello(@PathVariable String name) {
    return helloService.hello(name);
  }
  
}

@FeignClient(name = "provider", fallback = HelloServiceFallback.class)
public interface HelloService {
  
  @GetMapping("/hello/{name}")
  String hello(@PathVariable("name") String name);
  
}

@Component
public class HelloServiceFallback implements HelloService {
  
  @Override
  public String hello(String name) {
    return "Hello, fallback";
  }
  
}

3.3 启动类

代码语言:javascript复制
@SpringBootApplication
@EnableFeignClients
@EnableCircuitBreaker
public class Application {
  
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
  
}

在以上示例中,服务提供者提供了一个/hello/{name}接口,用于返回"Hello, name"的字符串,同时通过Thread.sleep()方法模拟了服务调用的延迟和故障。

服务消费者通过Feign调用服务提供者的接口,同时通过Hystrix实现了服务熔断和Fallback功能。当服务调用失败或超时时,Hystrix会返回fallback的结果,避免服务调用的延迟和故障对系统的影响。

启动类通过@EnableFeignClients和@EnableCircuitBreaker注解启用了Feign和Hystrix的功能。

0 人点赞