• hystrix概览 Spring Cloud Hystrix 实现了断路器、线路隔离等一系列服务保护功能。它也是基于 Netflix 的开源框架 Hystrix 实现的,该框架的目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix 具备服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并以及服务监控等强大功能
  • hytrix集成和配置
  • 准备工作,为了使用feign以及hystrix需要对之前的代码做少许调整,否则可能会出现无法负载的问题。
  • 首先是user-api,需要把pom中的依赖全部删除,保持api的简洁性;另外删除UserService接口中的所有注解,后面会把注解放到实现类中,这样也保持了接口的整洁性。
public interface UserService {

    List<User> getAllUsers();
}

        然后是user-service,将注解放到实现类中

@RestController
public class UserServiceImpl implements UserService {

    @GetMapping("/all")
    @Override
    public List<User> getAllUsers() {
        List<User> userList = new ArrayList<User>();

        // should call DAO methods
        userList.add(new User(1,"Dalston"));
        userList.add(new User(2,"Edgware"));
        userList.add(new User(3, "Finchley"));

        return userList;
    }
}

         最后,user-consumer做相应的修改,修改UserServiceClient接口,去掉对UserService的继承,这也是spring官方提倡的做法,同时在@FeignClient注解中添加fallback类,该类用于服务出故障时调用的本地方法

@FeignClient(name = "user-service", fallback = UserServiceClientFallback.class)
public interface UserServiceClient {
    @GetMapping("/all")
    List<User> getAllUsers();
}

       添加UserServiceClientFallback类,实现具体方法

@Component
public class UserServiceClientFallback implements UserServiceClient {
    @Override
    public List<User> getAllUsers() {
        System.out.println("Fallback service");
        List<User> errorList = new ArrayList<>();
        errorList.add(new User(2001,"get fallback"));
        return errorList;
    }
}

    这样,对于原有服务的修改就完成了

  • 启动熔断,在user-consumer的启动类中添加@EnableCircuitBreaker注解,用于启用hystrix

  • @EnableCircuitBreaker
    @SpringBootApplication
    @EnableFeignClients({"com.boe.micro.service"})
    public class UserConsumerApplication {
        public static void main(String[] args) {
            SpringApplication.run(UserConsumerApplication.class, args);
        }
    }


  •  

  • 调整配置文件,启用hystrix,配置文件中追加如下配置 

  • feign:
      hystrix:
        enabled: true


  •  

  • 测试,启动user-consumer,user-service,访问http://localhost:10080/users,会返回正常结果,停掉user-service,再访问该地址,会调用UserServiceClientFallback中的方法