《SpringCloud微服务 五》之 Hystrix 熔断器

《SpringCloud微服务 五》之 Hystrix 熔断器


目录

  • 《SpringCloud微服务 五》之 Hystrix 熔断器
    • 五、Hystrix 熔断器
      • 5.1 单独使用hystrix断路器
      • 5.2 在feign中使用hystrix
      • 5.3 hystrix在feign里统一处理异常



五、Hystrix 熔断器



Hystrix是一个断路器,它将服务调用进行隔离,用快速失败来代替排队,阻止级联调用失败。它的目的是不让服务挂掉


防止 A->B->C 服务调用,C服务不可用时,A、B服务都不可用


工程:spring-cloud-learn-hystrix-books-service




5.1 单独使用hystrix断路器


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();
	}
	
	
}


当 getBook() 方法调不通时 http://localhost:9090/book/ 无法访问时,hystrix 会即使中断,采取备份方式执行 defaultBook() 方法

输出:

{
  "name": "《肖生克的救贖-DEFAULT》",
  "author": "tianwyam"
}

注意:@HystrixCommand 添加断路器不止可以在controller中,还可以在service中进行配置

其原理是采用AOP方式:具体可以看源码 HystrixCommandAspect


5.2 在feign中使用hystrix


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"
}



5.3 hystrix在feign里统一处理异常


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"
}

你可能感兴趣的:(SpringCloud微服务,微服务,spring,cloud,java,hystrix,熔断器)