一、服务熔断了解

1.1 雪崩效应

1.2 熔断器(CircuitBreaker)

1.3 Hystrix特性

二、自定义AOP 实现简单服务熔断

三、Hystrix实现服务熔断

创建项目——hystrix-customer-service

3.1 添加依赖

  1. <!--hystrix 依赖-->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  5. </dependency>

3.2 启用 Hystrix @EnableCircuitBreaker

  1. @EnableDiscoveryClient
  2. @EnableFeignClients
  3. @SpringBootApplication
  4. @EnableCircuitBreaker
  5. public class HystrixCustomerServiceApplication {
  6. public static void main(String[] args) {
  7. SpringApplication.run(HystrixCustomerServiceApplication.class, args);
  8. }
  9. }

3.3 配置文件

  1. feign:
  2. client:
  3. config:
  4. default:
  5. connect-timeout: 500
  6. read-timeout: 500
  7. hystrix.enabled: true

3.4 配置熔断时回调的服务类

  1. @Slf4j
  2. @Component
  3. public class FallbackCoffeeService implements CoffeeService {
  4. @Override
  5. public List<String> coffee() {
  6. log.warn("Fallback to EMPTY menu.");
  7. return Collections.emptyList();
  8. }
  9. }

3.5 在feign中配置hystrix

  1. @FeignClient(name = "waiter-service", contextId = "coffee",
  2. qualifier = "coffeeService",
  3. fallback = FallbackCoffeeService.class)
  4. // 服务提供中spring.application.name配置的名称
  5. //contextId 用于作为Bean的名称,区分不同的FeiginClient
  6. //qualifier: 首选Feign客户端
  7. //fallback: 熔断时选择的客户端
  8. //注意不要在类上添加 @RequestMapping() 注解
  9. public interface CoffeeService {
  10. @GetMapping(value = "/coffee", produces = "application/json")
  11. public List<String> coffee();
  12. }

3.6 测试

由于使用Consul 作为服务发现,需要先启动Consul,先访问 http://localhost:8500/ 查看是否启动Consul 。
然后才启动hystrix-customer-service, 访问http://localhost:8008/getCoffeeMenu , 结果应该返回空数组; 最后,才启动consul-waiter-service 服务, 再访问http://localhost:8008/getCoffeeMenu 查看是否有内容返回

四、熔断监控

4.1 Hystrix Dashboard 单机版

Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数据。

创建项目 hystrix-dashboard

4.1.1 添加依赖
  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
  4. </dependency>

4.1.2 启用 @EnableHystrixDashboard
  1. @SpringBootApplication
  2. @EnableHystrixDashboard
  3. public class HystrixDashboardApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(HystrixDashboardApplication.class, args);
  6. }
  7. }

4.1.3 启动项目访问(端口配置了9090)

image.png

4.1.4 配置项目hystrix-customer-service 的actuator 并启动项目
  1. #management.endpoints.web.exposure.include=health,info,hystrix.stream
  2. management:
  3. endpoints:
  4. health:
  5. show-details: always
  6. web:
  7. exposure:
  8. include: '*'

4.1.5 填入以下链接,并按下Monitor Stream开始监控

image.png

4.2 Turbine 分布式系统监控

创建项目—-hystrix-turbine

4.2.1 添加依赖
  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-turbine</artifactId>
  4. </dependency>

4.2.2 启用@EnableTurbine
  1. @EnableTurbine
  2. @SpringBootApplication
  3. public class HystrixTurbineApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(HystrixTurbineApplication.class, args);
  6. }
  7. }

4.2.3 配置
  1. `server:
  2. port: 8010
  3. turbine:
  4. appConfig: hystrix-customer-service #服务注册中的serviceId列表,表明监控哪些服务
  5. aggregator:
  6. clusterConfig: hystrix-customer-service # 指定聚合哪些集群,多个使用”,”分割,默认为default。可使用http://.../turbine.stream?cluster={clusterConfig之一}访问
  7. #1. clusterNameExpression指定集群名称,默认表达式appName;此时:turbine.aggregator.clusterConfig需要配置想要监控的应用名称;
  8. #2. 当clusterNameExpression: default时,turbine.aggregator.clusterConfig可以不写,因为默认就是default;
  9. #3. 当clusterNameExpression: metadata[‘cluster’]时,假设想要监控的应用配置了eureka.instance.metadata-map.cluster: ABC,则需要配置,同时turbine.aggregator.clusterConfig: ABC
  10. #clusterNameExpression: new String("default")
  11. management:
  12. endpoints:
  13. health:
  14. show-details: always
  15. spring:
  16. cloud:
  17. consul:
  18. discovery:
  19. prefer-ip-address: true
  20. host: 'localhost'
  21. port: 8500

4.2.4 启动项目
  • hystrix-customer-service
  • hystrix-dashboard
  • hystrix-turbine

4.2.5 访问

项目地址

https://github.com/h-dj/SpringCloud-Learning

参考