Spring Cloud - Hystrix
- 断路器,线程隔离,服务降级,服务熔断
启用
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class ServiceApplication
fallback + Cache
@CacheResult()
@HystrixCommand(commandKey="getUser", groupKey="userGroup",fallbackMethod = "getUserFallback")
public User getUser(@CacheKey Long id){
return restTemplate.getForObject("http://SPCD-USER/user/{1}",User.class,id);
}
public User getUserFallback(Long id){
return new User(-1,"-1","-1","-1");
}
@CacheRemove(commandKey="getUser")
@HystrixCommand()
public void updateUser(@CacheKey Long id){
logger.info("in UserService method updateUser id: {}",id);
}
@GetMapping("/user/{id}")
public User getUser(@PathVariable("id") Long id){
userService.getUser(id); // 只请求一次
userService.getUser(id);
userService.getUser(id);
userService.getUser(id);
return userService.getUser(id);
//return userClient.getUser(id);
}
Hystrix 缓存 : 生命周期为 一个 request , 且 Hystrix 超时时间 需设置大于 Ribbon 超时时间
Feign + fallback
配置文件启用 hystrix
feign:
hystrix:
enabled: true
client:
config:
default:
connectTimeout: 500
readTimeout: 10000
添加 fallback
@FeignClient(name="spcd-user",fallback = UserClientFallBack.class)
public interface UserClient {
@GetMapping("/getDate")
String getDate(@RequestParam("name") String name);
@GetMapping("/user/{id}")
User getUser(@PathVariable("id") Long id);
}
@Component
public class UserClientFallBack implements UserClient {
@Override
public String getDate(String name) {
return "SPCD-USER get date fail";
}
@Override
public User getUser(Long id) {
return new User(-1,"-1","-1","-1");
}
}