微服务架构整理-(八springcloud实战之hystrix[1])(代码片段)

浦江之猿 浦江之猿     2022-12-01     146

关键词:

SpringCloud实战之Hystrix [1]-基本用法

前言

我们知道,在微服务架构中,每个服务都是独立运行,服务与服务之间通过注册中心彼此发现和消费对方提供的服务,但是由于种种原因,可能存在如下问题:

  • 因网络原因服务的响应太慢
  • 某服务挂掉,还没有被踢除的情况下,导致访问请求一直得不到响应。

当请求得不到响应,后续不断有新的请求到来时,就会出现请求堵塞的情况,一个服务的堵塞引起下一个服务的堵塞,当堵塞蔓延到整个系统时,导致大部分微服务都无法正常工作,从而导致整个系统崩掉,这就是微服务架构中的雪崩现象。为了解决这个问题,在微服务架构中产生了熔断机制。熔断是电路中的专有名词,当电路出现问题(例如过载)时,熔断器立马“跳闸”,从而保护整个电路。微服务之父Martin Fowler在其论文CircuitBreaker中提出此概念。
其设计思路是这样,当服务提供者在规定时间内没有响应时,直接跳转到一个服务降级处理函数,而不是长时间的等待,这样避免调用时因为等待而线程一直得不到释放,导致雪崩的现象。

Hystrix概念

针对上述情况,Netflix提供了一套开源框架Hystrix,该框架的目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。 Hystrix 具备服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并以及服务监控等强大功能。 SpringCloud 在此基础上进行了封装实现了 熔断器、线程隔离等一系列服务保护功能。

Hystrix使用

在SpringCloud 中使用熔断器 Hystrix 是非常简单和方便的, 只需要简单两步即可。这里继续以之前的商城为例,在自己的订单(order)中查询商品(product)。

添加依赖

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

配置启动类

在启动类中使用 @EnableCircuitBreaker 注解开启断路器功能

@SpringBootApplication
// 激活EurekaClient
@EnableEurekaClient
//激活Hystrix
@EnableCircuitBreaker
public class OrderApplication 
    public static void main(String[] args) 
        SpringApplication.run(OrderApplication.class, args);
    

添加熔断机制

在服务消费者的方法上添加注解@HystrixCommand(fallbackMethod="handleTimeout"),其中fallbackMethod中指定的是服务降级后处理的函数。当在指定的时间里没有响应时,便会回调handle函数。响应时间默认为1000ms,可以通过commandProperties来指定,例如将响应时间设为1500ms,@HystrixCommand(fallbackMethod = "handleTimeout",commandProperties = @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "1500") )

    @GetMapping(value = "/buy/id")
    //@HystrixCommand(fallbackMethod = "handleTimeout")
    @HystrixCommand(fallbackMethod = "handleTimeout",commandProperties = 
        @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "1500")
    )
    public Product findById(@PathVariable Long id) 
        Product product = null;
        URI uri = null;
        try 
            uri = new URI("http://service-product/product/" + id);
         catch (URISyntaxException e) 
            e.printStackTrace();
        
        //这里故意弄一个超时,强迫其服务降级
        try 
            Thread.sleep(4000);
         catch (InterruptedException e) 
            e.printStackTrace();
        
        product = restTemplate.getForObject(uri, Product.class);
        return product;
    

服务降级

有两种情况可以导致服务降级,一种是调用服务时超时,另一种是调用服务时抛出异常。

超时

调用服务提供者的方法超时时,Hystrix机制便会进行服务降级,通过回调@HystrixCommand中fallbackMethod指定的函数来进行降级,这种方法虽然得不到用户想要的结果,但保证了服务的可用性,不至于造成雪崩现象。这里需要注意此函数的返回值以及参数列表需要与添加熔断的方法保持一致。接上面的代码,这里给出handleTimeout方法。

    public Product handle(Long id) 
        Product product = new Product();
        product.setId(0L);
        product.setName("A fake product");
        product.setPrice(new BigDecimal(0));
        return product;
    

运行结果 :


    "id": 0,
    "name": "A fake product",
    "price": 0

