直接使用hystrix时:
服务消费方:
@RestController
@RequestMapping("/consumer/users")
public class UserController
{
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("{id}")
// 当此方法无法正常返回的时候 调用降级方法
@HystrixCommand(fallbackMethod = "getUserByIdFallBack")
public User getUserById(@PathVariable("id") Long id)
{
String url = "http://localhost:8081/users/" + id;
return restTemplate.getForObject(url, User.class);
}
public User getUserByIdFallBack(Long id)
{
User user = new User();
user.setId(-1L);
user.setName("出现错误");
return user;
}
}
yml配置:
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 3000 # 设置hystrix的超时时间为3000ms, 之后才调用降级方法
服务提供方:
@RestController
@RequestMapping("/users")
public class UserController
{
@Autowired
private IUserService userService;
@GetMapping("{id}")
public User getUserById(@PathVariable("id") Long id)
{
try
{
Thread.sleep(12500); // 远大于三秒
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("sb");
return userService.getUserById(id);
}
}
此时访问http://localhost/consumer/users/1时, 会因为服务提供方超时而进入降级方法, 并且超时时间恰好是3s
但是如果过通过feign进行调用, hystrix超时时间的配置就会失效
默认情况下: 使用feign进行远程调用, 如果provider中的方法在1s内没有返回, 则会超时报错
如果想延长这个时间就应该设置feign的超时时间
超过feign的超时时间但是没有超过hystrix的超时时间, 还是会进入降级方法
使用feign
服务消费方:
@FeignClient(value = "service-provider", fallback = UserClientFallback.class)
public interface UserClient
{
@GetMapping("/users/{id}")
User getUserById(@PathVariable("id") Long id);
}
// 此类用来编写降级方法
@Component
public class UserClientFallback implements UserClient
{
@Override
public User getUserById(Long id)
{
User user = new User();
user.setName("UserClientFallback中的降级方法");
return user;
}
}
@RestController
@RequestMapping("/consumer/feign/users")
public class UserFeignController
{
@Autowired
private UserClient userClient;
@GetMapping("{id}")
public User getUserById(@PathVariable("id") Long id)
{
return userClient.getUserById(id);
}
}
yml
feign:
hystrix:
enabled: true
client:
config:
default:
connectTimeout: 2000 # feign 的超时设置
readTimeout: 2000
此时访问http://localhost/consumer/feign/users/1时, 会因为服务提供方超时而进入降级方法, 并且超时时间恰好是2s