Hystrix简介

是由netflix开源的一个延迟或容错库,用于隔离访问远程系统、服务、或第三方库,防止级联失败,从而提升系统的容错性和可用性,实现方式如下:

包裹请求

使用HystrixCommand或HystrixobservableCommand包裹对依赖的调用逻辑,每一个命令都在独立的线程中执行。

跳闸机制

当某服务的错误率超过一定的阈值,Hystrix可以手动或自动的跳闸,停止请求该服务一段时间。

资源隔离

Hystrix为每一个依赖都维护了一个小型线程池(或信号量)如果该线程已满,发往该依赖的请求就会被立即拒绝,而不是排队等待,从而加速了失败判定。

监控

Hystrix可以近乎实时的监控运行指标和配置的变化,例如成功、失败、超时、以及被拒绝的请求等等。

回退机制

当请求失败、超时、被拒绝,或当断路器被打开的时候,执行回退逻辑。回退逻辑可有开发人员自行提供。

自我修复

断路器打开和一段时间后,会自动进入"半开"状态。正常情况下关闭-------->请求失败率达到阈值则打开,不再请阿牛依赖的服务------->一段时间后半开,允许一个请求访问依赖的服务,若成功则关闭断路器。

首次调用其他服务时直接访问量回退逻辑 二次访问时才正常访问

原有程序如下:

package com.xinq.controller;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.xinq.entity.User;@RestController
public class MoviesController {private static final Logger LOGGER = LoggerFactory.getLogger(MoviesController.class);@Autowiredpublic RestTemplate restTemplate;@Autowiredpublic LoadBalancerClient loadBalancerClient;//指定请求失败或超时的回退逻辑@HystrixCommand(fallbackMethod = "fiindByIdFallback")@GetMapping("/user/{id}")public User findById(@PathVariable Long id) {return this.restTemplate.getForObject("http://microservice-provider-user/" + id, User.class);}@GetMapping("/log-instance")public void logUserInstance(){ServiceInstance serviceInstance = this.loadBalancerClient.choose("microservice-provider-user");LOGGER.info("{}:{}:{}",serviceInstance.getServiceId(),serviceInstance.getHost(),serviceInstance.getPort());}public User fiindByIdFallback(Long id){User user = new User();user.setName("默认用户");user.setId(-1L);return user;}
}

修复后:添加了commandProperties的超时时间

package com.xinq.controller;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.xinq.entity.User;@RestController
public class MoviesController {private static final Logger LOGGER = LoggerFactory.getLogger(MoviesController.class);@Autowiredpublic RestTemplate restTemplate;@Autowiredpublic LoadBalancerClient loadBalancerClient;//指定请求失败或超时的回退逻辑@HystrixCommand(fallbackMethod = "fiindByIdFallback",commandProperties = {//设置超时时间  超过则执行回退逻辑@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value="5000")})@GetMapping("/user/{id}")public User findById(@PathVariable Long id) {return this.restTemplate.getForObject("http://microservice-provider-user/" + id, User.class);}@GetMapping("/log-instance")public void logUserInstance(){ServiceInstance serviceInstance = this.loadBalancerClient.choose("microservice-provider-user");LOGGER.info("{}:{}:{}",serviceInstance.getServiceId(),serviceInstance.getHost(),serviceInstance.getPort());}public User fiindByIdFallback(Long id){User user = new User();user.setName("默认用户");user.setId(-1L);return user;}
}

具体Hystrix的参数详解,可参考:https://blog.csdn.net/u013889359/article/details/80118884

