hystrix原理以及基本构建,feign和ribbon如何使用熔断器

在这里插入图片描述

传统服务中当用户在请求c时 c请求b b请求a时 当多个用户(线程)同时请求c此时由于a迟迟不响应造成线程大面积堵塞 此时a就会发生雪崩(一台机器出现问题导致与其关联的机器也出现问题),同时影响cb
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ribbon实现熔断器功能

基于ribbon项目进行搭建

1.引入Hystrix maven依赖

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

2.将启动类加入@EnableHystrix注解
在这里插入图片描述
3.在server层需要熔断保护机制的方法加上 @HystrixCommand(fallbackMethod = “ErrorHandler”) 定义好回退方法 编写回退方法 此时我们需要注意两点

  • 1.指定处理回退逻辑的方法。回退方法应该在HystrixCommand所在的同一个类中定义
  • 2.回退方法应该具有和hystrix命令调用的方法相同的签名(参数返回值相同)
@Service
public class RibbonServuceImpl implements RibbonService {
    
    


    @Autowired
    private RestTemplate restTemplate;

    /**
     * 1.指定处理回退逻辑的方法。回退方法应该在HystrixCommand所在的同一个类中定义
     * 2.回退方法应该具有和hystrix命令调用的方法相同的签名(参数返回值相同)
     * @return
     */
    @Override
    @HystrixCommand(fallbackMethod = "ErrorHandler") //定义回退方法
    public String info() {
    
    
        //我们在微服务调用时不在显式指定其服务ip地址只需要要指定client的服务名称和返回类型即可。
        return this.restTemplate.getForObject("http://eureka-client/info ", String.class);
    }



    @Override
    public String ErrorHandler() {
    
    
        return "Server Error";
    }
}

此时依次启动 server client ribbon项目 访问
http://localhost:8888/info
在这里插入图片描述
当我们关闭了client项目之后重新访问
在这里插入图片描述
hystrix断路器有自我检测功能默认是1秒钟请求
我们可以通过改造模拟出来对应功能
我们可以将server的方法改造成

@GetMapping("info")
    public String info() {
    
    
        //生成1200以下的随机数
        int random = new Random().nextInt(1200);
        System.out.println("randomInt: " + random);

        try {
    
    
            Thread.sleep(random);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }

        String result = "welcome:" + this.address + ",your address is " + this.address;
        return result;
    }

当睡眠时间超过一秒(默认熔断超时时间是1S)就会发生熔断机制 由此我们可以看出Hystrix可以自我修复
在这里插入图片描述
当1秒内又恢复正常
在这里插入图片描述

我们也可以通过修改HystrixCommand的属性来设置默认超时时间
在这里插入图片描述

feign实现熔断器

基于feign项目
feign自带对hystrix的支持 所有无需导包

第一种方法使用fallback 属性

1.编写一个回退类必须实现类中Feign接口的所有方法

@Component
public class EurekaClientFeignHystrix implements EurekaClientFeign {
    
    
    @Override
    public String infoByFeign() {
    
    
        return "This is Feign with Hystrix";
    }

    @Override
    public Student getStudentByFeign(String name, String address) {
    
    
        return null;
    }

    @Override
    public Student postStudentByFeign(Parent parent) {
    
    
        return null;
    }
}

@FeignClient 的fallback 属性 指定改接口的实现类
在这里插入图片描述

	/**
	 * 指定的外部客户端接口的回退类。fallback类必须实现由这个注解注释的接口,
	 * 并且是一个有效的springbean。
	 */
	Class<?> fallback() default void.class;

此时默认Feign的hystrix 是关闭的
我们需要再yml文件中进行配置

feign:
  hystrix:
    enabled: true

此时我们访问
http://localhost:8889/infoByFeign
在这里插入图片描述
client打印了两次数据 feign断路由在加载超过1S中之后会返回结果的同时还会再去重新加载一次

在这里插入图片描述

ribbon 启动仪表盘

maven引入该注解

       <!-- 仪表盘 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
        </dependency>

启动类修改如下

@SpringBootApplication
@EnableEurekaClient
@EnableHystrix //启动熔断器
@EnableHystrixDashboard //启动仪表盘
public class SpringCloudRibbonApplication {
    
    

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

    @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;
    }
}

此时依次启动server client ribbon
访问http://localhost:8888/hystrix.stream 图如下
在这里插入图片描述
此时我们访问开启了断路由的方法
此时数据就得到了监控此时由于全是json字符串 需要转换成图形界面
在这里插入图片描述
访问 http://localhost:8888/hystrix/
在这里插入图片描述

填写完毕进入
在这里插入图片描述

重新访问接口此时监控界面会出现以下内容
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42261668/article/details/108173183