Spring Cloud Hystrix介绍

  在微服务架构中,通常会存在多个服务层调用的情况,如果基础服务出现故障可能会发生级联传递,导致整个服务链上的服务不可用
为了解决服务级联失败这种问题,在分布式架构中产生了断路器等一系列的服务保护机制。分布式架构中的断路器,有些类似于我们生活中的空气开关,当电路发生短路等情况时,空气开关会立刻断开电流,以防止用电火灾的发生。
  在Spring Cloud中,Spring Cloud Hystrix就是用来实现断路器、线程隔离等服务保护功能的。Spring Cloud Hystrix是基于Netflix的开源框架Hystrix实现的,该框架的使用目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。
与空气开关不能自动重新打开有所不同的是,断路器是可以实现弹性容错的,在一定条件下它能够自动打开和关闭,其使用时主要有三种状态,如图5-2所示。

  在图5-2中,断路器的开关由关闭到打开的状态是通过当前服务健康状况(服务的健康状况=请求失败数/请求总数)和设定阈值(默认为10秒内的20次故障)比较决定的。当断路器开关关闭时,请求被允许通过断路器,如果当前健康状况高于设定阈值,开关继续保持关闭;如果当前健康状况低于设定阈值,开关则切换为打开状态。当断路器开关打开时,请求被禁止通过;如果设置了fallback方法,则会进入fallback的流程。当断路器开关处于打开状态,经过一段时间后,断路器会自动进入半开状态,这时断路器只允许一个请求通过;当该请求调用成功时,断路器恢复到关闭状态;若该请求失败,断路器继续保持打开状态,接下来的请求会被禁止通过。
  Spring Cloud Hystrix能保证服务调用者在调用异常服务时快速地返回结果,避免大量的同步等待,这是通过HystrixCommand的fallback方法实现的
  但采用fallback的方式可以给用户一个友好的提示结果,这样就避免了其他服务的崩溃问题。

Spring Cloud Hystrix的使用

  了解了为什么需要使用Hystrix,以及Hystrix在使用时的三种状态后,下面通过一个案例来讲解如何在应用中使用SpringCloud Hystrix来实现断路器的容错功能,并使用FallBack()方法为熔断或异常提供备选方案。案例中主要涉及到以下几个工程:
  ·xcservice-eureka-server工程:服务注册中心,端口为8761;
  ·xcservice-eureka-order工程:服务提供者,需要启动两个订单实例,其端口号分别为7900和7901;
  ·xcservice-eureka-user-hystrix工程:服务消费者,使用Ribbon实现的,端口号为8030,此工程可以在xcservice-eu-reka-user工程内容的基础上修改。
  在上述三个工程中,xcservice-eureka-server和xcservice-eureka-order可以使用第4章中所创建的工程,而xcservice-eureka-user-hystrix工程需要重新搭建和编写。其具体实现过程如下。
  (1)创建xcservice-eureka-user-hystrix工程,并在其pom.xml中引入eureka和hystrix的依赖,如文件5-1所示。
  文件5-1 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.xc</groupId>
<artifactId>xcservice-springcloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.xc</groupId>
<artifactId>xcservice-eureka-user-hystrix</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>xcservice-eureka-user-hystrix</name>
<description>服务消费者</description> <properties>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency> <dependency><!-- Hystrix依赖 -->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

  (2)编辑配置文件。在配置文件中添加Eureka服务实例的端口号、服务端地址等,如文件5-2所示。
  文件5-2 application.yml

server:
port: 8030 # 指定该Eureka实例的端口号 eureka:
instance:
prefer-ip-address: true # 是否显示主机的IP
#instance-id: ${spring.cloud.client.ipAddress}:${server.port} #将Status中的显示内容也以“IP:端口号”的形式显示
client:
service-url:
defaultZone: http://localhost:8761/eureka/ # 指定Eureka服务端地址 spring:
application:
name: xcservice-eureka-user-hystrix # 指定应用名称

  (3)在工程主类Application中使用@EnableCircuitBreaker注解开启断路器功能,编辑后如文件5-3所示。
  文件5-3 Application.java

package com.xc.xcserviceeurekauserhystrix;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate; @SpringBootApplication
@EnableCircuitBreaker
@EnableEurekaClient
public class XcserviceEurekaUserHystrixApplication { /**
* 实例化RestTemplate
* RestTemplate是Spring提供的用于访问Rest服务的客户端,
* 它提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
} public static void main(String[] args) {
SpringApplication.run(XcserviceEurekaUserHystrixApplication.class, args);
} }

  (4)修改用户控制器类。在findOrdersByUser()方法上添加@HystrixCommand注解来指定回调方法,编辑后如文件5-4所示。
  文件5-4 UserController.java

package com.xc.xcserviceeurekauserhystrix.controller;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
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; @RestController
public class UserController { @Autowired
private RestTemplate restTemplate; /**
* http://localhost:8030/findOrdersByUser/1
* 查找与用户相关的订单
*/
@GetMapping("/findOrdersByUser/{id}")
@HystrixCommand(fallbackMethod = "fallbackInfo")
public String findOrdersByUser(@PathVariable String id) {
// 假设用户只有一个订单,并且订单id为123
// int oid = 123;
// return restTemplate.getForObject("http://localhost:7900/order/" + oid, String.class);
return restTemplate.getForObject("http://xcservice-eureka-order/order/" + id, String.class);
} /**
* 返回信息方法
*/
public String fallbackInfo(@PathVariable String id) {
return "服务不可用,请稍后再试!";
} }

  在上述代码中,@HystrixCommand注解用于指定当前方法发生异常时调用的方法,该方法是通过其属性fallbackMethod的属性值来指定的。这里需要注意的是,回调方法的参数类型以及返回值必须要和原方法保持一致。

  (5)分别启动注册中心、服务提供者(7900和7901)和服务消费者。
  当多次访问http://localhost:8030/findOrdersByUser/1时,后台将通过轮询的方式分别访问7900和7901端口所对应的服务。此时如果停止7901对应的服务,那么多次执行访问时,在轮询到7901端口对应的服务时,页面将显示提示信息(服务不可用,请稍后再试!),这也就说明Spring Cloud Hystrix的服务回调(fallbackInfo()方法)生效。

