熔断器Hystrix及服务监控Dashboard

2023-10-21 11:40

本文主要是介绍熔断器Hystrix及服务监控Dashboard,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • Hystrix介绍
  • 测试
  • Hystrix默认超时时间设置
  • Hystrix服务监控Dashboard

Hystrix介绍

在这里插入图片描述
hystrix对应的中文名字是“豪猪”,豪猪周身长满了刺,能保护自己不受天敌的伤害,代表了一种防御机制,这与hystrix本身的功能不谋而合,因此Netflix团队将该框架命名为Hystrix,并使用了对应的卡通形象做作为logo。

Hystrix是什么?

在分布式系统,我们一定会依赖各种服务,那么这些个服务一定会出现失败的情况,Hystrix就是这样的一个工具,它通过提供了逻辑上延时和错误容忍的解决力来协助我们完成分布式系统的交互。Hystrix 通过分离服务的调用点,阻止错误在各个系统的传播,并且提供了错误回调机制,这一系列的措施提高了系统的整体服务弹性。

Hystrix 的作用:
1,保护系统间的调用延时以及错误,特别是通过第三方的工具的网络调用
2,阻止错误在分布式系统之前的传播
3,快速失败和迅速恢复
4,错误回退和优雅的服务降级

引用场景来讲,
当一个请求依赖多个服务的时候:
正常情况下的访问
在这里插入图片描述
但是,当请求的服务中出现无法访问、异常、超时等问题时(图中的I),那么用户的请求将会被阻塞。

在这里插入图片描述
如果多个用户的请求中,都存在无法访问的服务,那么他们都将陷入阻塞的状态中。
在这里插入图片描述
这也就是服务雪崩效应。

所以Hystrix的引入,可以通过服务熔断和服务降级来解决这个问题。

测试

在一个分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,如何能够保证在一个依赖出问题的情况下,不会导致整体服务失败,这个就是Hystrix需要做的事情。Hystrix提供了熔断、隔离、Fallback、cache、监控等功能,能够在一个、或多个依赖同时出现问题时保证系统依然可用。

Hystrix服务熔断服务降级@HystrixCommand fallbackMethod

熔断机制是应对雪崩效应的一种微服务链路保护机制。
当某个服务不可用或者响应时间超时,会进行服务降级,进而熔断该节点的服务调用,快速返回自定义的错误影响页面信息。

下面我针对应对雪崩效应使用Hystrix进行测试一下:

(有不明白的请查看我的上篇博客)
(还需要注意的是我这里测试的是单机模式的)

首先创建一个新的带服务熔断的服务提供者项目
microservice-student-provider-hystrix-1004

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.zlk</groupId><artifactId>springcloud</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>microservice-student-provider-hystrix-1004</artifactId><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>com.zlk</groupId><artifactId>microservice-common</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId></dependency><!--  修改后立即生效,热部署  --><dependency><groupId>org.springframework</groupId><artifactId>springloaded</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency><dependency><groupId>com.zlk</groupId><artifactId>microservice-common</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope></dependency><!--添加注册中心Eureka相关配置--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency><!-- actuator监控引入 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!--Hystrix相关依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-hystrix</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

yml:

server:port: 1004context-path: /
spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/t224?useUnicode=true&characterEncoding=utf8username: rootpassword: 123jpa:hibernate:ddl-auto: updateshow-sql: trueapplication:name: microservice-studentprofiles: provider-hystrix-1004eureka:instance:hostname: localhostappname: microservice-studentinstance-id: microservice-student:1004prefer-ip-address: trueclient:service-url:defaultZone: http://eureka2001.zlk.com:2001/eureka/,http://eureka2002.zlk.com:2002/eureka/,http://eureka2003.zlk.com:2003/eureka/info:groupId: com.zlk.springcloudartifactId: microservice-student-provider-hystrix-1004version: 1.0-SNAPSHOTuserName: http://zlk.comphone: 123456

启动类:
@EnableCircuitBreaker

package com.zlk.microservicestudentproviderhystrix1004;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@EnableCircuitBreaker
@EntityScan("com.zlk.*.*")
@EnableEurekaClient
@SpringBootApplication
public class MicroserviceStudentProviderHystrix1004Application {public static void main(String[] args) {SpringApplication.run(MicroserviceStudentProviderHystrix1004Application.class, args);}}

再添加一个controller,
添加之前先把之前的服务端的repository 和service包copy过来,

