SpringCloud之微服务容错的实现

1.雪崩效应

雪崩效应

如上图所示,假设我们有3个微服务A,B,C,A调用B,B调用C,如果C挂掉了,由于B是同步调用,不断等待,导致资源耗尽,B也挂掉,接下来A也挂掉了,造成了雪崩效应!为了防止雪崩效应,所以我们要在本篇文章中介绍Hystrix。

2.Hystrix

Hystrix

hystrix对应的中文名字是“豪猪”,豪猪周身长满了刺,能保护自己不受天敌的伤害,代表了一种防御机制,反正这种猪我是没吃过的,不敢吃。那么Hystrix又具备什么样的特点呢:

2.1服务降级

双11的时候我们经常看到哎哟被挤爆了,这其实就是一种服务降级。那么Hystrix是怎么做到服务降级的呢?

2.1.1优先核心服务,非核心服务不可用或者弱可用

比如在一个系统中我们可能有限保证订单和支付服务,但是对于广告之类的服务就若花掉

2.1.2通过HystrixCommand注解

2.1.3fallbackMethod中具体实现降级逻辑

2.1.4具体使用

2.1.4.1pom.xml

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

2.1.4.2启动类

//@SpringBootApplication
//@EnableDiscoveryClient
//@EnableCircuitBreaker
@SpringCloudApplication
public class OrderApplication {

  public static void main(String[] args) {
    SpringApplication.run(OrderApplication.class, args);
  }
}

在这里我们引入了@EnableCircuitBreaker这个注解,但是可以看到我们的main函数所在的类上面有好多注解了,我们这里用一个SpringCloudApplication注解包含上面的3个注解

2.1.4.3HystrixCommand与fallback的使用

 @HystrixCommand(fallbackMethod="fallback")
  @GetMapping("/getProductInfoList")
  public String getProductInfoList(@RequestParam("number") Integer number) {
    RestTemplate restTemplate = new RestTemplate();
    return restTemplate.postForObject("http://127.0.0.1:8005/product/listForOrder",
        Arrays.asList("157875196366160022"),
        String.class);
  }

  private String fallback() {
    return "太拥挤了, 请稍后再试~~";
  }

假设你的方法有几万个,上面的这种写法用@HystrixCommand这个注解肯定要用几万次,太麻烦了,我们来优化和更新一下:

@RestController
@DefaultProperties(defaultFallback = "defaultFallback")
public class HystrixController {

  @HystrixCommand(commandProperties = {
      @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
  })
  @GetMapping("/getProductInfoList")
  public String getProductInfoList(@RequestParam("number") Integer number) {
    RestTemplate restTemplate = new RestTemplate();
    return restTemplate.postForObject("http://127.0.0.1:8005/product/listForOrder",
        Arrays.asList("157875196366160022"),
        String.class);
  }

  private String defaultFallback() {
    return "默认提示:太拥挤了, 请稍后再试~~";
  }
}

