Hystrix断路器

1.前景

负载分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将失败。
雪崩:当发现一个模块下的某个实例是被之后,这个时候这个模块依然还会接受浏览,然后这个有问题的模块还调用了其他的模块,这样就会发生级联故障,又称雪崩

2.是什么

Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下不会导致整体服务的失败,避免级联故障,提高分布式系统的弹性。

断路器 : 当某个服务单元发生故障之后,通过断路器的故障监控,向调用方向返回一个符合预期的、可处理的备选相应(FallBack),而不是长时间的等待或者抛出调用放无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

3.作用

服务降级

服务器忙,请稍后再试,不让客户端等待并立刻返回一个友好提示,fallback
会触发降级的几种情况
1.程序运行时异常
2.超时
3.服务熔断触发服务降级
4.线程池/信号量打满 也会导致服务降级

服务熔断

当到达最大服务访问后,直接拒接访问,拉闸限电,然后调用服务器降级的方法并返回友好提示
类似于保险丝,当电流过大会被强制断电

服务限流

秒杀等高并发操作限制流量

DEMO

Payment模块

Pom

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <!--eureka client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
            <groupId>com.study</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

Yml文件

server:
  port: 8001

spring:
  application:
    name: cloud-provider-hystrix-payment

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka

SpringBoot启动类

@SpringBootApplication
@EnableCircuitBreaker
@EnableEurekaClient
public class PaymentHystrixMain8001 {
	public static void main(String[] args) {
		SpringApplication.run(PaymentHystrixMain8001.class,args);
	}

	/**
	 *此配置是为了服务监控而配置,与服务容错本身无关,springcloud升级后的坑
	 *ServletRegistrationBean因为springboot的默认路径不是"/hystrix.stream"
	 *只要在自己的项目里配置上下面的servlet就可以了
	 */
	@Bean
	public ServletRegistrationBean getServlet() {
		HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
		ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
		registrationBean.setLoadOnStartup(1);
		registrationBean.addUrlMappings("/hystrix.stream");
		registrationBean.setName("HystrixMetricsStreamServlet");
		return registrationBean;
	}
}

Service

public interface PaymentService {

	String paymentInfo_OK(Integer id);

	String paymentInfo_TimeOut(Integer id);

	 String paymentCircuitBreaker(@PathVariable("id") Integer id);
}

Impl

@Service
public class HystrixServiceImpl implements PaymentService {



	@Override
	public String paymentInfo_OK(Integer id) {
		return "线程池:"+Thread.currentThread().getName()+
				"paymentInfo_OK,id: "+id+"\t"+"O(∩_∩)O";
	}
	@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",
			commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")})
	@Override
	public String paymentInfo_TimeOut(Integer id) {

		try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); }
		return "线程池:"+Thread.currentThread().getName()+"paymentInfo_TimeOut,id: "+id+"\t"+"O(∩_∩)O,耗费3秒";
	}

	public String paymentInfo_TimeOutHandler(Integer id) {
		return "/(ㄒoㄒ)/调用支付接口超时或异常:\t"+ "\t当前线程池名字" + Thread.currentThread().getName();
	}


	//=========服务熔断
	@Override
	@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",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"),
	})
	public String paymentCircuitBreaker(@PathVariable("id") Integer id)
	{
		if(id < 0)
		{
			throw new RuntimeException("******id 不能负数");
		}
		String serialNumber = IdUtil.simpleUUID();

		return Thread.currentThread().getName()+"\t"+"调用成功,流水号: " + serialNumber;
	}
	public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id)
	{
		return "id 不能负数,请稍后再试,/(ㄒoㄒ)/~~   id: " +id;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值