zoukankan      html  css  js  c++  java
  • SpringCloud 进阶之Hystrix(断路器)

    1. Hystrix 断路器

    • Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,
      比如超时,异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分
      布式系统的弹性;
    • "断路器"本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方
      返回一个符合预期的,可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就
      保证了服务调用方的线程不会被长时间,不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

    1.1 服务熔断

    • 熔断机制是应对雪崩效应的一种微服务链路保护机制;
    • 当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回"错误"
      的响应信息;当检测到该节点微服务调用正常后恢复调用链路;

    新建microservicecloud-provider-dept-hystrix-8001

    // 参考 microservicecloud-provider-dept-8001
    
    // pom.xml
    <!-- hystrix -->
    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-hystrix</artifactId>
    </dependency>
    
    
    // application.yml
    eureka:
      client: # 客户端注册进eureka服务列表内
        service-url:
          defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
      instance:
        instance-id: microservicecloud-dept8001-hystrix # 自定义hystrix相关的服务名称信息
        prefer-ip-address: true  # 访问路径可以显示IP地址
    
    
    // 修改DeptController
    @RestController
    public class DeptController {
    
    	@Autowired
    	private DeptService deptService;
    
    	@Autowired
    	private DiscoveryClient client;
    
    	@RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET)
        // 一旦调用服务方法失败并抛出错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法
        @HystrixCommand(fallbackMethod="processHystrix_Get")  
    	public Dept get(@PathVariable("id") Long id) {
            Dept dept = this.deptService.get(id);
    		if(null == dept) {
    			throw new RuntimeException("该ID:"+id+"没有对应的信息");
    		}
    		return dept;
    	}
    
        public Dept processHystrix_Get(@PathVariable("id") Long id) {
    		return new Dept().setDeptno(id).setDname("该ID:"+id+"没有对应的信息,null -- @HystrixCommand")
    				.setDb_source("no this database in MySQL");
    	}
    }
    
    
    // 修改主启动类DeptProvider8001_Hystrix_App并添加新注解@EnableCircuitBreaker
    @SpringBootApplication
    @EnableEurekaClient	// 本服务启动后,自动注册进eureka服务中
    @EnableDiscoveryClient // 服务发现
    @EnableCircuitBreaker // 对Hystrix熔断机制的支持
    public class DeptProvider8001_Hystrix_App {
    
    	public static void main(String[] args) {
    		SpringApplication.run(DeptProvider8001_Hystrix_App.class, args);
    	}
    }
    
    // 测试访问:
    // http://localhost:8082/consumer/dept/get/112
    

    1.2 服务降级

    • 服务降级:整体资源快不够了,忍痛将某些服务先关掉,待渡过难关,再开启回来;
    • 服务降级处理是在客户端实现完成的,与服务端没有关系;
    • 当某个服务熔断之后,服务器将不再被调用,此时客户端可以自己准备一个本地的fallback回调,返回一个缺省值;
    // 修改microservicecloud-api工程
    // 根据已有的DeptClientService接口,新建一个实现了FallbackFactory接口的类DeptClientServiceFallbackFactory
    @Component  // 不要忘记添加
    public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService> {
    
    	@Override
    	public DeptClientService create(Throwable arg0) {
    
    		return new DeptClientService() {
    
    			@Override
    			public Dept get(long id) {
    				return new Dept().setDeptno(id).setDname("该ID:"+id+"没有对应的信息,Consumer客户端提供的降级信息,此刻服务Provider已经关闭")
    						.setDb_source("no this database in MySQL");
    			}
    
    			@Override
    			public List<Dept> list() {
    
    				return null;
    			}
    
    			@Override
    			public boolean add(Dept dept) {
    
    				return false;
    			}
    		};
    	}
    }
    
    // 修改microservicecloud-api工程, DeptClientService接口
    // 在注解@FeignClient中添加 fallbackFactory 属性值
    @FeignClient(value="MICROSERVICECLOUD-DEPT",
    			fallbackFactory=DeptClientServiceFallbackFactory.class)
    public interface DeptClientService {
    
    	@RequestMapping(value="/dept/get/{id}", method= RequestMethod.GET)
    	public Dept get(@PathVariable("id") long id);
    
    	@RequestMapping(value="/dept/list", method= RequestMethod.GET)
    	public List<Dept> list();
    
    	@RequestMapping(value="/dept/add", method= RequestMethod.POST)
    	public boolean add(Dept dept);
    }
    
    // mvn clean
    // mvn install
    
    
    // 修改microservicecloud-consumer-dept-feign 工程
    // application.yml
    feign:
      hystrix:
        enabled: true
    
    // 测试访问:
    // http://localhost:8082/consumer/dept/get/1
    // 然后手动关闭工程:microservicecloud-provider-dept-8001
    

    1.3 服务监控(hystrixDashboard)

    新建工程microservicecloud-consumer-hystrix-dashboard

    // pom.xml
    <!-- hystrix和hystrix-dashboard 相关 -->
    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-hystrix</artifactId>
    </dependency>
    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
    </dependency>
    
    
    // application.yml
    server:
      port: 9001
    
    
    // 主启动类:
    @SpringBootApplication
    @EnableHystrixDashboard
    public class DeptConsumer_DashBoard_App {
    
    	public static void main(String[] args) {
    		SpringApplication.run(DeptConsumer_DashBoard_App.class, args);
    	}
    }
    
    
    // 所有Provider微服务提供类(8001/8002/8003)都需要提供监控依赖配置
    // (8001/8002/8003)pom.xml
    <!-- actuator 监控信息完善 -->
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    
    
    // 启动相关工程
    // microservicecloud-consumer-hystrix-dashboard   // 访问: http://localhost:9001/hystrix
    // 3个Eureka集群
    // microservicecloud-provider-dept-hystrix-8001
        // 访问: http://localhost:8001/dept/get/1
        // 访问: http://localhost:8001/hystrix.stream
    
    

    参考资料:

  • 相关阅读:
    详解JavaScript中的闭包
    Javascript中的apply与call
    JS中for循环变量作用域
    KEEP!
    弹性盒子模型
    JS继承的原理、方式和应用
    js
    JS时间格式和时间戳的相互转换
    Jquery的简单API
    js中判断数组中是否包含某元素的方法
  • 原文地址:https://www.cnblogs.com/linkworld/p/9191547.html
Copyright © 2011-2022 走看看