注意:超时不管发生在服务调用方,还是服务提供者方都会进行服务降级。针对上面的两段代码,在服务消费者的方法findById上添加的熔断机制,findById中调用了服务提供者的方法 http://service-product/product/id, 不管在哪个方法中发生了超时,都会回调handleTimeout方法。

异常

当调用服务时发生了异常,默认情况下也是回调服务降级函数,如果在发生异常时不想进行服务降级,可以在@HystrixCommand添加ignoreExceptions = Exception.class 。例如:
异常服务降级

 	@GetMapping(value = "/buy1/id/price")
    @HystrixCommand(fallbackMethod = "handleException")
    public Product findByIdAndPrice1(@PathVariable Long id, @PathVariable BigDecimal price) 
        Product product = null;
        // 这里故意弄一个运行时异常超时,强迫其服务降级
        int i = 1 / 0;

        product = restTemplate.getForObject("http://service-product/product/1/2", Product.class, id, price);
        return product;
    

    public Product handleException(Long id, BigDecimal price, Throwable throwable) 
        Product product = new Product();
        product.setId(0L);
        product.setName(throwable.getMessage());
        product.setPrice(new BigDecimal(0));
        return product;
    

运行结果:


    "id": 0,
    "name": "/ by zero",
    "price": 0

异常服务不降级
当将注解改成:@HystrixCommand(fallbackMethod = "handleException", ignoreExceptions = Exception.class)时,最终的运行结果为:


    "timestamp": "2022-05-24T14:57:00.759+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "/ by zero",
    "path": "/order/buy1/1/8000"

后端log为:

java.lang.ArithmeticException: / by zero

总结

关于Hystrix的使用基本就介绍完了,因为SpringCloud对其进行了二次封装,所以使用其来非常方便,下一篇介绍Hystrix的自定义异常处理。最后,希望本文能帮助大家,祝大家在IT之路上少走弯路,一路绿灯不堵车,测试一性通过,bug秒解!
源码下载

微服务架构整理-(七springcloud实战之resttemplate)(代码片段)

SpringCloud实战之RestTemplateGET请求getForEntitygetForObjectPOST请求postForEntitypostForObjectpostForLocationPUT请求DELETE请求总结RestTemplate不仅在SpringCloud中会使用,一般在服务之间相互调用的时候会使用此类。上一篇介绍Ribbon的时候通过在此类... 查看详情

微服务架构整理-(十springcloud实战之hystrix[3])(代码片段)

SpringCloud实战之Hystrix[3]-看版监控前言搭建Dashboard服务创建springboot工程添加依赖配置启动类添加配置文件引用Dashboard服务添加Hystrix依赖添加springboot服务监控依赖配置springboot监控接口的访问权限结果总结前言当需要查看服务的状... 查看详情

微服务架构整理-(十springcloud实战之hystrix[3])(代码片段)

SpringCloud实战之Hystrix[3]-看版监控前言搭建Dashboard服务创建springboot工程添加依赖配置启动类添加配置文件引用Dashboard服务添加Hystrix依赖添加springboot服务监控依赖配置springboot监控接口的访问权限结果总结前言当需要查看服务的状... 查看详情

微服务架构整理-(六springcloud实战之ribbon)

SpringCloud实战之Ribbon负责均衡介绍Ribbon概念Ribbon中的负载均衡算法Ribbon使用添加一个服务提供者添加Ribbon区别服务提供者访问服务提供者运行结果总结负责均衡介绍负载均衡分为硬件负载均衡和软件负载均衡。常用见的如下:... 查看详情

微服务架构整理-(九springcloud实战之hystrix[2])

SpringCloud实战之Hystrix[2]-自定义异常熔断处理自定义熔断机制测试同步调用异步调用总结上文中,对异常处理是使用注解@HystrixCommand完成的,当然也可以不使用此注解来完成,我们可以自定义一个机制处理超时,... 查看详情

微服务架构整理-(十二springcloud实战之zuul网关)(代码片段)

SpringCloud实战之Zuul网关Zuul概念Zuul构建网关创建SpringBoot工程添加依赖添加注解添加配置文件基础配置注册Eureka添加路由规则Zuul请求过滤定义过虑逻辑请求结果Zuul路由规则总结Zuul概念Zuul是Netflix旗下的又一重要成员,是一个... 查看详情

微服务架构整理-(六springcloud实战之ribbon)(代码片段)

