zoukankan      html  css  js  c++  java
  • SpringCloud Hystrix

    ⒈Hystrix是什么?

      Hystrix使一个用于处理分布式系统的延迟和容错的开源库。在分布式系统里,许多依赖不可避免的因服务超时、服务异常等导致调用失败,Hystrix能够保证在一个依赖出现问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。

    ⒉断路器&服务熔断

      “断路器”本身使一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似于熔断保险丝),向服务调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要的占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

      熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回“错误”的响应信息,当检测到该节点的微服务调用响应正常后恢复调用链路。在SpringCloud框架里,熔断机制通过Hystrix实现,Hystrix会监控微服务间调用的状况,当失败的调用达到一定的阈值(默认是5秒内20次调用失败),就会启动熔断机制。

    ⒊示例

      ①在服务提供者项目中添加Hystrix starter依赖 

     1         <dependency>
     2             <groupId>org.springframework.boot</groupId>
     3             <artifactId>spring-boot-starter-web</artifactId>
     4         </dependency>
     5         <dependency>
     6             <groupId>org.springframework.cloud</groupId>
     7             <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
     8         </dependency>
     9         <dependency>
    10             <groupId>org.springframework.cloud</groupId>
    11             <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    12         </dependency>

      ②在服务提供者项目中对控制器中的Action方法指定熔断调用方法

     1 package cn.coreqi.controller;
     2 
     3 import cn.coreqi.entities.User;
     4 import cn.coreqi.service.UserService;
     5 import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
     6 import org.springframework.beans.factory.annotation.Autowired;
     7 import org.springframework.web.bind.annotation.GetMapping;
     8 import org.springframework.web.bind.annotation.RestController;
     9 import java.util.List;
    10 
    11 @RestController
    12 public class UserController {
    13     @Autowired
    14     private UserService userService;
    15 
    16     @GetMapping("/users")
    17     @HystrixCommand(fallbackMethod = "getUsersFallback")    //一旦服务消费者远程调用该方法失败并抛出错误信息后,Hystrix会自动调用@HystrixCommand注解fallbackMethod属性中标注的方法返回
    18     public List<User> getUsers(){
    19         throw new NullPointerException();
    20         //return userService.getList();
    21     }
    22 
    23     public List<User> getUsersFallback(){
    24         return null;
    25     }
    26 }

      ③在主程序启动类上添加@EnableCircuitBreaker注解

     1 package cn.coreqi;
     2 
     3 import org.springframework.boot.SpringApplication;
     4 import org.springframework.boot.autoconfigure.SpringBootApplication;
     5 import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
     6 import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
     7 
     8 @SpringBootApplication
     9 @EnableEurekaClient //启用Eureka客户端功能
    10 @EnableCircuitBreaker   //对Hystrix熔断机制的支持
    11 public class SpringbootcloudserviceproviderApplication {
    12 
    13     public static void main(String[] args) {
    14         SpringApplication.run(SpringbootcloudserviceproviderApplication.class, args);
    15     }
    16 
    17 }

    ⒋服务降级

      服务器整体资源快不够了,将某些服务先关掉,待渡过难关再开启回来,服务降级处理是在服务消费者实现完成的,与服务提供者没有关系

    ⒌示例

      ①在服务消费者配置文件中开启  

    1 feign.hystrix.enabled=true

      ②编写回退方法

     1 package cn.coreqi.fallbackfactory;
     2 
     3 import cn.coreqi.entities.User;
     4 import cn.coreqi.service.UserService;
     5 import feign.hystrix.FallbackFactory;
     6 import org.springframework.stereotype.Component;
     7 
     8 import java.util.ArrayList;
     9 import java.util.List;
    10 
    11 @Component
    12 public class UserServiceFallbackFactory implements FallbackFactory<UserService> {
    13     @Override
    14     public UserService create(Throwable throwable) {
    15         return new UserService() {
    16             @Override
    17             public void addUser(User user) {
    18 
    19             }
    20 
    21             @Override
    22             public void delById(Integer id) {
    23 
    24             }
    25 
    26             @Override
    27             public void modifyUser(User user) {
    28 
    29             }
    30 
    31             @Override
    32             public User getById(Integer id) {
    33                 return null;
    34             }
    35 
    36             @Override
    37             public List<User> getList() {
    38                 List<User> userList = new ArrayList<>();
    39                 userList.add(new User(0,"Error","Error",0));
    40                 return userList;
    41             }
    42         };
    43     }
    44 }

      ③在@FeignClient注解中指定fallbackFactory的属性值

     1 package cn.coreqi.feign;
     2 
     3 import cn.coreqi.entities.User;
     4 import cn.coreqi.fallbackfactory.UserServiceFallbackFactory;
     5 import org.springframework.cloud.openfeign.FeignClient;
     6 import org.springframework.web.bind.annotation.GetMapping;
     7 
     8 import java.util.List;
     9 
    10 @FeignClient(value = "USER-PROVIDER",fallbackFactory = UserServiceFallbackFactory.class)   //指定微服务实例名称
    11 public interface UserFeignClient {
    12     @GetMapping("/users")   //指定调用微服务的服务地址
    13     public List<User> getList();
    14 }

    ⒍服务监控-Hystrix Dashboard

      Hystrix提供了准实时的调用监控(Hystrix Dashboard),Hystrix 会持续的记录所有通过Hystrix 发起请求的执行信息,并以统计报表和图形的形式展示给用户,Netfilx通过hystrix-metrics-event-stream项目实现了对以上指标的监控,Spring Cloud也提供了对Hystrix Dashboard的整合,对监控内容转化为可视化界面。

    7示例

      ①新建监控项目添加依赖

     1         <dependency>
     2             <groupId>org.springframework.boot</groupId>
     3             <artifactId>spring-boot-starter-web</artifactId>
     4         </dependency>
     5         <dependency>
     6             <groupId>org.springframework.cloud</groupId>
     7             <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
     8         </dependency>
     9         <dependency>
    10             <groupId>org.springframework.cloud</groupId>
    11             <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
    12         </dependency>

      ②配置文件中指定运行端口 

    1 server.port=9001

      ③主程序启动类添加@EnableHystrixDashboard注解

     1 package cn.coreqi;
     2 
     3 import org.springframework.boot.SpringApplication;
     4 import org.springframework.boot.autoconfigure.SpringBootApplication;
     5 import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
     6 
     7 @SpringBootApplication
     8 @EnableHystrixDashboard
     9 public class HystrixDashboardApplication {
    10 
    11     public static void main(String[] args) {
    12         SpringApplication.run(HystrixDashboardApplication.class, args);
    13     }
    14 
    15 }

      ④对所有需要监控的服务提供者项目添加以下依赖

    1         <dependency>
    2             <groupId>org.springframework.boot</groupId>
    3             <artifactId>spring-boot-actuator</artifactId>
    4         </dependency>

      ⑤访问监控项目web管理地址

        http://localhost:9001/hystrix

  • 相关阅读:
    Hibernate 多表查询结果集的处理
    is not mapped [from错误
    input输入框内,焦点后文字消失;placeholder 与 value 区别
    滚动文字JS
    安装mysql和xampp遇到问题
    python数据结构总结
    翻译二--创建一个Web测试计划
    jmeter元件执行顺序及简介
    testlink for windows 安装
    postman使用
  • 原文地址:https://www.cnblogs.com/fanqisoft/p/10484825.html
Copyright © 2011-2022 走看看