Spring cloud微服务 Hystrix熔断器学习教程
以下demo代码:https://github.com/wades2/HystrixtDemo
官网定义:Hystrix是一个延迟容错库。在分布式环境中,许多服务依赖项中的一些不可避免地会失败。Hystrix是一个库,可通过添加延迟容错和容错逻辑来帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点,阻止它们之间的级联故障以及提供后备选项来实现这一点,所有这些都可以提高系统的整体弹性。
因为在分布式系统中很多服务是相互依赖的,假如以下某个功能实现依赖于几个服务:

假如此时【家庭信息查询服务】由于请求过多或者服务器原因出现了大批量服务不可用,【个人信息查询服务】由于无法请求到【家庭信息查询服务】,一直阻塞,造成服务器压力越来越大,后续又有【人员信息查询】的请求来了。就好比堵车的公路上又来了一大批车;此时会每个依赖关系都会在某些时候不可避免地失败。如果主机应用程序未与这些外部故障隔离,则整个系统可能会崩溃。
此时Hystrix熔断器就发挥了作用:
1、通过第三方客户端库访问(通常通过网络)依赖关系,以防止和控制延迟和故障。
2、在复杂的分布式系统中停止级联故障。(在一段时间内侦测到许多类似的错误,会强迫其以后的多个调用快速失败,不再访问远程服务器)
3、快速失败并迅速恢复。(快速失败后【个人信息查询服务】不会由于阻塞过载,就不会导致雪崩,)
4、在可能的情况下,后退并优雅的降级。
5、实现近实时监控,警报和操作控制。(如果熔断器诊断【家庭信息查询服务】错误已经修正,应用程序会再次尝试调用这个服务。)
这样我们就在之前学习Euraka+ribbon的基础上加熔断机制:
首先在我们的EurekaCaller里面添加上需要的依赖:
【注:如果不清楚的朋友或者没有重头看的朋友,这里附上我demo的
git地址:https://github.com/wades2/EurekaDemo2,
完整的搭建教程在:https://blog.csdn.net/asd529735325/article/details/85044158,
如果你的Eureka和ribbon已经搭建好了可以直接跳过。】
我们的项目基本是这个样子的:

Eurekacaller是这个样子:

添加pom依赖引入需要的jar包:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
重写一下我们的Controller:
package com.example.demo.controller;
import com.example.demo.service.Services;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
@RestController
public class Controller {
@Autowired
private Services service;
@RequestMapping(value = "getUser/routine",method = RequestMethod.GET)
public String routine(@RequestParam String id){
String json=service.routineService(id);
return json;
}
}
然后是我们具体的service,负载的部分,我们的断熔就放在service这里,一旦请求超时或者失败,立即失败并触发降级方法,我这里的降级方法是:callback。
package com.example.demo.service;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.client.RestTemplate;
@Service
public class Services {
@Autowired
private RestTemplate restTemplate;
//实现的callback方法来实现短路保护
@HystrixCommand(fallbackMethod = "callback")
public String routineService(String id){
System.out.println(id);
String jsons = restTemplate.getForObject("http://Eureka-client/user/getUser2", String.class);
return jsons;
}
public String callback(String id){
String msg="出现错误id:"+id;
return msg;
}
}
因为在前期我们没有扫描/user/getUser2所在的包路径,所以这个是肯定扫描不到的,访问一定是404not found的。
然后启动我们的5个启动类,访问http://localhost:8086/getUser/routine?id=52,我们可以看到访问到了callback页面:

