一、概述

容错机制是指的是在一个分布式系统中,每个微服务之间是相互调用的,并且他们之间相互依赖,而实际的运行情况中,可能会因为各种原因导致某个微服务不可用,那么依赖于这个微服务的其他微服务就可能出现响应时间过长或者请求失败的情况,出现这种情况比较多就可能导致整个系统卡顿甚至奔溃。那么如何解决这个问题呢,就可以通过Hystix的容错机制来处理。

容错机制是指在不改变各个微服务的调用关系的前提下,针对错误情况进行预先处理。Hystrix的主要作用就是当服务提供者发生故障无法访问的时候,向服务消费者返回一个fallback的降级处理,从而保证系统能顺利运行。

上一篇已经结合Feign讲解了Hystrix的容错机制,容错功能指的是当服务的调用发生问题的时候,我们做一个降级处理,用另外一部分代码进行处理。可以有效的防止程序因为响应时间过长而造成整个系统崩溃,并且还能给用户提供更为友好的交互。但是Hystrix除了熔断机制外,还提供了对请求的数据监控,本篇着重讲解Hystix的数据监控。Hystrix数据监控需要结合Spring Boot Actuator来使用,Actuator提供了对服务的健康监控、数据统计,可以通过hystrix.stream节点获取监控请求数据,提供了可视化的监控界面。

二、设计原则

\1. 服务隔离机制:防止某个服务提供者出现故障而影响整个系统的运行。

\2. 服务降级机制:当服务提供者出现故障时,向服务消费者返回一个fallback降级处理。

\3. 熔断机制:当服务消费者请求失败率打到某个特定的数值时,会迅速的启动熔断机制,并且对错误进行修复。

\4. 提供实时的监控和报警功能:保证熔断机制的运行。

\5. 提供实时的配置修改功能:保证熔断机制的运行。

三、实战!

1.创建Module,pom.xml代码如下:

    <!-- Eureka客户端依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
<!-- 加入feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
<!-- 加入actuator健康监控 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.0.7.RELEASE</version>
</dependency>
<!-- 添加hysteix熔断器 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
<!-- 添加可视化监控组件 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>

2.创建配置文件application.yml,配置代码如下:

server:
port: 8060
spring:
application:
name: hystrix
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
feign:
hystrix:
enabled: true
management:
endpoints:
web:
exposure:
include: 'hystrix.stream'

3.创建启动类,代码如下:

package com.zing;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication
@EnableFeignClients
@EnableCircuitBreaker
@EnableHystrixDashboard
public class HystrixApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(HystrixApplication.class, args);
} }

注解说明

* @EnableCircuitBreaker:声明启用数据监控

​ * @EnableHystrixDashboard:声明启用可视化的数据监控

4.创建实体类,方便接收findAll的数据转化实体,不接收数据转实体可不用实例类,比如index方法。具体代码如下:

package com.zing.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor; @Data //生成Getter,Setter,equals,canEqual,hasCode,toString等方法
@AllArgsConstructor //添加一个构造函数,该构造函数含有所有已声明字段属性参数
@NoArgsConstructor //创建一个无参构造函数
public class Student {
private long id;
private String name;
private int age;
}

5.创建Feign声明式接口,代码如下:

package com.zing.service;

import java.util.Collection;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping; import com.zing.entity.Student; @FeignClient(value = "provider")
public interface IFeignService { @GetMapping("/student/findAll")
public Collection<Student> findAll(); @GetMapping("/student/index")
public String index();
}

6.创建Controller代码如下;

package com.zing.controller;

import java.util.Collection;

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 com.zing.entity.Student;
import com.zing.service.IFeignService; @RestController
@RequestMapping("/hystrix")
public class HystrixHandler { @Autowired
private IFeignService feignservice; @GetMapping("/findAll")
public Collection<Student> findAll(){
return feignservice.findAll();
} @GetMapping("/index")
public String index() {
return feignservice.index();
} }

7.依次启动注册中心,两个服务提供者provider和Hystrix的服务,可访问注册中心看到如下效果:

8.访问地址 http://localhost:8060/actuator/hystrix.stream 可查看到数据监控页面一直在刷新访问数据。数据为空是因为我们没有访问具体的接口,页面如下:

9.当我们访问 http://localhost:8060/hystrix/index 调用接口时,看到如下页面:

10.我们再次返回http://localhost:8060/actuator/hystrix.stream可查看到有数据出现,如下图:

11.但是这个页面的数据不够直观,这时候,我们就要访问 http://localhost:8060/hystrix 就能出现如下界面:

12.在监测接口地址连填写入数据监测的地址http://localhost:8060/actuator/hystrix.stream后,在title随便输入个名字即可进入到数据监测可视化界面,如下图:

