【SpringCloud基础】Hystrix熔断器

前言

Github:https://github.com/yihonglei/thinking-in-springcloud

Eureka注册中心:eureka-server

服务提供者(订单服务):eureka-provider-order

服务容错(用户服务):eureka-consumer-hystrix

一 熔断

在微服务架构中,系统被拆分成多个服务单元,各个单元应用间通过服务注册与订阅方式互相依赖。

每个服务单元在不同的进程中运行,依赖通过远程调用的方式执行,这样就可能出现网络原因,

或者是服务自身出现调用故障或延迟,这些状况会直接导致调用方对外的服务也出现延迟,

如果这个时候调用方的请求还在不断增加,最后就会因为等待出现故障的依赖方响应形成任务的积压,

大量任务积压,就会导致整个服务瘫痪,后果不言而喻。

在现实生活中,断路器是指能够关合、承载和开断正常回路条件下的电流并能关合、

在规定的时间内承载和开断异常回路条件下的电流的开关装置。 断路器可用来分配电能,

不频繁地启动异步电动机,对电源线路及电动机等实行保护,

当它们发生严重的过载或者短路及欠压等故障时能自动切断电路,

其功能相当于熔断器式开关与过欠热继电器等的组合。

在分布式系统中,断路器模式的租用也是类似的,当某个服务单元发生故障之后,

通过断路器的故障监控,向调用方法返回一个自定义错误响应,而不是长时间的等待,

造成分布式系统瘫痪。

Spring Cloud为了解决上面这些问题,基于开源框架Netflix实现了Spring Cloud Hystrix,

该框架的目标在于通过控制哪些访问远程系统、服务等,从而对于网络延迟和故障提供更强大的容错能力。

Hystrix具备很强大的功能,比如服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并以及

服务监控等功能。

让我们通过一个简单例子看下Hystrix是怎么用的。

二 Hystrix项目实例

1、项目结构

2、引入Hystrix依赖包

<!-- 引入断路器依赖 -->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

3、开启断路器

在启动类中通过注解@EnableCircuitBreaker开启断路器功能。

package com.jpeony.hystrix;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * -- @SpringBootApplication 启动一个Spring Boot应用程序
 * -- @EnableDiscoveryClient 服务发现与注册,当应用启动时,将应用注册到配置的注册中心
 *
 * @author yihonglei
 */
@EnableDiscoveryClient
@SpringBootApplication
@EnableCircuitBreaker
public class ConsumerHystrixApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerHystrixApplication.class, args);
    }
}

4、UserService

通过注解@HystrixCommand指定回调方法。

package com.jpeony.hystrix.service;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

/**
 * 用户服务
 *
 * @author yihonglei
 */
@Service
public class UserService {
    @Autowired
    private RestTemplate restTemplate;

    /**
     * 调用订单服务,查询用户订单信息
     */
    @HystrixCommand(fallbackMethod = "queryOrderInfoFallback")
    public String queryOrderInfo() {
        ResponseEntity<String> responseEntity =
                restTemplate.getForEntity("http://EUREKA-PROVIDER-ORDER/order/queryOrderInfo", String.class);

        return responseEntity.getBody();
    }

    /**
     * 当服务调不通时,会调用fallbackMethod对应的容错方法
     */
    public String queryOrderInfoFallback() {
        // 处理业务逻辑
        return "error-hystrix-test";
    }
}

5、在Controller中注入Service

package com.jpeony.hystrix.controller;

import com.jpeony.hystrix.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * -- @RestController这个注解等价于spring mvc用法中的@Controller+@ResponseBody
 *
 * @author yihonglei
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 查询用户订单信息
     */
    @RequestMapping(value = "/queryOrderInfo", method = {RequestMethod.GET, RequestMethod.POST})
    public String queryOrderInfo() {

        return userService.queryOrderInfo();
    }
}

三 实例测试

1、启动服务

1)执行eureka-server项目的EurekaServerApplication,启动注册中心;

2)执行eureka-provider-order项目的EurekaOrderApplication,启动服务提供者;

3)执行eureka-consumer-hystrix项目的ConsumerHystrixApplication,启动服务消费者;

2、访问服务

访问路径:http://localhost:8005/user/queryOrderInfo

UserService中调用EUREKA-PROVIDER-ORDER服务,成功返回order服务的结果。

如果我们断开EUREKA-PROVIDER-ORDER服务,访问必然会超时,返回结果。

返回的结果为故障方法结果,也即当访问服务出现故障时,断路器会进行处理,

调用了userService.queryOrderInfo()上配置的回调方法,将回调处理的结果直接返回给了客户端。

我们也可以给EUREKA-PROVIDER-ORDER服务的被调用方法设置一个超时时间返回,

Hystrix默认超时时间为2000毫秒,如果调用EUREKA-PROVIDER-ORDER服务的queryOrderInfo方法

设置2000超时,请求服务超时,将会触发发熔断请求,并执行回调方法,作为调用响应结果返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值