Eurekaクライアントはリンクの無効なProviderをリアルタイムで蹴り落とす

1898 ワード

Eureka登録センターの設計思想はCAP分布式理論の中のAPを満たすことに基づいて、あるserviceがダウンタイムして、Eureka serverは自己保護のメカニズムがあって、リアルタイムでserviceを蹴ることはできなくて、デフォルトは3つの心拍周期つまり90秒まで待って、登録センターはやっとこのserviceのダウンラインをマークすることができて、だからこのserviceの呼び出し方はやっと感知することができます.
以下の方法では、クライアントがサービスの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;
    }
}