package com.zlk.microservicestudentproviderhystrix1004.controller;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.zlk.microservicecommon.entity.Student;
import com.zlk.microservicestudentproviderhystrix1004.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;import java.util.HashMap;
import java.util.List;
import java.util.Map;@RestController
@RequestMapping("/student")
public class StudentProviderController {@Autowiredprivate StudentService studentService;@Value("${server.port}")private String port;@PostMapping(value="/save")public boolean save(Student student){try{studentService.save(student);  return true;}catch(Exception e){return false;}}@GetMapping(value="/list")public List<Student> list(){return studentService.list();}@GetMapping(value="/get/{id}")public Student get(@PathVariable("id") Integer id){return studentService.findById(id);}@GetMapping(value="/delete/{id}")public boolean delete(@PathVariable("id") Integer id){try{studentService.delete(id);return true;}catch(Exception e){return false;}}@RequestMapping("/ribbon")public String ribbon(){return "工号【"+port+"】正在为您服务";}/*** 测试Hystrix服务降级* @return* @throws InterruptedException*/@ResponseBody@GetMapping(value="/hystrix")@HystrixCommand(fallbackMethod="hystrixFallback")public Map<String,Object> hystrix() throws InterruptedException{
//        Thread.sleep(2000);Map<String,Object> map=new HashMap<String,Object>();map.put("code", 200);map.put("info","工号【"+port+"】正在为您服务");return map;}public Map<String,Object> hystrixFallback() throws InterruptedException{Map<String,Object> map=new HashMap<String,Object>();map.put("code", 500);map.put("info", "系统【"+port+"】繁忙,稍后重试");return map;}
}

主要的是hystrix()和hystrixFallback()方法,
hystrix()方法上的@HystrixCommand(fallbackMethod=“hystrixFallback”)注解的意思是:
表明这个方法我们在没有异常以及没有超时(hystrix默认1秒算超时)的情况,才返回正常的业务数据;

fallbackMethod是指定后退的方法,也就是当这个方法出现问题,会执行哪个方法。

且这之中的 Thread.sleep(2000);我注解了,他是用来模拟响应超时的。

别忘了,消费者那边也得加上这些方法来测试、

先开eureka服务器,然后再开生产者,再开消费者。

结果:
(因为我测试的是单机的所以还是存在轮询的问题,多刷几遍即可)

可以看到这是我开了线程睡眠的结果:
在这里插入图片描述

Hystrix默认超时时间设置

Hystrix默认超时时间是1秒,我们可以通过hystrix源码看到:
按ctrl+shift+R 填入HystrixCommandProperties
也可以找到 hystrix-core.jar com.netflix.hystrix包下的HystrixCommandProperties类。

在这里插入图片描述
因为在某些正常操作情况下,处理时间会超过1秒,所以这种不太合理,需要自己来改变超时时常。
那么怎么改呢?
在yml文件中添加:

hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 3000

以毫秒为单位,我这里写的是3秒。
再次运行测试,即可出现效果。

Hystrix服务监控Dashboard

Hystrix提供了 准实时的服务调用监控项目Dashboard,能够实时记录通过Hystrix发起的请求执行情况,

要实现这个,需要重新新建一个项目:
microservice-student-consumer-hystrix-dashboard-90
pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.zlk</groupId><artifactId>springcloud</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>microservice-student-consumer-hystrix-dashboard-90</artifactId><properties><java.version>1.8</java.version></properties><dependencies><!--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><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

yml:

server:port: 90context-path: /

启动类:

package com.zlk.microservicestudentconsumerhystrixdashboard90;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;@EnableHystrixDashboard
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class MicroserviceStudentConsumerHystrixDashboard90Application {public static void main(String[] args) {SpringApplication.run(MicroserviceStudentConsumerHystrixDashboard90Application.class, args);}}

启动项目,

浏览器输入:http://localhost:90/hystrix
进入以下界面即说明成功:
在这里插入图片描述
我们在启动eureka和microservice-student-provider-hystrix-1004,也就是用了hystrix技术的生产者。再启动消费者。

然后我们在以下的方框中加入:
http://localhost:1004/hystrix.stream
也就是输入监控地址:本地IP的1004端口,
Delay则代表的是两秒刷新一次监控页面。
在这里插入图片描述
输入完点击 Monitor Stream按钮进入以下界面:

在这里插入图片描述
指标含义:
在这里插入图片描述
当你的端口接收到什么eureka请求的状态都会显示在这里。

这篇关于熔断器Hystrix及服务监控Dashboard的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/254160

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

基于SpringBoot的宠物服务系统+uniapp小程序+LW参考示例

系列文章目录 1.基于SSM的洗衣房管理系统+原生微信小程序+LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统+LW参考示例 3.基于SpringBoot+Vue的企业人事管理系统+LW参考示例 4.基于SSM的高校实验室管理系统+LW参考示例 5.基于SpringBoot的二手数码回收系统+原生微信小程序+LW参考示例 6.基于SSM的民宿预订管理系统+LW参考示例 7.基于

kubernetes集群部署Zabbix监控平台

一、zabbix介绍 1.zabbix简介 Zabbix是一个基于Web界面的分布式系统监控的企业级开源软件。可以监视各种系统与设备的参数,保障服务器及设备的安全运营。 2.zabbix特点 (1)安装与配置简单。 (2)可视化web管理界面。 (3)免费开源。 (4)支持中文。 (5)自动发现。 (6)分布式监控。 (7)实时绘图。 3.zabbix的主要功能

基于树梅派的视频监控机器人Verybot

最近这段时间做了一个基于树梅派 ( raspberry pi ) 的视频监控机器人平台 Verybot ,现在打算把这个机器人的一些图片、视频、设计思路进行公开,并且希望跟大家一起研究相关的各种问题,下面是两张机器人的照片:         图片1:                   图片2                    这个平台的基本组成是:

PC与android平板通过浏览器监控Verybot的视频

下面这个视频是PC与android平板通过浏览器监控Verybot的视频:           http://v.youku.com/v_show/id_XNjYzNzYyMTIw.html

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

Golang服务平滑重启

与重载配置相同的是我们也需要通过信号来通知server重启,但关键在于平滑重启,如果只是简单的重启,只需要kill掉,然后再拉起即可。平滑重启意味着server升级的时候可以不用停止业务。 我们先来看下Github上有没有相应的库解决这个问题,然后找到了如下三个库: facebookgo/grace - Graceful restart & zero downtime deploy for G