SpringCloud实战之Ribbon负责均衡介绍Ribbon概念Ribbon中的负载均衡算法Ribbon使用添加一个服务提供者添加Ribbon区别服务提供者访问服务提供者运行结果总结负责均衡介绍负载均衡分为硬件负载均衡和软件负载均衡。常用见的如下:... 查看详情

微服务架构整理-(九springcloud实战之hystrix[2])(代码片段)

SpringCloud实战之Hystrix[2]-自定义异常熔断处理自定义熔断机制测试同步调用异步调用总结上文中,对异常处理是使用注解@HystrixCommand完成的,当然也可以不使用此注解来完成,我们可以自定义一个机制处理超时,... 查看详情

微服务架构整理-(十springcloud实战之hystrix[3])(代码片段)

SpringCloud实战之Hystrix[3]-看版监控前言搭建Dashboard服务创建springboot工程添加依赖配置启动类添加配置文件引用Dashboard服务添加Hystrix依赖添加springboot服务监控依赖配置springboot监控接口的访问权限结果总结前言当需要查看服务的状... 查看详情

微服务架构整理-(十一springcloud实战之openfeign)(代码片段)

SpringCloud实战之OpenFeignOpenFeign介绍实现消费者功能创建SpringBoot工程添加依赖添加注解声明服务在Controller中调用服务添加配置文件结果实现负载均衡功能实现熔断功能配置熔断开关实现回调函数获取异常信息总结OpenFeign介绍OpenFeig... 查看详情

微服务架构整理-(十二springcloud实战之zuul网关)(代码片段)

SpringCloud实战之Zuul网关Zuul概念Zuul构建网关创建SpringBoot工程添加依赖添加注解添加配置文件基础配置注册Eureka添加路由规则Zuul请求过滤定义过虑逻辑请求结果Zuul路由规则总结Zuul概念Zuul是Netflix旗下的又一重要成员,是一个... 查看详情

springcloud实战微服务之——微服务简介以及入门使用(代码片段)

微服务概述微服务是什么?微服务解决了什么问题?微服务有什么特点?单体架构是什么?一个归档包包含了应用所有功能的应用程序,我们通常称之为单体应用。架构单体应用的架构风格,我们称之为单... 查看详情

springcloud微服务安全实战_6-1_微服务之间的通讯安全之概述

   到目前为止已经实现了一个基于微服务的,前后端分离(这里我用的jquery做的,并不是真的前后端分离,因为我不会vue和angular所以没用)的架构。在网关上做了限流、认证、审计、授权等安全机制,在前端应用上... 查看详情

springcloud实战微服务之——微服务简介以及入门使用(代码片段)

微服务概述微服务是什么?微服务解决了什么问题?微服务有什么特点?单体架构是什么?一个归档包包含了应用所有功能的应用程序,我们通常称之为单体应用。架构单体应用的架构风格,我们称之为单... 查看详情

你真的了解微服务架构吗?听听八年阿里架构师怎样讲述dubbo和springcloud微服务架构

...源微服务架构框架提供了微服务的关键思路,例如Dubbo和SpringCloud。各大互联网公司也有自研的微服务框架,但其模式都于这二者相差不大。微服务主要的优势如下:1、降低 查看详情

听听八年阿里架构师怎样讲述dubbo和springcloud微服务架构

转自:https://baijiahao.baidu.com/s?id=1600174787011483381&wfr=spider&for=pc微服务架构是互联网很热门的话题,是互联网技术发展的必然结果。它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终... 查看详情

微服务之springcloud实战:springcloudeureka服务治理

服务治理  SpringCloudEureka是SpringCloudNetflix微服务套件的一部分,它基于NetflixEureka做了二次封装,主要完成微服务的服务治理功能,SpringCloud通过为Eureka增加了SpringBoot自动化配置,只需要简单的依赖和配置就可完成Eureka整合搭建... 查看详情

微服务springcloud+docker入门到高级实战

第一章课程介绍和学习路线1、微服务架构SpringCloud课程介绍简介:课程介绍和课程大纲讲解,讲课风格和重点内容理解技巧2、技术选型和学后水平简介:课程所需基础和技术选型讲解,学完课程可以到达怎样的程度,第二章架... 查看详情