Spring Cloud Netflix Hystrix

时间:2025-03-26 09:07:03
/**
*
在类上,增加@CacheConfig 注解,用来描述当前类型可能使用 cache 缓存。
*
如果使用缓存,则缓存数据的 key 的前缀是 cacheNames。
*
cacheNames 是用来定义一个缓存集的前缀命名的,相当于分组。
*/
@CacheConfig(cacheNames = "" )
@Service
public class ClientServiceImpl implements ClientService {
@Autowired
private LoadBalancerClient loadBalancerClient ;
/**
* @HystrixCommand - 开启 Hystrix 容错处理的注解。代表当前方法如果出现服
务调用问题,使用 Hystrix 容错处理逻辑来处理
*
属性 fallbackMethod - 如果当前方法调用服务,远程服务出现问题的时候,
调用本地的哪个方法得到托底数据。
*/
@HystrixCommand (fallbackMethod = "downgradeFallback" ,
commandProperties = {
// 默认 20 个;10s 内请求数大于 20 个时就启动熔断器,当请求符合熔断
条件时将触发 fallback 逻辑 @HystrixProperty (name =
HystrixPropertiesManager. CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD , value = "10" ),
// 请求错误率大于 50%时就熔断,然后 for 循环发起请求,当请求符合熔
断条件时将触发
@HystrixProperty (name =
HystrixPropertiesManager. CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE , value = "50" ),
// 默认 5 秒;熔断多少秒后去尝试请求
@HystrixProperty (name =
HystrixPropertiesManager. CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS ,
value = "5000" )
}
)
@Override
public String first() {
ServiceInstance si = this . loadBalancerClient .choose( "application-service" );
StringBuilder sb = new StringBuilder();
( "http://" ).append(())
.append( ":" ).append(()).append( "/" );
System. out .println( "本次访问的 service 是: " + ());
RestTemplate rt = new RestTemplate();
ParameterizedTypeReference<String> type =
new ParameterizedTypeReference<String>() {};
ResponseEntity<String> response =
((), HttpMethod. GET , null , type);
String
result = ();
return result;
}
/**
*
@Cacheable - 将当期方法的返回值缓存到 cache 中。
*
只要方法增加了@Cacheable 注解,每次调用当前方法的时候,spring cloud
都会先访问 cache 获取数据,
*
如果 cache 中没有数据,则访问远程服务获取数据。远程服务返回数据,先保
存在 cache 中,再返回给客户端。
*
如果 cache 中有数据,则直接返回 cache 中的数据,不会访问远程服务。 *
请求缓存会有缓存数据不一致的可能。缓存数据过期、失效、脏数据等情况。
*
一旦使用了请求缓存来处理幂等性请求操作。则在非幂等性请求操作中必须管
理缓存。避免缓存数据的错误。
* @return
*/
@Override
@Cacheable( "myCache" )
public String testGet() {
ServiceInstance si = this . loadBalancerClient .choose( "application-service" );
StringBuilder sb = new StringBuilder();
( "http://" ).append(())
.append( ":" ).append(()).append( "/testGet" );
System. out .println( "本次访问的 service 是: " + ());
RestTemplate rt = new RestTemplate();
ParameterizedTypeReference<String> type =
new ParameterizedTypeReference<String>() { };
ResponseEntity<String> response =
((), HttpMethod. GET , null , type);
String result = ();
return
result;
}
/**
*
@CacheEvict - 管理缓存。根据参数 key 删除缓存中对应的缓存数据。
*
@return
*/
@Override
@CacheEvict( "myCache" )
public String testPost() {
ServiceInstance si = this . loadBalancerClient .choose( "application-service" );
StringBuilder sb = new StringBuilder();
( "http://" ).append(())
.append( ":" ).append(()).append( "/testPost" );
System. out .println( "本次访问的 service 是: " + ()); RestTemplate rt = new RestTemplate();
ParameterizedTypeReference<String> type =
new ParameterizedTypeReference<String>() {
};
ResponseEntity<String> response =
((), HttpMethod. POST , null , type);
String result = ();
return result;
}
// 本地容错方法,只有远程服务调用过程出现问题的时候,才会调用此方法,获
取托底数据。保证服务完整性。
private String downgradeFallback(){
return "服务降级方法返回托底数据" ;
}
}