Hystrix是一个断路器,它将服务调用进行隔离,用快速失败来代替排队,阻止级联调用失败。它的目的是不让服务挂掉
防止 A->B->C 服务调用,C服务不可用时,A、B服务都不可用
工程:spring-cloud-learn-hystrix-books-service
1.添加依赖pom.xml
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-hystrixartifactId>
dependency>
2.启动类添加断路器注解 @EnableCircuitBreaker
@EnableEurekaClient
// 开启断路器
@EnableCircuitBreaker
@SpringBootApplication
public class LearnHystrixApplication {
public static void main(String[] args) {
SpringApplication.run(LearnHystrixApplication.class, args);
}
}
3.在主服务添加短路服务 @HystrixCommand(fallbackMethod = “defaultBook”)
@RestController
@RequestMapping("/book")
public class BooksController {
@Autowired
private RestTemplate restTemplate ;
@GetMapping({"","/"})
// 配置 短路器回调执行方法
@HystrixCommand(fallbackMethod = "defaultBook")
public BookVo getBook() {
return restTemplate.getForObject("http://localhost:9090/book/",
BookVo.class);
}
/**
* @description
* 短路器 默認執行方法
* @author TianwYam
* @date 2022年2月22日下午9:01:06
* @return
*/
public BookVo defaultBook() {
return BookVo.builder()
.name("《肖生克的救贖-DEFAULT》")
.author("tianwyam").build();
}
}
输出:
{
"name": "《肖生克的救贖-DEFAULT》",
"author": "tianwyam"
}
hystrix可以配合feign使用,在调用第三方服务失败时,可以执行默认回调方法
1.添加依赖 pom.xml
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-hystrixartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
2.添加配置 在feign中开启hystrix
#开启hystrix熔断器
feign:
hystrix:
enabled: true
开启配置的源码:FeignClientsConfiguration 配置类上
@Configuration
@ConditionalOnClass({ HystrixCommand.class, HystrixFeign.class })
protected static class HystrixFeignConfiguration {
@Bean
@Scope("prototype")
@ConditionalOnMissingBean
@ConditionalOnProperty(name = "feign.hystrix.enabled")
public Feign.Builder feignHystrixBuilder() {
return HystrixFeign.builder();
}
}
3.在feign客户端中添加回调
// 开启feign客户端
// fallback 配置回调
@FeignClient(value = "BOOKS-SERVICE", fallback = BookServiceFallBack.class)
public interface BookServiceFeignClient {
@GetMapping("/book")
public BookVo getBookVo();
}
此处是 调用第三方服务 BOOKS-SERVICE 的 /book 方法 失败时,会执行 回调类 BookServiceFallBack 里面对应的 getBookVo() 方法 进行隔断,防止级联调用失败
默认回调类 实现 BookServiceFeignClient 对应的方法
/**
* @description
* 回调方法
* @author TianwYam
* @date 2022年2月24日下午7:18:53
*/
@Service
public class BookServiceFallBack implements BookServiceFeignClient{
@Override
public BookVo getBookVo() {
return BookVo.builder()
.name("《hystrix在feign中使用》-DEFAULT")
.author("tianwyam")
.build();
}
}
4.在controller层调用 feign 客户端
@RestController
@RequestMapping("/book")
public class BooksController {
@Autowired
private BookServiceFeignClient bookServiceFeignClient;
/**
* @description
* 采用feign方式调用
* @author TianwYam
* @date 2022年2月24日下午7:25:03
* @return
*/
@GetMapping("/feign")
public BookVo getFeignBookVo() {
return bookServiceFeignClient.getBookVo();
}
}
5.在启动类上添加注解 开启feign 和 短路器
@EnableEurekaClient
// 开启断路器
@EnableCircuitBreaker
// 开启feign客户端
@EnableFeignClients
@SpringBootApplication
public class LearnHystrixApplication {
public static void main(String[] args) {
SpringApplication.run(LearnHystrixApplication.class, args);
}
}
采用feign方式时,feign会去eureka服务中心调用服务,若是服务 BOOKS-SERVICE 不可达时,hystrix会进行服务降级,调用默认执行方法
结果:
{
"name": "《hystrix在feign中使用》-DEFAULT",
"author": "tianwyam"
}
Hystrix使用FallbackFactory统一处理,查看服务调用异常或失败,可以获取熔断降级处理的原因
1.在使用feign 客户端时配置回调工程类
// 方式二 采用factory方式获取异常
@FeignClient(value = "BOOKS-SERVICE", fallbackFactory = BookServiceFallBackFactory.class)
public interface BookServiceFeignClient {
@GetMapping("/book")
public BookVo getBookVo();
}
2.自定义回调工程类 实现 FallBackFactory 接口
/**
* 设置回调工厂类,可以获取错误提示
*/
@Component
public class BookServiceFallBackFactory implements FallbackFactory<BookServiceFeignClient> {
@Override
public BookServiceFeignClient create(Throwable e) {
return new BookServiceFallBack(){
@Override
public BookVo getBookVo() {
return BookVo.builder()
.name(String.format("《Hystrix回调获取异常之%s》", e.getMessage()))
.author("tianwyam")
.build();
}
};
}
}
当feign调用服务 BOOKS-SERVICE 出现异常或失败时,hystrix会执行回调工厂进行服务降级处理
结果:
{
"name": "《Hystrix回调获取异常之com.netflix.client.ClientException: Load balancer does not have available server for client: BOOKS-SERVICE》",
"author": "tianwyam"
}