Spring Cloud08: Hystrix 容错机制与数据监控的更多相关文章

  1. SpringCloud学习笔记(4):Hystrix容错机制

    简介 在微服务架构中,微服务之间的依赖关系错综复杂,难免的某些服务会出现故障,导致服务调用方出现远程调度的线程阻塞.在高负载的场景下,如果不做任何处理,可能会引起级联故障,导致服务调用方的资源耗尽甚至 ...

  2. Spring Cloud Hystrix理解与实践(一):搭建简单监控集群

    前言 在分布式架构中,所谓的断路器模式是指当某个服务发生故障之后,通过断路器的故障监控,向调用方返回一个错误响应,这样就不会使得线程因调用故障服务被长时间占用不释放,避免故障的继续蔓延.Spring ...

  3. Hystrix (容错,回退,降级,缓存)

    Hystrix熔断机制就像家里的保险丝一样,若同时使用高功率的电器,就会烧坏电路,这时候保险丝自动断开就有效的保护了电路.而我们程序中也同样是这样.例如若此时数据库压力太大速度很慢,此时还有不断的请求 ...

  4. 容错保护机制:Spring Cloud Hystrix

    最近在学习Spring Cloud的知识,现将容错保护机制Spring Cloud Hystrix 的相关知识笔记整理如下.[采用 oneNote格式排版]

  5. 第五章 服务容错保护:Spring Cloud Hystrix

    在微服务架构中,我们将系统拆分为很多个服务,各个服务之间通过注册与订阅的方式相互依赖,由于各个服务都是在各自的进程中运行,就有可能由于网络原因或者服务自身的问题导致调用故障或延迟,随着服务的积压,可能 ...

  6. SpringCloud系列七:Hystrix 熔断机制(Hystrix基本配置、服务降级、HystrixDashboard服务监控、Turbine聚合监控)

    1.概念:Hystrix 熔断机制 2.具体内容 所谓的熔断机制和日常生活中见到电路保险丝是非常相似的,当出现了问题之后,保险丝会自动烧断,以保护我们的电器, 那么如果换到了程序之中呢? 当现在服务的 ...

  7. 第五章 服务容错保护: Spring Cloud Hystrix

    在微服务架构中, 存在着那么多的服务单元, 若一个单元出现故障, 就很容易因依赖关系而引发故障的蔓延,最终导致整个系统的瘫痪,这样的架构相较传统架构更加不稳定.为了解决这样的问题, 产生了断路器等一系 ...

  8. SpringCloud---服务容错保护---Spring Cloud Hystrix

    1.概述 1.1 在分布式架构中,存在着许多的服务单元,若一个单元出现故障,很容易因依赖关系引发故障的蔓延,最终导致整个系统的瘫痪: 为了解决这样的问题,产生了断路器等服务保护机制: 1.2 分布式架 ...

  9. 分布式系统的延时和故障容错之Spring Cloud Hystrix

    本示例主要介绍 Spring Cloud 系列中的 Eureka,如何使用Hystrix熔断器容错保护我们的应用程序. 在微服务架构中,系统被拆分成很多个服务单元,各个服务单元的应用通过 HTTP 相 ...

随机推荐

  1. MinGW 可以编译驱动的

    #include <ddk/ntddk.h> static VOID STDCALLmy_unload( IN PDRIVER_OBJECT DriverObject ) {} NTSTA ...

  2. 板载网卡MAC地址丢失后刷回方法[转]

    部份客户在进行误操作后发现网卡MAC地址全部变成0,大部客户不知道如何重新将MAC地址写回去.就此问题我们介绍一下,希望可以帮到大家.修改MAC地址时,一定要在纯DOS环境下修改.目前使用U盘DOS引 ...

  3. Portswigger web security academy:Cross-origin resource sharing (CORS)

    Portswigger web security academy:Cross-origin resource sharing (CORS) 目录 Portswigger web security ac ...

  4. SpringBoot面向切面编程(AOP)

    Aspect (与SpringBoot整合) 总结 作用位置 try{ try{ @Around 前置环绕通知 @Before 前置通知 method.invoke(..); }catch(){ @A ...

  5. Ubuntu20.04连接WiFi

    电脑安装了Ubuntu20.04后发现没办法连接WiFi,也找不到WiFi图标,一般来说是因为Ubuntu系统没有网卡驱动,安装一下即可 解决办法如下: 先用网线或者手机开热点连接到到电脑,让电脑有网 ...

  6. TLS是如何保障数据传输安全(中间人攻击)

    前言 前段时间和同事讨论HTTPS的工作原理,当时对这块知识原理掌握还是靠以前看了一些博客介绍,深度不够,正好我这位同事是密码学专业毕业的,结合他密码学角度对tls加解密这阐述,让我对这块原理有了更进 ...

  7. class的大小

    3个问题: sizeof一个空类是多大?为什么?编译器为什么这么做? 在这个类中添加一个virtual函数后再sizeof,这时是多大?为什么? 将这个类再virtual继承一个其它的空类,这是多大? ...

  8. [源码解析] 并行分布式框架 Celery 之 Lamport 逻辑时钟 & Mingle

    [源码解析] 并行分布式框架 Celery 之 Lamport 逻辑时钟 & Mingle 目录 [源码解析] 并行分布式框架 Celery 之 Lamport 逻辑时钟 & Ming ...

  9. (原创)高DPI适配经验系列:(三)字体与字号、缩放锚点

    一.前言 程序最基本的元素,就是文本,也就是字体.如果程序未进行高DPI的适配,最直观的感受便是字体的模糊.所以本篇便来说一下高DPI适配中的字体问题. 高DPI的适配,简单来说便是便是根据不同的DP ...

  10. [bug] MySQL-Front连接MySQL 8.0失败

    原因: MySQL-Front不支持MySQL 8.0的密码认证方式 解决: 在mysql安装目录中my.ini文件末尾添加 default_authentication_plugin=mysql_n ...