- 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
- 调整配置文件,启用hystrix,配置文件中追加如下配置
- 测试,启动user-consumer,user-service,访问http://localhost:10080/users,会返回正常结果,停掉user-service,再访问该地址,会调用UserServiceClientFallback中的方法
@EnableCircuitBreaker
@SpringBootApplication
@EnableFeignClients({"com.boe.micro.service"})
public class UserConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(UserConsumerApplication.class, args);
}
}
feign:
hystrix:
enabled: true