首页 > 编程知识 正文

feign hystrix ribbon,feign ribbon hystrix 超时时间

时间:2023-05-04 18:39:08 阅读:196762 作者:516

传统服务中当用户在请求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命令调用的方法相同的签名(参数返回值相同) @Servicepublic 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接口的所有方法

@Componentpublic 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/

填写完毕进入

重新访问接口此时监控界面会出现以下内容

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。