SpringCloud-容错处理Hystrix熔断器(五)

前言:微服务架构应用的特点就是多服务,而服务层之间通过网络进行通信,从而支撑起整个应用系统,所以,各个微服务之间不可避免的存在耦合依赖关系。但任何的服务应用实例都不可能永远的健康或网络不可能永远的都相安无事,所以一旦某个服务或局部业务发生了故障,会导致系统的不可用,我们知道当故障累积到一定程度就会造成系统层面的灾害,也就是级联故障,也叫雪崩效应,所以微服务需要在故障累计到上限之前阻止或疏通这些故障以保证系统的稳固安全,在市面上已经有很多这样的框架来解决这样的问题,如Twitter的Finagle、Netflix的Hystrix和Google的Stubby等,下面就简单介绍下Hystrix和Hystrix在SpringCloud中的应用。

一、Hystrix简介

  Hystrix(https://github.com/Netflix/Hystrix)是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性、容错性与局部应用的弹性,是一个实现了超市机制和断路器模式的工具类库。

二、Hystrix如何解决依赖隔离

  1、包裹请求:使用HystrixCommand包裹对依赖的调用逻辑,每个命令在独立的线程中执行,使用了设计模式中的“命令模式”;   2、跳闸机制:当某服务的错误率超过一定阈值时,Hystrix可以自动或者手动跳闸,停止请求该服务一段时间;   3、资源隔离:Hystrix为每个依赖都维护了一个小型的线程池(或者信号量)。如果该线程已满,则发向该依赖的请求就会被立即拒绝,而不是排队等候,从而加速失败判定;   4、监控:Hystrix可以近乎实时地监控运行指标和配置的变化,例如成功、失败、超时、以及被拒绝的请求等;   5、回退机制:当请求失败、超时、被拒绝,或当断路器打开时,执行回退逻辑,回退逻辑由开发人员自行提供,如返回一个缺省值;   6、自我修复:断路器打开一段时间后,会自动进入“半开”状态,此时断路器可允许一个请求访问依赖的服务,若请求成功,则断路器关闭,否则断路器转为“打开”状态;

三、Hystrix在SpringCloud中的简单应用

1、简单整合Hystrix(在这部分会用到Ribbon测试的相关项目)

  ①、创建基于Eureka和Ribbon的服务端 eureka-ribbon-server和两个客户端生产者 eureka-ribbon-client2、消费者:复制项目eureka-ribbon-client,将AritfactId修改为eureka-hystrix-client;

  ②、在消费者中添加依赖:

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

  ③、在启动类ClientApplication上添加@EnableHystrix或@EnableCircuitBreaker;

  ④、修改HystrixController,在其中添加getUser方法,并添加熔断回调方法注解及回调方法:

    @HystrixCommand(fallbackMethod = "getDefaultUser")
    @RequestMapping("/getUser")
    public String getUser() {
        return restTemplate.getForObject("http://client-87/getUser", String.class);
    }

    private String getDefaultUser() {
        System.out.println("熔断,默认回调函数");
        return "{\"username\":\"admin\",\"age\":\"-1\"}";
    }

  ⑤、分别启动eureka-ribbon-server、eureka-ribbon-client2、eureka-hystrix-client,调用localhost:8765/getUser,如图:

  ⑥、关掉eureka-ribbon-client2后,再次调用,发现熔断器调用了回调函数,如图:

  关于Hystrix的配置属性,可以自行测试了解:https://github.com/Netflix/Hystrix/tree/master/hystrix-contrib/hystrix-javanica#configuration

  而我们如何知道hystrix是否开启,可以通过SpringBoot Actuator组件查看,注意:出发回调并不是hystrix打开,他的状态还处在关闭,若失败率达到阈值(默认为5秒内20次失败)后才会打开;

2、基于Feign使用Hystrix

  通常情况下的Hystrix是通过注解@HystrixCommand的fallbackMethod属性实现回调的,而在Feign中,由于Feign是用借口实现的声明式Rest,所以Hystrix的通用方法在这里就不适用于Feign了,实际上在Feign与SpringCloud的依赖库中已经默认的将Hystrix加入其中了,如图:

  那么,该怎么实现呢?

  1. 将上面通用Hystrix的项目中的消费者模块修改为,由于feign中已经集成了hystrix类库,所以就不需要重复导入了:

  pom.xml:

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

  application.properties属性配置文件:

server.port=8762
spring.application.name=client-8762
#默认feign的hystrix为关闭状态
feign.hystrix.enabled=true
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

  启动类添加@EnableFeignClients,控制层通过注入feign的接口去完成声明式调用:

  feign的接口:

package com.cn.feign;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
//接口类上加入的注解中添加属性fallback,指定回调类
@FeignClient(name = "CLIENT-87",fallback = FeignClientFallback.class)
public interface UserFeign {

    @RequestMapping("/getUser")
    public String getUser();

}

  创建回调类:

package com.cn.feign;

import org.springframework.stereotype.Component;

/**
 * @Description: 回调实现类
 * @Param:
 * @return:  
 * @Author:  
 * @Date: 2018/6/19 
 */ 
@Component
class FeignClientFallback implements UserFeign {

    @Override
    public String getUser() {
        System.out.println("熔断,默认回调函数");
        return "{\"username\":\"admin\",\"age\":\"-1\"}";
    }
}

  2.测试结果如下:

  在未关闭生产者服务实例时:

  关闭实例后:

代码示例:https://gitee.com/lfalex/springcloud-exampleeureka-hystrix-clienteureka-feign-hystrix-clienteureka-ribbon-client2eureka-ribbon-server

参考书籍:《SpringCloud与Docker微服务架构实战》周力著

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算

Kubernetes中的Service Mesh(第5部分):Dogfood环境和入口

原文地址:https://dzone.com/articles/a-service-mesh-for-kubernetes-part-v-dogfood-env...

2538
来自专栏乐沙弥的世界

Oracle 自动故障诊断

Oracle故障诊断有助于预防,检测,诊断和解决问题。特别针对的问题是诸如由代码错误,元数据损坏和客户数据损坏引起的重大错误。

772
来自专栏Java帮帮-微信公众号-技术文章全总结

Spring Cloud学习教程1【面试+工作】

3783
来自专栏DannyHoo的专栏

iOS开发中使用DEBUG模式和RELEASE模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

592
来自专栏阿杜的世界

Java Web技术经验总结(二)

743
来自专栏Youngxj

emlog插件微信推送最新文章

1932
来自专栏小狼的世界

局域网中ARP攻击的查找与防范(Linux环境)

Address Resolution Protocol是指当知道一个宿主的网络层地址(IP)去寻找对应的链路层地址(hardware address)的一个方法...

1044
来自专栏我和未来有约会

网站源文件被注入了iframe代码—ARP欺骗的木马病毒攻击

我就很纳闷,运行了4年的网站一直都好好的最近怎么出现病毒提示呢。职业习惯原因打开了网站的源代码查看,原来在网页源代码的头部被加入了iframe嵌套框架网页,该网...

1916
来自专栏宝哥的专栏

Docker系列学习文章 - 网络基本配置(九)

| 导语 上一篇我们讲解了docker的存储配置,那么这篇文章我们讲下docker的网络。存储解决了docker存东西的问题,网络了解后我们就能知道容器如何连...

2697
来自专栏杨建荣的学习笔记

使用shell脚本检测数据库连接访问情况(r10笔记第98天)

最近要迁移几套环境,涉及的数据库有Oracle,MySQL,数量还不少,能够达到的目标就是整合后的服务器缩减幅度达到70%,这样一种迁移场景,就涉及到很多的网络...

34411

扫码关注云+社区