作者平台:
| CSDN:blog.csdn.net/qq_41153943…
| 知乎:www.zhihu.com/people/1024…
| GitHub:github.com/JiangXia-10…
| 微信公众号:1024笔记
本文一共2637字,预计阅读9分钟
前言
我们知道在微服务的项目中,Spring Cloud进行接口调用时,一般时需要使用Feign进行接口调用,如果接口之间的调用触发了某个条件,比如某个接口在10秒内产生超过20次请求,并且如果请求的错误百分比大于阈值(比如50%),这时候需要开启一种保护机制,从而保证整个系统的一个可用性。这种机制就是熔断机制,一般使用熔断机制的组件是Hystrix组件。
前面的文章:SpringCloud系列:服务雪崩、服务熔断、服务降级,介绍了微服务相关的服务雪崩、服务熔断以及服务降级的内容。服务熔断和服务降级是处理服务雪崩的有效手段,今天就一起学习Hystrix熔断器组件如何在项目中使用以及一些需要注意的事项,避免踩坑。
什么是Hystrix
Hystrix是一个应用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时,异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整个体系服务失败,避免服务雪崩,从而提高整个分布式系统的弹性。
比如系统中有很多服务,当某些服务不稳定的时候,使用这些服务的用户线程将会阻塞,如果没有隔离机制,系统随时就有可能会挂掉,从而带来很大的风险。SpringCloud使用Hystrix组件提供断路器、资源隔离与自我修复功能。
Hystrix的使用
在一个spring cloud的微服务的项目中使用Hystrix其实很简单,和其他组件的使用一样,首先创建一个基本的springcloud项目,然后引入springcloud以及这里需要的Hystrix相关的依赖,这里主要涉及到的依赖如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入consul依赖,用于服务注册发现-->
<!--Consul Discovery-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!--引入健康检查的依赖,用于健康检查监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--引入hystrix依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
</dependencies>
然后需要在application.properties配置文件中配置相关配置,比如端口号,服务名称等等:
server.port=8087
spring.application.name=hystrix
#向consul server 服务注册地址
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.service-name=${spring.application.name}
在项目中引入了hystrix依赖之后,其实项目就已经具备了服务熔断的功能,这时候只需要在项目启动类上加上@EnableCircuitBreaker注解开启hystrix服务熔断即可,这里的项目启动类如下:
@SpringBootApplication //代表springboot应用
@EnableDiscoveryClient //代表服务注册中心客户端 consul client
@EnableCircuitBreaker //开启hystrix服务熔断
public class HystrixApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixApplication.class,args);
}
}
启动项目,服务已经注册consul:
接下来进行测试。创建一个controller,并且设置请求失败的条件,具体如下:
@RestController
public class DemoController {
/**
* @author:江夏
* @date 2022/7/3 21:34
* @version 1.0
* @description: 如果某个时间段内(10s内)20次请求失败或者请求失败比例超过50%,则熔断器打开,5s之后如果请求正确则正确请求,如果还是错误请求,则熔断器继续
*/
@GetMapping("/demo")//?id=
//自定义的处理方法
// @HystrixCommand(fallbackMethod = "demoFallbackMethod")//熔断之后的处理,fallbackMethod表示失败之后的方法名,即失败之后调用该方法
@HystrixCommand(defaultFallback = "defaultFallBackMethod") //熔断之后默认的处理方法
public String demo(Integer id){
System.out.println("demo ok!");
if(id<0){
throw new RuntimeException("id无效!");
}
return "demo ok";
}
/**
* @author:江夏
* @date 2022/7/3 21:49
* @version 1.0
* @description: 自定义熔断处理方法
*/
public String demoFallbackMethod(Integer id){
return "当前系统繁忙,请稍后再试!!!";
}
/**
* @author:江夏
* @date 2022/7/3 21:52
* @version 1.0
* @description: 默认的熔断之后的处理方法
*/
public String defaultFallBackMethod(){
return "当前系统繁忙,请稍后再试(默认)!!!";
}
}
这里设置条件,获取输入的id的值,如果id<0,则抛出异常,并且进行服务熔断。输入参数大于0,则请求成功。
如果id参数小于0,则请求失败,并且进行服务熔断。
这里需要注意的是@HystrixCommand注解,该注解是方法级别的,使用在方法之上,则一旦服务发生熔断则请求@HystrixCommand注解中指定的方法。@HystrixCommand注解有两个重要的属性,一个是fallbackMethod属性、一个是defaultFallback属性,都是表示发生了服务熔断之后请求的处理方法,一个表示指定的处理方法,一个则是默认的处理方法,有点类似404页面的感觉。
OpenFeign整合Hystrix
如果是使用OpenFeign进行服务调用进行服务熔断,那么就需要使用两个服务,所以除了上述项目之外,重新创建一个项目,并且在该项目中调用上面项目的接口。这个项目中需要的依赖除了上面的之外,还需要引入openfeign相关的依赖:
<!--引入openfeign依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
然后在配置文件中配置相关的配置,这里和其他的配置一样:
server.port=8088
spring.application.name=hystrixofopenfeign
#向consul server 服务注册地址
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.service-name=${spring.application.name}
#开启openfeign在调用服务过程中开启hystrix支持,如果是开启可以不写,因为默认事开启的
feign.hystrix.enabled=true
入口类上加上EnableFeignClients注解开启openfeign调用
@SpringBootApplication
@EnableDiscoveryClient //开启服务客户端 consul server
@EnableFeignClients //开启openfeign调用
public class HystrixOfOpenfeignApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixOfOpenfeignApplication.class,args);
}
}
openfeign调用的使用可以参考之前的文章:SpringCloud系列:OpenFeign组件。这里需要创建一个feignclient:
@FeignClient(value="hystrix",fallback = HystrixClientFallBack.class)//调用hystrix服务,fallback属性表示当调用的服务不可用时,默认的备选处理方式
public interface HystrixClient {
@GetMapping("/demo")
String demo(@RequestParam("id") Integer id);
}
feignclient注解中的fallback属性配置回调处理类,该处理类是作为 Feign 熔断器的逻辑处理类表示当调用的服务不可用时,默认的备选处理方式,value为类,默认的处理如下需要实现openfeign接口,并实现其中的方法:
/**
* @author jiangxia
* @date 2022年07月09日 21:08
* desc:自定义的处理方式
*/
@Configuration
public class HystrixClientFallBack implements HystrixClient {
@Override
public String demo(Integer id) {
return "当前服务忙,请稍后再试!";
}
}
测试
接下来进行测试。分别启动上面的两个项目,则服务在consul中注册了。
地址栏分别输入错误id的url如下:
输入正确id的url的结果如下:
则表示正确实现了服务熔断。
总结
本文主要介绍了什么是hystrix熔断器以及其在springcloud项目中的简单使用。hystrix熔断器主要是指在项目中引入hystrix依赖,则在一定的时间范围内如果请求的次数达到一定的失败比例,那么hystrix就会主动拒绝服务,并采用备选方案返回请求信息,从而有效的缓解了服务雪崩的问题,有效的控制服务之间链路调用的响应时间,保证整个微服务的健康。
相关推荐
我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