这样一来,即使EurkaClient都出现了问题或者过载,我们也可以降级处理。那我们再试试如果超时会怎么样。
修改配置文件。,添加超时设置:
spring.application.name=Eureka_caller
server.port=8086
eureka.client.serviceUrl.defaultZone=http://user:123456@localhost:8083/eureka,http://user:123456@localhost:8082/eureka
#hystrix配置
hystrix.metrics.enabled=true
#默认的超时时间设置
hystrix.metrics.polling-interval-ms=2000
修改下Ribbon请求的路径:
//实现的callback方法来实现短路保护
@HystrixCommand(fallbackMethod = "callback")
public String routineService(String id){
System.out.println(id);
String jsons = restTemplate.getForObject("http://Eureka-client/user/getUser", String.class);
return jsons;
}
修改对应Service提供者的Client具体实现类(也就是修改EurekaClient和EurekaClient2),使其沉睡时间大于我们的熔断请求延迟时间,模拟服务器过载阻塞:
package com.example.demo.controller;
import com.netflix.appinfo.InstanceInfo;
import com.netflix.discovery.DiscoveryClient;
import com.netflix.discovery.EurekaClient;
import com.netflix.discovery.converters.Auto;
import com.netflix.discovery.shared.Applications;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private EurekaClient eurekaClients;
@GetMapping("getUser")
public String getUser() {
//todo 得到eureka server的服务实例
InstanceInfo info=eurekaClients.getNextServerFromEureka("Eureka-client",false);
try{
Thread.sleep(60000);
}catch (Exception e){
e.printStackTrace();
}
return "hello one";
}
}
我们看到请求后依然页面被拦截熔断了,因为等待时间60000毫秒远远大于了我们设置熔断等待时间:2000毫秒。
以上就是我们关于Hystrix熔断器的学习,各位看官大佬爷有什么问题请留言区评论,大家一起讨论解决。
Spring cloud微服务 Hystrix熔断器学习教程的更多相关文章
- Spring Cloud 微服务四:熔断器Spring cloud hystrix
前言:在微服务架构中,一般都是进程间通信,有可能调用链都比较长,当有底层某服务出现问题时,比如宕机,会导致调用方的服务失败,这样就会发生一连串的反映,造成系统资源被阻塞,最终可能造成雪崩.在sprin ...
- Spring Cloud微服务学习笔记
Spring Cloud微服务学习笔记 SOA->Dubbo 微服务架构->Spring Cloud提供了一个一站式的微服务解决方案 第一部分 微服务架构 1 互联网应用架构发展 那些迫使 ...
- spring cloud微服务快速教程之(七) Spring Cloud Alibaba--nacos(一)、服务注册发现
0.前言 什么是Spring Cloud Alibaba? Spring Cloud Alibaba 是阿里开源的,致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便 ...
- 一张图了解Spring Cloud微服务架构
Spring Cloud作为当下主流的微服务框架,可以让我们更简单快捷地实现微服务架构.Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟.经得起实际考验的服务框架组合起来 ...
- 在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用
本文为阿里云容器服务Spring Cloud应用开发系列文章的第一篇. 一.在阿里云容器服务上开发Spring Cloud微服务应用(本文) 二.部署Spring Cloud应用示例 三.服务发现 四 ...
- Spring Cloud 微服务六:调用链跟踪Spring cloud sleuth +zipkin
前言:随着微服务系统的增加,服务之间的调用关系变得会非常复杂,这给运维以及排查问题带来了很大的麻烦,这时服务调用监控就显得非常重要了.spring cloud sleuth实现了对分布式服务的监控解决 ...
- Spring Cloud 微服务五:Spring cloud gateway限流
前言:在互联网应用中,特别是电商,高并发的场景非常多,比如:秒杀.抢购.双11等,在开始时间点会使流量爆发式地涌入,如果对网络流量不加控制很有可能造成后台实例资源耗尽.限流是指通过指定的策略削减流量, ...
- Spring Cloud微服务初探
学习初衷 因为加了不少优秀的知识星球,结交了更多的小伙伴,加了更多的群,每每在自我介绍的时候,都说自己是Android & Java攻城狮. 然鹅,有的小伙伴就来问了,你是搞Java的,那对S ...
- spring cloud微服务实践七
在spring cloud 2.x以后,由于zuul一直停滞在1.x版本,所以spring官方就自己开发了一个项目 Spring Cloud Gateway.作为spring cloud微服务的网关组 ...
随机推荐
- 【BZOJ 2120】【国家集训队 2011】【数颜色】(莫队)
题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...
- 洛谷P2900 [USACO08MAR]土地征用Land Acquisition(斜率优化)
题意 约翰准备扩大他的农场,眼前他正在考虑购买N块长方形的土地.如果约翰单买一块土 地,价格就是土地的面积.但他可以选择并购一组土地,并购的价格为这些土地中最大的长 乘以最大的宽.比如约翰并购一块3 ...
- Oracle复制表
Oracle复制表分为只复制表结构或者结构和数据均复制两种: 只复制表结构 create table newTableName as select * from oldTableName where ...
- Docker部署MySql应用
1. MySQL部署 1.1拉取MySQL镜像 docker pull mysql 查看镜像 docker images 1.2创建MySQL容器 docker run -di --name piny ...
- 牛客寒假算法基础集训营4 G Applese 的毒气炸弹
链接:https://ac.nowcoder.com/acm/contest/330/G来源:牛客网 众所周知,Applese 是个很强的选手,它的化学一定很好. 今天他又AK了一套题觉得很无聊,于是 ...
- 牛客国庆集训day6 B Board (模拟标记思维或找规律或分块???)
链接:https://www.nowcoder.com/acm/contest/206/B来源:牛客网 题目描述 恬恬有一个nx n的数组.她在用这个数组玩游戏: 开始时,数组中每一个元素都是0. 恬 ...
- 设置linux服务器文件夹权限
最近搞的网站一上传图片,就报500错误.经排查是服务器文件夹权限设置问题. 使用命令: chmod o+rwx avatar 即可改变文件夹权限设置.
- angularJs分层服务开发
//控制层 app.controller('brandController' ,function($scope,$controller ,brandService){ $controller('bas ...
- ie7,ie8 js中变量名和页面元素ID重名,报错
js变量名和一个div的id重名,报错.不知所以然...做个标记
- Linux不同发型版本(Debian REHL)与软件包管理器(RPM dpkg)的概念
Linux的发行版本可以大体分为两类: Linux发行版 = Linux内核(类Unix内核) + Linux软件管理(package manager) 一类是商业公司维护的发行版本,以著名的Red ...