直接在Controller上面写了一个DefaultProperties这样的注解,然后定义了一个defaultFallback这样的方法,我们在getProductInfoList这个方法上的@HystrixCommand注解上可以不在注明fallback方法了,因为我们都用defaultFallback了。但是在这里我们用了一个commandProperties = {

@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000"),这个表示当调用方法超过3秒钟时,就服务降级

2.2依赖隔离

Hystrix使用依赖隔离完成的是线程池的隔离,它为每个HystrixCommand创建一个单独的线程池。这样某个在HystrixCommand包装下的依赖服务出现延迟过高的情况,也只是对该依赖的服务调用产生影响,并不会拖慢其他服务。使用了HystrixCommand将某个函数包装成Hystrix命令时,Hystrix框架就会自动的为这个函数实现了依赖隔离,所以依赖隔离和服务降级是一体化实现的。

2.3服务熔断

当服务调用发生错误到一定比例的时候,断路器就会打开,服务的调用会转向另外一个指定的调用方法,这就是服务熔断,这样说比较抽象,我们看看下面这个图:

断路器

断路器一共有三个状态,初始的时候是closed状态,如果用户不断调用且失败次数达到了一定的阈值,这个时候断路器就会变成open状态,接下来用户不断调用这个接口都是进入到另一个缺省方法中。但是断路器不会一直处于open状态,当open状态达到一定时间后,断路器会变成half open状态,进入half open状态后,将会允许请求再次访问真正的服务,如果访问成功了,断路器会变成closed状态,服务恢复正常,如果还失败又再次进入到open状态。

2.3.1代码演示

  @HystrixCommand(commandProperties = {
      @HystrixProperty(name = "circuitBreaker.enabled", value = "true"),         //设置熔断
      @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), //请求数达到后才计算
      @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), //休眠时间窗
      @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"),  //错误率
  })
  @GetMapping("/getProductInfoList")
  public String getProductInfoList(@RequestParam("number") Integer number) {
    if (number % 2 == 0) {
      return "success";
    }

    RestTemplate restTemplate = new RestTemplate();
    return restTemplate.postForObject("http://127.0.0.1:8005/product/listForOrder",
        Arrays.asList("157875196366160022"),
        String.class);
  }

通过代码,我们可以看到,有四个参数,但是最重要的还是这三个参数:

1.circuitBreaker.requestVolumeThreshold 请求数达到后才计算

2.circuitBreaker.sleepWindowInMilliseconds open状态达到这个时间后,就会进入到半熔断状态

3.circuitBreaker.errorThresholdPercentage 失败请求比例

2.3.2使用配置项

从上面的代码中,我们可以看到,很多配置项都是写在了代码里面,接下来,我们把这些配置放到配置文件里面去:

@HystrixCommand
  @GetMapping("/getProductInfoList")
  public String getProductInfoList(@RequestParam("number") Integer number) {
    if (number % 2 == 0) {
      return "success";
    }

    RestTemplate restTemplate = new RestTemplate();
    return restTemplate.postForObject("http://127.0.0.1:8005/product/listForOrder",
        Arrays.asList("157875196366160022"),
        String.class);
  }

在yaml文件中添加这样的配置:

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

在yaml文件中有一个getProductInfoList配置项,和方法名一模一样,还有一个default选项,default选项表示所有被HystrixCommand注解的方法都可以用这个配置,getProductInfoList表示只有这个方法可以用这个配置项。

2.3.3feign-hystrix的使用

上面的小章节我们使用的是RestTemplate模板,接下来我们使用feign配合hystrix来进行使用,有意思的是大家可以看看spring-cloud-starter-feign的pom.xml其实已经在内部依赖了hystrix。

2.3.3.1yaml配置文件

feign:
 hystrix:
  enabled: true

2.3.3.2FeignClient

@FeignClient(name = "product", fallback = ProductClient.ProductClientFallback.class)
public interface ProductClient {

  @PostMapping("/product/listForOrder")
  List<ProductInfoOutput> listForOrder(@RequestBody List<String> productIdList);

  @PostMapping("/product/decreaseStock")
  void decreaseStock(@RequestBody List<DecreaseStockInput> decreaseStockInputList);

  @Component
  static class ProductClientFallback implements ProductClient {

    @Override
    public List<ProductInfoOutput> listForOrder(List<String> productIdList) {
      return null;
    }

    @Override
    public void decreaseStock(List<DecreaseStockInput> decreaseStockInputList) {

    }
  }
}

两个注意点,一个是fallback的配置,还有一个是内部类需要加上@Component注解

2.3.3.3调用方记得加上ComponentScan

2.4监控HystrixDashBoard

2.4.1pom.xml

spring-cloud-starter-hystrix-dashboard

2.4.2yaml文件

management:
 context-path: /

2.4.3访问

IP:PORT/hystrix

