@Override public boolean updateProviderIfNeeded(Provider provider) { if (this.provider.getIp().equals(provider.getIp()) && this.provider.getPort() == provider.getPort()) { // 更新字段内容,不直接替换引用的原因是避免节点过多时替换较多,对ygc耗时有轻微影响,目的是减少对象在年轻代的复制 return this.provider.updateIfDiff(provider); } return false; }
@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(); }
private static SubscribeInfo convertReferenceCfg2SubscribeInfo(ReferenceConfig cfg, Map<String, String> attachments) { SubscribeInfo info = new SubscribeInfo(); info.setServiceName(cfg.getServiceName()); info.setLocalAppkey(cfg.getAppkey()); info.setRemoteAppkey(cfg.getRemoteAppkey()); info.setProtocol(cfg.getProtocol()); info.setSerialize(cfg.getSerialize()); info.setEnv(cfg.getEnv()); info.setAttachments(attachments); return info; } }
@Override public String toString() { StringBuilder info = new StringBuilder(); info.append("RegistryInfo:{appkey=").append(getAppkey()) .append(",serviceNames=").append(serviceNames) .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(",attachments=").append(attachments) .append("}"); return info.toString(); } }
protected String generateNodePath(RegistryInfo info) { String envName = Constants.EnvType.getEnvType(info.getEnv()).getEnvName(); StringBuilder pathBuilder = new StringBuilder(ZooKeeperNodeInfo.PATH_SEPARATOR).append(ZooKeeperNodeInfo.ROOT_NAME) .append(ZooKeeperNodeInfo.PATH_SEPARATOR).append(envName).append(ZooKeeperNodeInfo.PATH_SEPARATOR) .append(info.getAppkey()).append(ZooKeeperNodeInfo.PATH_SEPARATOR) .append(ZooKeeperNodeInfo.PROVIDER).append(ZooKeeperNodeInfo.PATH_SEPARATOR) .append(info.getIp()).append(Constants.COLON).append(info.getPort()); return pathBuilder.toString(); } }
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 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; } }
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 public synchronized void unsubcribe(SubscribeInfo info) { try { NodeChangeListener listener = listeners.remove(info); if (listener != null) { zkClient.removeChildNodeChangeListener(listener); logger.info("Unsubscribe on zookeeper[{}]: remoteAppkey={}, serviceName={}", address, info.getRemoteAppkey(), info.getServiceName()); } else { logger.info("Have unsubscribe on zookeeper[{}]: remoteAppkey={}, serviceName={}", address, info.getRemoteAppkey(), info.getServiceName()); } } catch (Throwable e) { throw new RegistryException("Failed to unsubscribe service " + info.getServiceName(), e); } }
@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 String generateNodePath(SubscribeInfo info) { String envName = Constants.EnvType.getEnvType(info.getEnv()).getEnvName(); StringBuilder pathBuilder = new StringBuilder(ZooKeeperNodeInfo.PATH_SEPARATOR).append(ZooKeeperNodeInfo.ROOT_NAME) .append(ZooKeeperNodeInfo.PATH_SEPARATOR).append(envName).append(ZooKeeperNodeInfo.PATH_SEPARATOR) .append(info.getRemoteAppkey()).append(ZooKeeperNodeInfo.PATH_SEPARATOR).append(ZooKeeperNodeInfo.PROVIDER); return pathBuilder.toString(); } }
@Override public void unregister(RegistryInfo info) { try { String path = generateNodePath(info); zkClient.delete(path); logger.info("Unregister provider on zookeeper[{}] path={}, info{}", address, path, info); } catch (Throwable e) { throw new RegistryException("Failed to unregister service: " + info.getServiceNames(), e); } }
public void reRegistry() { for (RegistryInfo info : registered) { logger.info("Re-register: {} by {}", info.toString(), registry.getClass().getName()); doRegister(info); } }
private void destroyUnusedInvokers(List<Invoker> unusedInvokers) { for (Invoker invoker : unusedInvokers) { logger.info("Remove provider {}, do destroy.", invoker.getProvider().toString()); invoker.destroy(); } }
@Override public void subcribe(SubscribeInfo info, ProviderListener listener) { subscribed.put(info, listener); doSubcribe(info, listener); logger.info("Subscribe {} by {}", info.toString(), registry.getClass().getName()); }
@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 void unregister(RegistryInfo info) { registered.remove(info); doUnregister(info); logger.info("Unregister {} by {}", info.toString(), registry.getClass().getName()); }
@Override public void register(RegistryInfo info) { registered.add(info); doRegister(info); logger.info("Register {} by {}", info.toString(), registry.getClass().getName()); }