spring cloud系列学习(五、SpringCloud之 Hystrix熔断)

 

 

Hystrix的由来

什么是服务器雪崩

服务雪崩效应是一种因 服务提供者 的不可用导致 服务调用者 的不可用,并将不可用 逐渐放大 的过程.如果所示:

 

在这里插入图片描述

上图中, A为服务提供者, B为A的服务调用者, C和D是B的服务调用者. 当A的不可用,引起B的不可用,并将不可用逐渐放大C
和D时, 服务雪崩就形成了.

雪崩行成的原因

大致可以分成三个阶段:
	服务提供者不可用
		原因有:
			硬件故障: 硬件故障可能为硬件损坏造成的服务器主机宕机, 网络硬件故障造成的服务提供者的不可访问. 	
			程序Bug:  
			缓存击穿缓存击穿一般发生在缓存应用重启, 所有缓存被清空时,以及短时间内大量缓存失效时. 大量的缓存不命中, 
							 使请求直击后端,造成服务提供者超负荷运行,引起服务不可用.
		    用户大量请求:在秒杀和大促开始前,如果准备不充分,用户发起大量请求也会造成服务提供者的不可用.
	重试加大流量
		原因有:
			用户重试:在服务提供者不可用后, 用户由于忍受不了界面上长时间的等待,而不断刷新页面甚至提交表单.
			代码逻辑重试:服务调用端的会存在大量服务异常后的重试逻辑. 
	服务调用者不可用
		原因有:
			同步等待造成的资源耗尽: 当服务调用者使用 同步调用 时, 会产生大量的等待线程占用系统资源. 一旦线程资源被耗
			尽,服务调用者提供的服务也将处于不可用状态, 于是服务雪崩效应产生了.

服务雪崩的应对策略

1.流量控制
	网关限流:因为Nginx的高性能, 目前一线互联网公司大量采用Nginx+Lua的网关进行流量控制, 由此而来的OpenResty也越
			 来越热门.
	用户交互限流:1. 采用加载动画,提高用户的忍耐等待时间. 2. 提交按钮添加强制等待时间机制.
	关闭重试
2.改进缓存模式:
	缓存预加载
	同步改为异步刷新
3.服务器自动扩容
	AWS的auto scaling
4.服务调用者降级服务
	资源隔离:资源隔离主要是对调用服务的线程池进行隔离.
	对依赖服务进行分类:我们根据具体业务,将依赖服务分为: 强依赖和若依赖. 强依赖服务不可用会导致当前业务中止,而弱	
						依赖服务的不可用不会导致当前业务的中止.
	不可用服务的调用快速失败:不可用服务的调用快速失败一般通过 超时机制, 熔断器 和熔断后的 降级方法 来实现.

重量级炸弹 Hystrix

首先讲一个Hystrix的设计原则
	资源隔离
	熔断器
	命令模式

废话不多说 直接撸代码

我们springcloud系列第二章的时候写了一个springcloud-eureka-ribbon的moudle,此文章基础上做Hystrix的应用

首先找到ribbon的pom.xml文件

 

导入依赖

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

 

然后修改RibbonConsumerApplication启动类,添加注解@EnableHystrix

package com.springcloud.ribbonconsumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@EnableHystrix // 启用 hystrix 熔断机制相关配置
@EnableDiscoveryClient
@SpringBootApplication
public class RibbonConsumerApplication {
    @Bean
    @LoadBalanced
    RestTemplate restTemplate () {
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(RibbonConsumerApplication.class, args);
    }

}

然后修改调用服务的接口ConsumerController又称为消费类ConsumerController

加入了@HystrixCommand注解,并设置了服务调用失败的回调方法 fallbackMethod = "getInfoFailure"

/**
     *  加入了@HystrixCommand注解,并设置了服务调用失败的回调方法 fallbackMethod = "getInfoFailure"
     * @return
     */
    @HystrixCommand(fallbackMethod = "getInfoFailure")

package com.springcloud.ribbonconsumer.Controller;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
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;
import org.springframework.web.client.RestTemplate;

@RestController
public class ConsumerController {

    @Autowired
    RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "getInfoFailure")
    @RequestMapping(value ="/ribbon-consumer", method = RequestMethod.GET)
    public String helloConsumer() {
       return restTemplate.getForEntity("http://eureka-client/hello",
                String.class).getBody();
    }
    
    /**
     * 服务 eureka-client/hello 调用失败的回调方法
     *
     * @return
     */
    public String getInfoFailure() {
        String message = "网络繁忙,请稍后再试-_-。PS:服务消费者自己提供的信息";
        return message;
    }
}

分别启动模块了:

1.EurekaServerApplication

2.EurekaClientApplication,EurekaClientApplication1,EurekaClientApplication2

3.RibbonConsumerApplication

访问:http://localhost:3456/

http://localhost:8083/ribbon-consumer

然后我们要做到就是停掉8081端口的服务

再次访问会出现

此时此项目就完成了熔断机制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这个月太忙没时间看C++

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值