服务容错就讲到这里,下一章节我们讲解下服务跟踪。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 浅谈Spring Cloud下微服务权限方案

    背景 从传统的单体应用转型Spring Cloud的朋友都在问我,Spring Cloud下的微服务权限怎么管?怎么设计比较合理?从大层面讲叫服务权限,往小处拆分,分别为三块:用户认证.用户权限.服务校验. 用户认证 传统的单体应用可能习惯了session的存在,而到了Spring cloud的微服务化后,session虽然可以采取分布式会话来解决,但终究不是上上策.开始有人推行Spring Cloud Security结合很好的OAuth2,后面为了优化OAuth 2中Access Token

  • 详解SpringCloud微服务架构之Hystrix断路器

    一:什么是Hystrix 在分布式环境中,许多服务依赖项中的一些将不可避免地失败.Hystrix是一个库,通过添加延迟容差和容错逻辑来帮助您控制这些分布式服务之间的交互.Hystrix通过隔离服务之间的访问点,停止其间的级联故障以及提供回退选项,从而提高系统的整体弹性. Hystrix旨在执行以下操作 1:对通过第三方客户端库访问(通常通过网络)的依赖关系提供保护并控制延迟和故障. 2:隔离复杂分布式系统中的级联故障. 3:快速发现故障,尽快恢复. 4:回退,尽可能优雅地降级. 5:启用近实时监

  • springcloud使用Hystrix进行微服务降级管理

    前言:目前我们的项目是微服务架构,基于dubbo框架,服务之间的调用是通过rpc调用的.刚开始没有任何问题,项目运行健康.良好.可是过了一段时间,线上总有人反应查询订单失败,等过了一段时间才能查到.这是怎么回事呢?打开后台的日志一看出现了一些RpcException和TimeOutException,原来是远程调用超时了,可能某个服务在请求的高发期访问数据库异常,IO阻塞,返回接口异常了.后来这个问题越来越频繁,如何解决这个棘手的问题呢? 一:Hystrix是什么? 1.1:基本解释 Hystr

  • 详解利用SpringCloud搭建一个最简单的微服务框架

    Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等操作提供了一种简单的开发方式. Spring Cloud包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Spring Cloud Config.Spring Cloud Netflix.Spring Cloud CloudFoundry.Spring Cloud AWS.S

  • spring cloud eureka微服务之间的调用详解

    微服务之间的调用如何实现 首先 你需要两个或以上的微服务模块 至于怎么创建可以参考我上一篇博客 spring cloud eureka注册中心 如果想在页面显示 那么需要先加上 compile 'org.springframework.boot:spring-boot-starter-thymeleaf' 这个thymeleaf依赖 springboot推荐使用thymeleaf模板 它的最大好处就是原型即是模板 后缀是html html文件 需要放在resources/templates文件夹

  • 浅谈SpringCloud实现简单的微服务架构

    Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均衡.断路器.数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署.Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟.经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂.易部署和易维护的分布式系统开发工具包. 接下

  • SpringCloud之微服务容错的实现

    1.雪崩效应 雪崩效应 如上图所示,假设我们有3个微服务A,B,C,A调用B,B调用C,如果C挂掉了,由于B是同步调用,不断等待,导致资源耗尽,B也挂掉,接下来A也挂掉了,造成了雪崩效应!为了防止雪崩效应,所以我们要在本篇文章中介绍Hystrix. 2.Hystrix Hystrix hystrix对应的中文名字是"豪猪",豪猪周身长满了刺,能保护自己不受天敌的伤害,代表了一种防御机制,反正这种猪我是没吃过的,不敢吃.那么Hystrix又具备什么样的特点呢: 2.1服务降级 双11的时

  • SpringCloud feign微服务调用之间的异常处理方式

    如何优雅地处理微服务间调用的异常 现在微服务架构盛行,其中spring cloud方案就很具有代表. 那么在微服务之间进行调用,如果被调用的服务挂了,调用方如何感知呢? 一.加上hystrix熔断 在定义feignClient的地方指定熔断,如下图 当被调用服务不可用或者被调用方发生错误的时候,会触发熔断,但是,如果被调用方抛出异常,调用方怎么知道究竟是出了什么问题呢? 那,这就出现了 二.feign全局异常处理 我们不得不提到feign提供的一个接口叫做ErrorDecoder, 是用来处理f

  • SpringCloud Feign实现微服务之间相互请求问题

    目录 Feign简介 Spring Cloud 组件依赖版本 Feign实现服务之间访问 ☘创建nacos-consumer-feign微服务 创建feign client ☘nacos-provider微服务 Feign微服务之间访问测试 ☘Feign容错机制 上篇文章说了通过RestTemplate实现微服务之间访问:https://www.jb51.net/article/252981.htm,这篇文章将通过Feign实现微服务之间访问.代码基于RestTemplate实现微服务之间访问基

  • SpringCloud 微服务最佳开发实践

    现在基于SpringCloud的微服务开发日益流行,网上各种开源项目层出不穷.我们在实际工作中可以参考开源项目实现很多开箱即用的功能,但是必须要遵守一定的约定和规范. 本文结合我们实际的开发中遇到的一些问题整理出了一份微服务开发的实践规范,欢迎各位大佬拍砖指点. Maven规范 1.所有项目必须要有一个统一的parent模块 所有微服务工程都依赖这个parent,parent用于管理依赖版本,maven仓库,jar版本的统一升级维护 在parent下层可以有 core,starter,rate-

  • SpringCloud基于RestTemplate微服务项目案例解析

    目录 基于RestTemplate微服务项目 一.构建父工程 二.构建serverspringcloud-api(公共子模块) 三.创建部门微服务提供者 四.创建部门微服务消费者 五.总结 基于RestTemplate微服务项目 在写SpringCloud搭建微服务之前,我想先搭建一个不通过springcloud只通过SpringBoot和Mybatis进行模块之间额通讯.然后在此基础上再添加SpringCloud框架. 下面先对案例做个说明 该项目有一个maven父模块,其中里面有三个子模块:

  • 微服务如何通过feign.RequestInterceptor传递参数

    目录 微服务通过feign.RequestInterceptor传递参数 创建自定义请求拦截器 具体获取逻辑如下 feign的拦截器RequestInterceptor 首先创建自定义的RequestInterceptor 然后定义一个feign的接口类 再创建一个controller 运行程序测试一下接口 查看程序打印 微服务通过feign.RequestInterceptor传递参数 Feign 支持请求拦截器,在发送请求前,可以对发送的模板进行操作,例如设置请求头等属性,自定请求拦截器需要

  • 新手学习微服务SpringCloud项目架构搭建方法

    这篇文章主要介绍了新手学习微服务SpringCloud项目架构搭建方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Spring的微服务框架SpringCloud受到众多公司欢迎,给大家带来一篇框架搭建入门.本次采用的版本是Spring Cloud版本为Finchley.RELEASE. 一.SpringCloud项目简介 spring cloud: 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.

  • 解析SpringCloud简介与微服务架构

    1. 微服务架构 1.1 微服务架构理解 微服务架构(Microservice Architecture)是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦.你可以将其看作是在架构层次而非获取服务的类上应用很多SOLID原则.微服务架构是个很有趣的概念,它的主要作用是将功能分解到离散的各个服务当中,从而降低系统的耦合性,并提供更加灵活的服务支持. 概念:把一个大型的单个应用程序和服务拆分为数个甚至数十个的支持微服务,它可扩展单个组件而不是整个的应用程序堆栈,从而满足服务等

  • SpringCloud微服务基础简介

    一.什么是Spring Cloud? SpringCloud 对常见的分布式系统模式提供了简单易用的编程模型,帮助开发者构建弹性.可靠.协调的应用程序. SpringCloud 是在SpringBoot的基础上构建的,使开发者可以轻松入门并快速提高工作效率. SpringCloud 提供了一套微服务解决方案,包括服务注册与发现,配置中心,全链路监控,服务网关,负载均衡,熔断器等组件,除了基于NetFlix的开源组件做高度抽象封装之外,还有一些选型中立的开源组件. SpringCloud 为开发人

随机推荐