Spring Cloud学习(四):Hystrix容错处理

1. Hystrix介绍

    前面说到,微服务是将服务根据业务去分成一个个独立的服务,服务之间通过RestTemplate+Ribbon或者Feign来调用,因为大多数微服务都会做成集群,这样就导致如果其中某一个服务出现了问题,那么调用这个服务的服务也同样出现问题,慢慢的,整个服务都会崩掉("雪崩效应")。为了解决这个问题,断路器诞生了
    Netflix开源的Hystrix组件便是实现了断路器模式,当某一个服务出现了问题,Hystrix会返回一个提前预定的结果给调用方,这样就可以避免连锁的故障。

2.代码实现

2.1 在Ribbon+RestTemplate中使用断路器

  • 准备两个eureka-client服务,一个eureka-server服务,一个Ribbon服务(前面文章都有)

  • 在Ribbon服务中整合Hystrix,pom.xml引入

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
  • 在启动类中加上注解@EnableHystrix来启动Hystrix

@SpringBootApplication
@EnableEurekaClient
@EnableHystrix
public class HystrixRibbonApplication {

    public static void main(String[] args) {
        SpringApplication.run(HystrixRibbonApplication.class, args);
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}
  • 在方法上加上@HystrixCommand注解来对该方法创建熔断器的功能,并指定fallbackMethod熔断方法(发生错误时调用的方法)

/**
 * @author 吕梁山
 * @date 2019/7/18
 */
@RestController
public class TestController {

    @Autowired
    private RestTemplate restTemplate;

    private String service = "http://eureka-client";

    @RequestMapping("test")
    @HystrixCommand(fallbackMethod = "testErrorMethod")
    public String test(String userName){
        return restTemplate.getForObject(service + "/test?userName=" + userName, String.class);
    }

    public String testErrorMethod(String userName){
        return "这是服务报错返回";
    }
}
  • 启动服务,访问接口,会发现ribbon会去轮询访问两个client服务

此次服务端口号:4001,接收到的参数:测试
此次服务端口号:4002,接收到的参数:测试
  • 关闭其中一个服务,会发现ribbon去轮询访问两个client服务时返回的分别是

此次服务端口号:4001,接收到的参数:测试
这是服务报错返回

由此可见,当某一个服务不可用时,Hystrix会返回事先设定好的结果,而不是一直等待服务响应超时

2.2 在Feign中使用断路器

Feign中已经整合了Hystrix,所以不需要另外去导入,只需要在配置文件中去开启即可

  • 准备两个eureka-client服务,一个eureka-server服务,一个Feign服务(前面文章都有)

  • 在配置文件中开启Hystrix

    扫描二维码关注公众号,回复: 6825802 查看本文章
feign:
  hystrix:
    enabled: true
  • 新建一个类去实现之前写的FeignService接口,并注入到Ioc容器中

/**
 * @author 吕梁山
 * @date 2019/7/18
 */
@Component
public class FeignServiceImpl implements FeignService {
    @Override
    public String test(String userName) {
        return "这是服务报错返回";
    }
}
  • 在FeignService接口的注解中加上fallback指定到实现类

/**
 * @author 吕梁山
 * @date 2019/7/18
 */
@FeignClient(value = "eureka-client",fallback = FeignServiceImpl.class)
public interface FeignService {
    @RequestMapping("test")
    String test(@RequestParam(value = "userName") String userName);
}
  • 启动服务,访问接口,会发现ribbon会去轮询访问两个client服务

此次服务端口号:4001,接收到的参数:测试
此次服务端口号:4002,接收到的参数:测试
  • 关闭其中一个服务,返回的分别是

此次服务端口号:4001,接收到的参数:测试
这是服务报错返回

欢迎留言:http://pikaqiu.vip/article/2369.html
示例代码:https://github.com/Liangshan1994/SpringCloud

猜你喜欢

转载自www.cnblogs.com/liangshandada/p/11212308.html