Eurekaクライアントはリンクの無効なProviderをリアルタイムで蹴り落とす
1898 ワード
Eureka登録センターの設計思想はCAP分布式理論の中のAPを満たすことに基づいて、あるserviceがダウンタイムして、Eureka serverは自己保護のメカニズムがあって、リアルタイムでserviceを蹴ることはできなくて、デフォルトは3つの心拍周期つまり90秒まで待って、登録センターはやっとこのserviceのダウンラインをマークすることができて、だからこのserviceの呼び出し方はやっと感知することができます.
以下の方法では、クライアントがサービスのproviderを呼び出すときにリアルタイムでサービスを蹴り落とし、LBメカニズムがHystirx遮断器が機能する前にダウンタイムしたサービスプロバイダを呼び出すことをできるだけ避けるようにEureka Serverに通知することを解決することができる.
以下の方法では、クライアントがサービスのproviderを呼び出すときにリアルタイムでサービスを蹴り落とし、LBメカニズムがHystirx遮断器が機能する前にダウンタイムしたサービスプロバイダを呼び出すことをできるだけ避けるようにEureka Serverに通知することを解決することができる.
@Slf4j
@Aspect
@Component
public class AAAAspect {
@Autowired
SpringClientFactory springClientFactory;
@Around(value = "execution (* org.springframework.cloud.client.loadbalancer.LoadBalancerClient.reconstructURI(..)))")
public Object reconstructURIAround(final ProceedingJoinPoint joinPoint) throws Throwable {
// log.info(Thread.currentThread().getName()+"$$$$$$$$$$$reconstructURIAround");
Object[] objects = joinPoint.getArgs();
ServiceInstance instance = (ServiceInstance) objects[0];
Server server = new Server(instance.getHost(), instance.getPort());
if (objects != null) {
// iLoadBalancer.markServerDown(server);
}
// springClientFactory.getLoadBalancer(instance.getServiceId());
RibbonLoadBalancerContext context = springClientFactory.getLoadBalancerContext(instance.getServiceId());
ServerStats serverStats = context.getServerStats(server);
Object obj = joinPoint.proceed();
log.info("=======================================================================");
log.info(serverStats.toString());
log.info("=======================================================================");
/**
* 2 , provider
*/
int n = serverStats.getSuccessiveConnectionFailureCount();
if(n > 1){
context.getLoadBalancer().markServerDown(server);
}
return obj;
}
}