/**
*
在类上,增加@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
"服务降级方法返回托底数据"
;
}
}