spring cloud微服务快速教程之(四)熔断器(Hystrix)及其工具(Dashboard、Turbine)
0-为什么需要熔断器
在分布式系统中,各个服务相互调用相互依赖,如果某个服务挂了,很可能导致其他调用它的一连串服务也挂掉或者在不断等待中耗尽服务器资源,这种现象称之为雪崩效应;
未来防止系统雪崩,熔断机制必不可少,就是当一个服务挂掉后,调用它的服务能快速熔断,不再耗费资源,快速失败并提供回退方案;
【Hystrix】:是spring cloud的熔断器组件,提供了熔断器功能,能够阻止联动故障,并提供故障的解决方案,提供系统弹性;
【Hystrix Dashboard】:是熔断器的监控面板,通过它,能直观的了解熔断器的状况;
【Turbine】: 在Dashboard中,我们要输入一个一个单独的服务地址进行监控和了解;那么多服务,一个一个输入那不是累死人,有没有一个工具能把众多分散的微服务熔断器监控状况聚合到一起,使得我们在一个Dashboard就能了解众多服务的熔断器监控状况呢,有,这个工具就是Turbine;它的作用就是聚合众多微服务的hystrix监控数据到一起,使得我们只需要在一个Dashboard就能了解所有;
一、使用hystrix
1.1、添加依赖
<!-- 断路器 hystrix--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
1.2、配置文件中开启熔断器开关
#开启熔断器开关 feign: hystrix: enabled: true
1.3、启动类中增加 @EnableHystrix 注解和bean
@SpringBootApplication @EnableEurekaClient @EnableHystrix @EnableFeignClients public class application { public static void main(String[] args) { SpringApplication.run(application.class);
@Beanpublic ServletRegistrationBean getServlet(){ HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet(); ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet); registrationBean.setLoadOnStartup(1); registrationBean.addUrlMappings("/actuator/hystrix.stream"); registrationBean.setName("HystrixMetricsStreamServlet"); return registrationBean;}
} }
1.4、增加熔断器类,实现Feign的接口
package com.anson.service.feign; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.RequestMapping; /** * @description: 熔断器类 * @author: anson * @Date: 2020/1/7 11:24 */ @Component public class FUserServiceHystrix implements FUserService { @RequestMapping("/user/hello") @Override public String hello() { return "对不起,user服务不可达,请稍后再试!"; } }
1.5、增加熔断器配置类FeignConfig
package com.anson.config; import feign.Retryer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.concurrent.TimeUnit; @Configuration public class FeignConfig { @Bean public Retryer feignRetryer() { /* * 参数说明: * 第一个> 重试间隔为100毫秒 * 第二个> 最大重试时间为1秒 * 第三个> 最大重试次数为5次 */ return new Retryer.Default(100, TimeUnit.SECONDS.toMillis(1), 5); } }
1.6、在Feign接口注解中增加fallback,指向熔断器类
package com.anson.service.feign; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient(name = "user",configuration = FeignConfig.class,fallback = FUserServiceHystrix.class)public interface FUserService{ @RequestMapping("/user/hello") public String hello();}
1.7、运行测试
user服务正常时:
user服务关闭时:
---------------------------华丽丽的分割线-------------------------------------------------------
二、Hystrix Dashboard的使用
2.1、熔断器加了,那么我们要监控和查看hystrix的运行状态,这时候Dashboard上场;
2.2、添加依赖:
<!-- dashboard --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
2.3、启动类添加注解 @EnableHystrixDashboard
2.4、完成,运行测试,打开,http://localhost:8767/hystrix
在里面填入要监控的微服务地址 +/actuator/histrix.stream,如:http://localhost:8768/actuator/histrix.stream,title也填入,点击按钮就可以看到结果了:如图:
可以看到我们加入的熔断器的运行状态
----------------------------------------------华丽丽的分割线-----------------------------------------------------------------
三、Turbine 聚合监控数据
3.1、上面Dashboard中,我们输入http://localhost:8767/actuator/histrix.stream,它只是现实端口8767这个微服务实例的监控数据而已,要看其他的,还得重新输入,那能不能有个工具将所有微服务的监控数据都聚合到一起,显示到Dashboard中呢,这个工具就是Turbine
3.2、新建一个模块,添加相关依赖:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-turbine</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
3,.3、修改配置文件,其中app-config是要监控的服务名,多个用逗号分隔;
server: port: 8768 spring: application: name: turbine eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ instance: prefer-ip-address: true turbine: combine-host-port: true app-config: order cluster-name-expression: new String("default") instanceUrlSuffix: actuator/hystrix.stream aggregator: cluster-config: default
3.4、在启动类中添加注解@EnableTurbine;
package com.anson; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard; import org.springframework.cloud.netflix.turbine.EnableTurbine; /** * @description: TODO * @author: anson * @Date: 2020/1/6 14:27 */ @SpringBootApplication @EnableEurekaClient @EnableTurbine @EnableHystrixDashboard public class application { public static void main(String[] args) { SpringApplication.run(application.class); } }
完成,启动运行后,他就会将所有配置文件中添加进来的服务全部的熔断器监控数据聚合到一起了,
在任意项目的Dashboard面板中填入http://turbine-hostname:port/turbine.stream 的地址样式,就能看到所有的监控数据了
,如 : http://localhost:8768/turbine.stream
我们只加了一个熔断器,你可以多加几个看看效果;
好了,熔断器hystrix简单讲解到着,,更深入的后续再详聊,GIT源码后续再放出