关于Hystrix整合ribbon调用其他服务时 首次进入回退相关推荐

  1. 实现在GET请求下调用WCF服务时传递对象(复合类型)参数

    WCF实现RESETFUL架构很容易,说白了,就是使WCF能够响应HTTP请求并返回所需的资源,如果有人不知道如何实现WCF支持HTTP请求的,可参见我之前的文章<实现jquery.ajax及原 ...

  2. Java中调用FTP服务时inputStream获取一直为null

    问题描述:Java调用FTP服务时,已成功登录到了FTP服务中,文件路径中无中文字符,当根据文件路径获取 输入流inputStream时,inputStream一直为null BufferedRead ...

  3. 调用异步服务时的超时处理

    主线程调用异步服务后,通过设定主线程的等待时间来进行超时处理. Demo如下: AsyncTask.cs  1 using System;  2 using System.Threading.Task ...

  4. springcloud 子项目怎么导入_使用eclipse一步一步创建SpringCloud项目(二)—— 使用feign和ribbon调用微服务...

    一.创建服务提供者service-hi 1.创建子项目方法类似eureka,略 2.修改pom文件,主要是添加jar包 4.0.0 com.landcode land 1.0.0-SNAPSHOT l ...

  5. 调用方法[manageapp]时发生异常_探讨通过Feign配合Hystrix进行调用时异常的处理

    原文作者作者:任聪 前言:此文所述处理方式为本人在实践过程中研究分析得出的一种解决方案. 本文不仅希望能为 SC 学习者提供一种如题问题的一种解决方案,并且希望通过本文引出各位 SC 的朋友对如题问题 ...

  6. Spring Cloud Alibaba 服务消费者调用 nacos 服务报错:java.net.UnknownHostException: xxx

    目录 1. 服务消费者启动类 1.1. 服务消费者 controller 2. 服务提供者启动类 2.1. 服务提供者 controller 3. 服务报错 4. nacos 信息 5. 解决思路 5 ...

  7. HSF 入门-发布和调用hsf服务

    原文:http://songpo-ath-taobao-com.iteye.com/blog/1405665 如何将Spring bean对外发布,以供远程调用已有一个名称为HelloWorld的Sp ...

  8. ajax调用第三方web服务,js调用soapWebService服务

    js调用soapWebService服务 什么是 SOAP? SOAP 指简易对象访问协议 SOAP 是一种通信协议 SOAP 用于应用程序之间的通信 SOAP 是一种用于发送消息的格式 SOAP 被 ...

  9. 通过数据库存储过程调用Web服务的办法

    Web服务概览 Web服务,从广义而言,就是在两个应用或电子设备之间通过万维网通信的方法.Web服务有两种类型:简单对象访问协议(SOAP)以及表述性状态转移(REST). SOAP为基于XML的消息 ...

最新文章

  1. 如何在Git中克隆单个分支?
  2. 多分类问题中每一类的Precision-Recall Curve曲线以及ROC的Matlab画法
  3. nasa数据库cm1数据集_获取下一个地理项目的NASA数据
  4. struct sockaddr_nl 结构体 由来、含义以及使用——获取Linux路由表
  5. Redis 支持的数据类型
  6. mysql取消外键限制_mysql怎么取消外键限制(约束)?
  7. Atitit 常用数据类型有哪些 目录 1.1. 数值类型 整数 小数 自增整数 1 1.2. 货币类型 1 1.3. 字符类型 字符串 2 1.4. 日期/时间类型 时间戳 2 1.5. Ur
  8. 【语音编辑】基于matlab语音编辑【含Matlab源码 539期】
  9. Ubuntu使用总结二
  10. 阿帕奇服务器文件上传,windows基于阿帕奇+PHP服务器,实现vc++文件上传功能
  11. 1stopt(应用集锦)
  12. 我的世界刷猪人塔java版_我的世界僵尸猪人刷怪塔制作思路 猪人塔介绍
  13. 人民币大写的正确写法(开票据事项)
  14. 揭开神秘的莫比乌斯环异形创意LED显示屏的柔性显示之美。
  15. 蛋白质结构数据预处理基础(个人笔记)
  16. 巴特勒船长-百年一遇的男人
  17. 解决word转PDF文件时图片位置改变和字体格式改变的问题
  18. Unity3D Content Size Fitter的坑
  19. 解决Android Studio Gradle慢的方法
  20. 城市代码(weather.com)[转]

热门文章

  1. 2021朋友圈都在传的10本书,找到了
  2. STM32 keyboard USB HID键盘功能的实现
  3. visitor 模式
  4. InteliJ IDEA2018.2.1X64 破解 使用
  5. 优先级倒挂(priority inversion)
  6. 编译错误及解决方案汇总
  7. TransTrack: Multiple Object Tracking with Transformer
  8. 什么是DHCP?为什么要用DHCP?(中科三方)
  9. 使用pyecharts绘制系统依赖关系图
  10. 栈详解(顺序栈和链栈)