断路器相当于家里的空气跳闸,当某个应用实例挂了,它调用的以及掉用它的应用都会请求或者返回失败,这时如果不及时处理,大量的请求依旧在访问,会引起其他的正常的应用也挂了,最终导致雪崩,断路器会在每个请求的数量达到一定的阈值,会切断这个请求,返回预定的值,这样在修复前不会引起其他的应用的失效,最大程度控制整个项目,断路器有3个状态,打开,关闭,半开,当有应用挂了,请求在继续时,断路器打开;

当应用正常运行时,断路器关闭;

断路器在打开后,会切断某个请求,但是过一定时间,它会猜测这个应用是否已经修复了,它会将请求分流,即它收到10个请求,它拿2个请求继续正常访问请求,来看看是否修复,其余8个依旧返回预定值,这就是半打开状态。

代码还是上一篇的,http://blog.csdn.net/shunzi1046/article/details/70241982,只有简单的consumer中的部分修改:

pom文件中加入:

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

然后是启动类:

@EnableEurekaClient            //通过该注解,实现服务发现,注册
@SpringBootApplication
@EnableCircuitBreaker            //增加的断路器注解
public class DemoSimpleConsumerMovieApplication {

	@Bean
	@LoadBalanced
	public RestTemplate restTemplate(){
		return new RestTemplate();
	}
	
	public static void main(String[] args) {
		SpringApplication.run(DemoSimpleConsumerMovieApplication.class, args);
	}
}
最后是控制器类:

package com.sino.cloud.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.sino.cloud.entity.User;

@RestController
public class MovieController {
	@Autowired
	private RestTemplate restTemplate;
	@Autowired
	private LoadBalancerClient loadBalancerClient;
	
	
	@HystrixCommand(fallbackMethod = "findByIdFallback")
	@GetMapping("/movie/{id}")
	public User findById(@PathVariable Long id){
		return this.restTemplate.getForObject("http://user-service-provider/user/"+id,User.class );
	}
	
	public User findByIdFallback(Long id) {
	    User user = new User();
	    user.setId(-1L);
	    user.setName("默认用户");
	    return user;
	  }
}

其余的都不变。

然后还是先启动provier-user,再启动consumer-movie项目,请求访问成功后,停止provider,这时继续请求,

会进入我们设置好的页面,这样就不会因为挂了某个应用,用户不知情的情况下依旧反复大量的请求会引起雪崩。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