Spring Cloud(Finchley版本)系列教程(四) 断路器(Hystrix)

Spring Cloud(Finchley版本)系列教程(四) 断路器(Hystrix)

为了更好的浏览体验,欢迎光顾勤奋的凯尔森同学个人博客http://www.huerpu.cc:7000

一、断路器Hystrix

hystrixNetlifx开源的一款容错框架,防雪崩利器,具备服务降级,服务熔断,依赖隔离,监控(Hystrix Dashboard)等功能。hystrix是一个库,通过延迟容忍和容错逻辑,控制分布式服务之间的交互。它通过隔离服务间的访问点、防止级联失败和提供回退选项,保证系统的整体弹性。

二、在Ribbon中使用断路器

复制eurekaClientConsumer项目,重命名为hepServiceRibbonHystrix,修改artifactIdnamedescriptionhepServiceRibbonHystrix,并增加hystrix依赖。

<artifactId>hepServiceRibbonHystrix</artifactId>
<name>hepServiceRibbonHystrix</name> 
<description>hepServiceRibbonHystrix</description>

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

修改EurekaClientConsumerApplication启动类为HepServiceRibbonHystrix,并在程序的启动类HepServiceRibbonHystrix@EnableHystrix注解开启Hystrix

package cc.huerpu.eurekaserver;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
public class HepServiceRibbonHystrix {
    public static void main(String[] args) {
        SpringApplication.run(HepServiceRibbonHystrix.class, args);
    }
    @Bean
    public IRule ribbonRule() {
        // 负载均衡规则,改为随机
        return new RandomRule();
    }
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

修改原来ConsumerController类中的消费接口,增加@HystrixCommand注解,并指定回调方法

@RequestMapping("/consumerEurekaClient")
@HystrixCommand(fallbackMethod = "consumerEurekaClientErrorHandler")
public String consumerEurekaClient(){
    String res = restTemplate.getForObject("http://eurekaClient/getUserById",String.class);
    System.out.println(res);
    return "consumerEurekaClient:" + res;
}

public String consumerEurekaClientErrorHandler() {
    return "consumerEurekaClientErrorHandler:sorry,EurekaClient cannot handle this request,please try later!";
}

修改项目端口号为8005。

浏览器访问http://localhost:8005/consumerEurekaClient,此时http://eurekaClient/getUserById接口是停掉的,也就成功返回了consumerEurekaClientErrorHandler回调函数的字符串。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

三、在OpenFeign中使用断路器

复制项目hepServiceOpenFeign,重命名为hepServiceOpenFeignHystrix,修改artifactIdnamedescriptionhepServiceOpenFeignHystrix

<artifactId>hepServiceOpenFeignHystrix</artifactId>
<name>hepServiceOpenFeignHystrix</name>
<description>hepServiceOpenFeignHystrix</description>

<!-- 并增加web依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

修改项目名称为HepServiceOpenFeignHystrixApplication。

package cc.huerpu.eurekaserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class HepServiceOpenFeignHystrixApplication {
    public static void main(String[] args) {
        SpringApplication.run(HepServiceOpenFeignHystrixApplication.class, args);
    }
}

UserService接口上增加fallback = OpenFeignHytrix.classOpenFeignHytrix实现UserService接口,用于处理调用失败的回调。

package cc.huerpu.eurekaserver.feign;

import cc.huerpu.eurekaserver.config.OpenFeignConfig;
import cc.huerpu.eurekaserver.config.OpenFeignHytrix;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

@FeignClient(value = "eurekaClient",configuration = OpenFeignConfig.class,fallback = OpenFeignHytrix.class)
public interface UserService {
    @RequestMapping(value = "/getUserById")
    String getUserById();
}

定义一个OpenFeignHytrix,实现UserService,并让它注入到容器中。

package cc.huerpu.eurekaserver.config;

import cc.huerpu.eurekaserver.feign.UserService;
import org.springframework.stereotype.Component;

@Component
public class OpenFeignHytrix implements UserService {
    @Override
    public String getUserById(){
        return "Sorry  call getUserById interface error, OpenFeignHytrix recommend you try later " ;
    }
}

在配置文件中打开hystrix

feign:
  hystrix:
    enabled: true

修改项目端口号为8009,重启项目,调用http://localhost:8009/getUserByIdFeign,此时只启动了HepServiceOpenFeignHystrixApplication一个项目,其余项目都没运行,因此触发了Hystrix熔断

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

四、整合Dashboard查看监控数据

在项目hepServiceRibbonHystrix中添加hystrix-dashboar依赖 ,并确保有actuator健康检查依赖。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

在启动类上增加@EnableHystrixDashboard注解。

package cc.huerpu.eurekaserver;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
@EnableHystrixDashboard
public class HepServiceRibbonHystrix {
    public static void main(String[] args) {
        SpringApplication.run(HepServiceRibbonHystrix.class, args);
    }
    @Bean
    public IRule ribbonRule() {
        // 负载均衡规则,改为随机
        return new RandomRule();
    }
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

首先调用一下http://localhost:8005/consumerEurekaClient,然后调用http://localhost:8005/actuator/hystrix.stream,可以看到ping的信息

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

输入http://localhost:8005/hystrix/,把刚刚的地址http://localhost:8005/actuator/hystrix.stream贴进来。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

点击进去,可以看到dashboard信息了

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/472596.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何实现在固定位置的鼠标连点

鼠大侠的鼠标连点功能是免费的 浏览器搜索下载鼠大侠&#xff0c;指定连点间隔和启动快捷键 点击设置&#xff0c;指定点击位置

2024年熔化焊接与热切割证模拟考试题库及熔化焊接与热切割理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年熔化焊接与热切割证模拟考试题库及熔化焊接与热切割理论考试试题是由安全生产模拟考试一点通提供&#xff0c;熔化焊接与热切割证模拟考试题库是根据熔化焊接与热切割最新版教材&#xff0c;熔化焊接与热切割大…

部分字符函数与字符串函数的讲解

说到字符函数&#xff0c;我们见过很多&#xff0c;比如strlen&#xff0c;strcpy&#xff0c;strcat...... 这时候就会有人说还有sizeof&#xff0c;其实sizeof不是库函数&#xff0c;他其实是操作符 但是你听说过以下库函数么&#xff1f; 所以说字符串的函数有很多&#xff…

Photomator:专业级照片编辑的利器

Photomator软件是一款功能强大的照片编辑和管理工具&#xff0c;专注于提供高质量的图像处理体验和便捷的工作流程。以下是关于Photomator软件功能特色的详细介绍&#xff1a; 高级颜色调整功能&#xff1a;Photomator提供了大量前沿的颜色调整工具&#xff0c;包括AI驱动的自…

【数据结构】单链表详解

前言 为了解决顺序表存在的一些问题&#xff0c;我们引入了单链表~ 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 前言 顺序表存在一定的问题 与顺序表的对比 认识链表 链表结构 打印节点 头文件SList.h 源…

opencv安装(C++)并配置vs

准备工作&#xff1a; 1.opencv安装包(此教程使用4.9) 2.visual studio(此教程使用vs2019) opencv安装&#xff1a; 1、下载opencv&#xff1a; 1.1 官网下载&#xff1a;Releases - OpenCV 1.2 百度网盘&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1NpEoFjbbyQJtFD…

HANA VIEW 用 ABAP 创建CDS VIEW,在生成ODATA

这里我们做ADT来创建 场景介绍:把hana中的一个底表,创建成ABAP的 CDS VIEW ,在把CDS VIEW 生成 OData 服务。 一、创建CDS Table Function 红框内根据自身情况填写 选择 Define Table Function with Parameters 创建 Data Definition 完整代码,定义 结构 , 也可以定义参…

基于springboot+vue的火锅店管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

javaSwing推箱子游戏

一、简介 策略性游戏可以锻炼人的思维能力还能缓解人的压力&#xff0c;使人们暂时忘却生活当中的烦恼&#xff0c;增强人们的逻辑思维能力&#xff0c;游戏的艺术美也吸引着越来越多的玩家和厂商&#xff0c;寓教于乐&#xff0c;在放松人们心情的同时还可以活跃双手。在人类…

支小蜜校园防欺凌系统怎么识别到学生打架?

校园欺凌行为已经成为一个全球性的社会问题&#xff0c;它不仅影响了学生的身心健康&#xff0c;也破坏了校园的和谐氛围。为了有效预防和应对这一现象&#xff0c;许多学校开始引入校园防欺凌系统。那么&#xff0c;校园防欺凌系统是如何识别到学生打架的呢&#xff1f;本文将…

腾讯云轻量2核2G3M服务器优惠价61元一年性能测评

阿里云轻量应用服务器2核2G3M带宽优惠价一年61元&#xff0c;100%CPU性能&#xff0c;3M带宽下载速度384KB/秒&#xff0c;40GB SSD系统盘&#xff0c;月流量200GB&#xff0c;折合每天6.6GB流量&#xff0c;超出月流量包的流量按照0.8元每GB的价格支付流量费&#xff0c;地域节…

网络——入门基础

目录 协议 网络协议 OSI七层模型 网络传输基本流程 网络传输流程图 局域网通信 数据包的封装和解包 广域网通信 网络地址管理 IP地址 MAC地址 协议 关于什么是局域网&#xff0c;什么是广域网&#xff0c;我这里就不过多赘述了&#xff0c;我们直接来谈一下什么…

数据结构:10、排序

本文将会介绍8种排序&#xff0c;并在文章末附上代码 一、排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;…

二、阅读器的开发(初始)-- 1、阅读器简介及开发准备工作

1、阅读器工作原理及开发流程 1.1阅读器工作原理简介 电子书&#xff08;有txt、pdf、epub、mobi等格式&#xff09;->解析&#xff08;书名、作者、目录、封面、章节等&#xff09;->&#xff08;通过阅读器引擎&#xff09;渲染 -> 功能&#xff08;字号、背景色、…

学生信息管理系统--修改信息(非常详细的修改,更新,撤销,删除逻辑)

目录 概述修改包括的操作修改在每个模块中的应用 详解修改与更新取消删除 特殊概念数据集游标 总结 概述 学生信息管理系统&#xff0c;功能相对简单且代码重复性高&#xff0c;应该采用复用的思想来减少代码的冗余和提高代码的可维护性。然而&#xff0c;对于基础入门项目来说…

SQL数据库和事务管理器在工业生产中的应用

本文介绍了关系数据库在工业生产中的应用以及如何使用事务管理器将生产参数下载到PLC&#xff0c;以简化OT/IT融合过程。 一 什么是配方&#xff08;Recipe&#xff09; 我们以一家汽车零件制造商的应用举例&#xff0c;该企业专业从事汽车轮毂生产制造。假设该轮毂的型号是“…

echart trigger 为 axis 的时候不显示 tooltip 解决办法

echart trigger 为 axis 的时候不显示 tooltip 解决办法 在项目 vitetsvue3 中使用 echart 显示了一个曲线图&#xff1a; 但当把图表的 trigger 设置成 axis 的时候&#xff0c;鼠标扫过并不显示具体的数值&#xff0c;如上图所示。 但 trigger item 的时候是正常的。 解决…

浏览器工作原理与实践--仅仅打开了1个页面,为什么有4个进程?

无论你是想要设计高性能Web应用&#xff0c;还是要优化现有的Web应用&#xff0c;你都需要了解浏览器中的网络流程、页面渲染过程&#xff0c;JavaScript执行流程&#xff0c;以及Web安全理论&#xff0c;而这些功能是分散在浏览器的各个功能组件中的&#xff0c;比较多、比较散…

idea创建maven-archetype-quickstart框架无法显示src/目录

一、配置好idea中Maven目录 1、不使用idea自带Maven&#xff0c; 2、配置好Maven环境变量M2_HOME 3、修改maven中 setting.xml文件 <?xml version"1.0" encoding"UTF-8"?><settings xmlns"http://maven.apache.org/SETTINGS/1.2.0"…

【C语言】—— 指针三 : 参透数组传参的本质

【C语言】—— 指针三 &#xff1a; 参透数组传参的本质 一、数组名的理解二、使用指针访问数组2.1、指针访问数组2.2、[ ] 的深入理解2.3、数组与指针的区别 三、一维数组的传参本质四、数组指针变量4.1、数组指针变量是什么4.2、 数组指针的初始化 五、二维数组传参的本质 一…