SpringCloud 学习笔记------断路器()

一、断路器的概念。

    有一条山路,被山洪冲垮了,但是大家都不知道。车辆还是沿着山路前进,直到被挡住了去路才发现此路不通,但是此时路上车太多了,前面的车走不了也退不回来,后面的车还在源源不断的开过来,所有人都挤在山上不能动。后来有人就制作了一个提示牌——“此路不通,车辆绕行”。以后每次山路被冲毁的时候,都把这块牌子立在山脚,来往的车辆一看见这牌子就掉头回去了。

    这块牌子就是一个断路器,这条山路就是一个服务组件。平时服务组件正常访问的时候断路器不发挥作用,但是一旦服务组件运转异常,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫痪。断路器的作用就显现出来了,断路打开后,可用避免连锁故障,fallback方法可以直接返回一个固定值。

注意:当对特定的服务的调用的不可用达到一个阀值(Hystric 是5秒20次) 断路器将会被打开。

二、实例准备

启动四个项目:

  1. eurekaserver:8081
  2. webserver:8082/webserver:8083/webserver:8084
  3. service-feign:8100
  4. service-ribbon:8090

三、在ribbon使用断路器

    1.在serice-ribbon项目的pom.xml文件中引入spring-cloud-starter-hystrix依赖包

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

    2.启动类ServiceRibbonApplication上加@EnableHystrix标签,开启断路器

@SpringBootApplication
@EnableDiscoveryClient  //向服务中心注册
@EnableHystrix  //开启断路器组件
public class ServiceRibbonApplication {

	public static void main(String[] args) {
		SpringApplication.run(ServiceRibbonApplication.class, args);
	}

	@Bean
	@LoadBalanced    //开启负载均衡
	RestTemplate restTemplate() {
		return new RestTemplate();
	}
}

    3.改造HelloService,在可能出现异常的方法上加@HystrixCommand标签,并指定熔断方法。这里熔断方法为“helloError”,返回一个简单的字符串提示。

@HystrixCommand(fallbackMethod = "helloError")
    public String hello(){
        return  restTemplate.getForObject("http://peoduceserver/hello",String.class);
    }

    public String helloError(){
        return  "不知道为什么就出现这个错误了,可能是服务关闭了";
    }

    4.启动service-ribbon,浏览器访问http://localhost:8090/hello


    5.此时关闭webserver服务,发现断路器起作用了。



四、Feign中使用断路器

    1. Fegin自带断路器,默认关闭,需要在appliaction.yml配置文件中打开。

feign:
  hystrix:
    enabled: true

    2.改造service-fegin工程,在FeignService接口的注解中通过fallback =XXX.class加上指定类即可。

@FeignClient(value = "peoduceserver",fallback = FeignServiceHiHystric.class)
public interface FeignService {

    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    String helloFeign ();
}

    3.新建FeignServiceHiHystric类,实现FeginService接口。

@Component
public class FeignServiceHiHystric  implements  FeignService{


    @Override
    public String helloFeign() {
        return "这里出现错误,大概是熔断器的原因";
    }
}

    4.启动service-fegin项目,访问http://localhost:8100/hello


    5.启动webserver的三个实例。再次访问。


另外还有个断路仪表盘(Hystrix Dashboard),不知道是什么操作。暂时不写了。

参考资料:

1.点击打开链接

猜你喜欢

转载自blog.csdn.net/weixin_42074377/article/details/80653435