Spring Cloud Hystrix 服务容错保护 5.1的更多相关文章

  1. 笔记:Spring Cloud Hystrix 服务容错保护

    由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身问题出现调用故障或延迟,而这些问题会直接导致调用方的对外服务也出现延迟,若此时调用方的请求不断增加 ...

  2. Spring Cloud Hystrix 服务容错保护

    目录 一.Hystrix 是什么 二.Hystrix断路器搭建 三.断路器优化 一.Hystrix 是什么 ​ 在微服务架构中,我们将系统拆分成了若干弱小的单元,单元与单元之间通过HTTP或者TCP等 ...

  3. Spring Cloud (7) 服务容错保护-Hystrix服务降级

    在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以互相调用,在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证其高可用,单个服务通常会集群 ...

  4. Spring Cloud (8) 服务容错保护-Hystrix依赖隔离

    依赖隔离 docker使用舱壁模式来实现进程的隔离,使容器与容器之间不会互相影响.而Hystrix则使用该模式实现线程池的隔离,它会为每一个Hystrix命令创建一个独立的线程池,这样就算在某个Hys ...

  5. Spring Cloud (9) 服务容错保护-Hystrix断路器

    断路器 断路器本身是一种开关装置,用于在电路上保护线路过载,当线路中又电路发生短路时,断路器能够及时的切断故障电路,放置发生过载.发热.甚至起火等严重后果. 在分布式架构中,断路器模式的作用也是类似, ...

  6. 【Spring Cloud】服务容错保护:Hystrix(四)

    一.雪崩效应 在微服务架构中,由于服务和服务之间可以互相调用,一项工作的完成可能会依赖调用多个微服务模块,但由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就 ...

  7. Spring Cloud 2-Hystrix 断路容错保护(四)

    Spring Cloud  Hystrix  1.RestTemplate 容错 pom.xml application.yml application.java HelloService.java ...

  8. Hystrix服务容错保护

    一.什么是灾难性雪崩效应? 造成灾难性雪崩效应的原因,可以简单归结为下述三种: 服务提供者不可用.如:硬件故障.程序BUG.缓存击穿.并发请求量过大等. 重试加大流量.如:用户重试.代码重试逻辑等. ...

  9. spring cloud 入门系列四:使用Hystrix 实现断路器进行服务容错保护

    在微服务中,我们将系统拆分为很多个服务单元,各单元之间通过服务注册和订阅消费的方式进行相互依赖.但是如果有一些服务出现问题了会怎么样? 比如说有三个服务(ABC),A调用B,B调用C.由于网络延迟或C ...

随机推荐

  1. [Schematics] 0. Schematics "Hello World"

    1. Install schematics cli: npm i -g @angular-devkit/schematics-cli@latest 2. Then run schematics to ...

  2. 初【001】——Python 基础知识

    1.python基础入门 提示: 语法基于python3.x版本(会提示2.x版本和3.x版本的区别) Python命令行将以>>>开始,比如 >>>print ( ...

  3. Kubernetes 学习12 kubernetes 存储卷

    一.概述 1.我们此前讲过根据应用本身是否需要持久存储数据以及某一次请求和之前的请求是否有联系,可以分为四类应用 a.有状态,要存储 b.有状态,无持久存储 c.无状态,要存储 d.无状态,无持久存储 ...

  4. word写博客

    虽然很多博客已经可以直接粘贴图片了但是如果图片比较多的话还是会很麻烦的.如果文章中只有一张图片那还好说,直接使用CSDN提供的编辑器粘贴就完了.但是我们的文档中一般图片都是多于1张的,经常是10张.如 ...

  5. Memcached 与 Redis 区别

    一.问题:     数据库表数据量极大(千万条),要求让服务器更加快速地响应用户的需求.   二.解决方案:      1.通过高速服务器Cache缓存数据库数据      2.内存数据库     ( ...

  6. StringSequences

    题意: 给出两个长度不超过\(50\)的字符串\(S, T\),每次可以在\(S\)中插入一个字符,把每次操作后的\(S\)写成一个序列,问有多少种不同的序列. 注意到我们可以把\(S\)拆分成一段一 ...

  7. mac php 安装php多版本

    之前的开发,PHP的版本都是基于php7.3 .but!!! 接到一个老项目 tp3.1的.没法用php7.3 只能在装一个php5.6了.真坑爹.为啥还要TP3.1的项目.并且是刚开发的新项目. 真 ...

  8. python中string、json、bytes的转换

    json->string str = json.dumps(jsonobj) bytes->string str = str(bytes,‘utf-8’) string->json ...

  9. shell文本处理工具

    本文将介绍Linux下使用Shell处理文本时最常用的工具: find.grep.xargs.sort.uniq.tr.cut.paste.wc.sed.awk: 提供的例子和参数都是最常用和最为实用 ...

  10. CRMEB中因为重写规则导致的服务器异常和404之解决办法

    问题描述:安装CRMEB后,只能通过https://域名//index.php/admin访问到后台,而不能直接通过https://域名/admin访问到后台,以至于导致进入系统后台出现有的功能界面可 ...