@Override public String toString() { StringBuilder info = new StringBuilder(); info.append("Provider:{appkey=").append(getAppkey()) .append(",ip=").append(getIp()) .append(",port=").append(getPort()) .append(",weight=").append(getWeight()) .append(",protocol=").append(getProtocol()) .append(",env=").append(getEnv()) .append(",version=").append(getVersion()) .append("}"); return info.toString(); }
@Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } Provider other = (Provider) o; if (!Objects.equals(appkey, other.getAppkey())) { return false; } if (!Objects.equals(ip, other.getIp())) { return false; } if (port != other.getPort()) { return false; } return true; } }
@Override public void updated(List<Provider> providers) { if (providers == null || providers.isEmpty()) { return; } for (Provider provider : providers) { String ip = provider.getIp(); int port = provider.getPort(); String address = ip + Constants.COLON + port; addOrUpdateInvokers(address, provider); } refreshInvokers(); }
@Override public synchronized void notify(List<Provider> providers) { if (providers == null || providers.isEmpty()) { // 不抛出异常,避免订阅时,还没有发现服务导致启动失败 logger.error("Provider list is empty, {}", subscribeInfo.toString()); } else { logger.info("Update providers, total {} providers", providers.size()); } Set<String> newAddresses = new HashSet<>(); for (Provider provider : providers) { String ip = provider.getIp(); int port = provider.getPort(); String address = ip + Constants.COLON + port; addOrUpdateInvokers(address, provider); newAddresses.add(address); } List<Invoker> unusedInvokers = findUnusedInvokers(newAddresses); refreshInvokers(); destroyUnusedInvokers(unusedInvokers); }
private Invoker<T> initInvoker(Provider provider) { clientConfig.setAddress(provider.getIp(), provider.getPort()); return invokerFactory.buildInvoker(clientConfig, provider); }
public static void weightRecover(Invoker invoker) { double weight = invoker.getProvider().degradeRecover(); String remoteIpPort = invoker.getProvider().getIp() + Constants.COLON + invoker.getProvider().getPort(); logger.info("The weight of {} recover to {}", remoteIpPort, weight); } }
@Override protected RpcResult doInvoke(RpcInvocation invocation, List<Invoker<T>> invokers) { Invoker<T> invoker = select(invocation, invokers, new ArrayList<Invoker<T>>()); try { return invoker.invoke(invocation); } catch (Throwable e) { logger.error("Remote invoke failed, interface=" + invoker.getInterface().getName() + "|method=" + invocation.getMethod().getName() + "|provider=" + invoker.getProvider().getIp() + Constants.COLON + invoker.getProvider().getPort() + ", wait for retry in background", e); addFailed(invocation, this); } return new RpcResult(); }
@Override protected RpcResult doInvoke(RpcInvocation invocation, List<Invoker<T>> invokers) throws Throwable { List<Invoker<T>> invoked = new ArrayList<>(); Throwable recordExe = null; for (int i = 0; i <= retryTimes; i++) { Invoker<T> invoker = select(invocation, invokers, invoked); invoked.add(invoker); try { return invoker.invoke(invocation); } catch (Throwable e) { logger.warn("Failed " + i + " times, interface=" + invoker.getInterface().getName() + "|method=" + invocation.getMethod().getName() + "|provider=" + invoker.getProvider().getIp() + Constants.COLON + invoker.getProvider().getPort(), e); recordExe = e; } } if (recordExe != null) { throw recordExe; } return new RpcResult(); } }
public static void weightDegradeToZero(Invoker invoker, String reason) { double oriWeight = invoker.getProvider().getWeight(); invoker.getProvider().degrade(0); String remoteIpPort = invoker.getProvider().getIp() + Constants.COLON + invoker.getProvider().getPort(); logger.warn("Degrade {} set weight:{}->0 temporarily, {}", remoteIpPort, oriWeight, reason); }
@Override public RpcResult handle(RpcInvocation invocation) throws Throwable { try { Request request = (Request)invocation.getAttachment(Constants.RPC_REQUEST); if (request == null) { throw new RpcException("No request info in RpcInvocation"); } String methodName = invocation.getMethod().getName(); Integer timeout = config.getMethodTimeout().get(methodName); if (timeout != null) { request.setTimeout(timeout); } else { request.setTimeout(config.getTimeout()); } request.setData(invocation); Response response = invokerHandler.handle(request); if (response.getException() != null) { throw response.getException(); } return response.getResult(); } catch (Exception e) { if (e instanceof TimeoutException) { throw new TimeoutException(e.getMessage() + ", interface=" + serviceInterface.getName() + "|method=" + invocation.getMethod().getName() + "|provider=" + provider.getIp() + Constants.COLON + provider.getPort(), e.getCause()); } else { throw e; } } } };