千家信息网

nacos中ServiceReporter的作用是什么

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,这期内容当中小编将会给大家带来有关nacos中ServiceReporter的作用是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。ServiceManager.
千家信息网最后更新 2025年12月02日nacos中ServiceReporter的作用是什么

这期内容当中小编将会给大家带来有关nacos中ServiceReporter的作用是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

ServiceManager.init

nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/core/ServiceManager.java

@Component@DependsOn("nacosApplicationContext")public class ServiceManager implements RecordListener {    /**     * Map>     */    private Map> serviceMap = new ConcurrentHashMap<>();    private LinkedBlockingDeque toBeUpdatedServicesQueue = new LinkedBlockingDeque<>(1024 * 1024);    private Synchronizer synchronizer = new ServiceStatusSynchronizer();    private final Lock lock = new ReentrantLock();    @Resource(name = "consistencyDelegate")    private ConsistencyService consistencyService;    @Autowired    private SwitchDomain switchDomain;    @Autowired    private DistroMapper distroMapper;    @Autowired    private ServerListManager serverListManager;    @Autowired    private PushService pushService;    private final Object putServiceLock = new Object();    @PostConstruct    public void init() {        UtilsAndCommons.SERVICE_SYNCHRONIZATION_EXECUTOR.schedule(new ServiceReporter(), 60000, TimeUnit.MILLISECONDS);        UtilsAndCommons.SERVICE_UPDATE_EXECUTOR.submit(new UpdatedServiceProcessor());        try {            Loggers.SRV_LOG.info("listen for service meta change");            consistencyService.listen(KeyBuilder.SERVICE_META_KEY_PREFIX, this);        } catch (NacosException e) {            Loggers.SRV_LOG.error("listen for service meta change failed!");        }    }    //......}
  • ServiceManager的init方法往UtilsAndCommons.SERVICE_SYNCHRONIZATION_EXECUTOR注册了ServiceReporter

ServiceReporter

nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/core/ServiceManager.java

    private class ServiceReporter implements Runnable {        @Override        public void run() {            try {                Map> allServiceNames = getAllServiceNames();                if (allServiceNames.size() <= 0) {                    //ignore                    return;                }                for (String namespaceId : allServiceNames.keySet()) {                    ServiceChecksum checksum = new ServiceChecksum(namespaceId);                    for (String serviceName : allServiceNames.get(namespaceId)) {                        if (!distroMapper.responsible(serviceName)) {                            continue;                        }                        Service service = getService(namespaceId, serviceName);                        if (service == null) {                            continue;                        }                        service.recalculateChecksum();                        checksum.addItem(serviceName, service.getChecksum());                    }                    Message msg = new Message();                    msg.setData(JSON.toJSONString(checksum));                    List sameSiteServers = serverListManager.getServers();                    if (sameSiteServers == null || sameSiteServers.size() <= 0) {                        return;                    }                    for (Server server : sameSiteServers) {                        if (server.getKey().equals(NetUtils.localServer())) {                            continue;                        }                        synchronizer.send(server.getKey(), msg);                    }                }            } catch (Exception e) {                Loggers.SRV_LOG.error("[DOMAIN-STATUS] Exception while sending service status", e);            } finally {                UtilsAndCommons.SERVICE_SYNCHRONIZATION_EXECUTOR.schedule(this, switchDomain.getServiceStatusSynchronizationPeriodMillis(), TimeUnit.MILLISECONDS);            }        }    }
  • ServiceReporter实现Runnable接口,其run方法会遍历allServiceNames,取出distroMapper.responsible的serviceName,重新计算recalculateChecksum,然后添加到ServiceChecksum中,构造Message,遍历sameSiteServers使用synchronizer.send发送该消息;最后往UtilsAndCommons.SERVICE_SYNCHRONIZATION_EXECUTOR重新注册ServiceReporter

ServiceStatusSynchronizer

nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/misc/ServiceStatusSynchronizer.java

public class ServiceStatusSynchronizer implements Synchronizer {    @Override    public void send(final String serverIP, Message msg) {        if(serverIP == null) {            return;        }        Map params = new HashMap(10);        params.put("statuses", msg.getData());        params.put("clientIP", NetUtils.localServer());        String url = "http://" + serverIP + ":" + RunningConfig.getServerPort() + RunningConfig.getContextPath() +                UtilsAndCommons.NACOS_NAMING_CONTEXT + "/service/status";        if (serverIP.contains(UtilsAndCommons.IP_PORT_SPLITER)) {            url = "http://" + serverIP + RunningConfig.getContextPath() +                    UtilsAndCommons.NACOS_NAMING_CONTEXT + "/service/status";        }        try {            HttpClient.asyncHttpPostLarge(url, null, JSON.toJSONString(params), new AsyncCompletionHandler() {                @Override                public Integer onCompleted(Response response) throws Exception {                    if (response.getStatusCode() != HttpURLConnection.HTTP_OK) {                        Loggers.SRV_LOG.warn("[STATUS-SYNCHRONIZE] failed to request serviceStatus, remote server: {}", serverIP);                        return 1;                    }                    return 0;                }            });        } catch (Exception e) {            Loggers.SRV_LOG.warn("[STATUS-SYNCHRONIZE] failed to request serviceStatus, remote server: " + serverIP, e);        }    }    @Override    public Message get(String serverIP, String key) {        if(serverIP == null) {            return null;        }        Map params = new HashMap<>(10);        params.put("key", key);        String result;        try {            if (Loggers.SRV_LOG.isDebugEnabled()) {                Loggers.SRV_LOG.debug("[STATUS-SYNCHRONIZE] sync service status from: {}, service: {}", serverIP, key);            }            result = NamingProxy.reqAPI(RunningConfig.getContextPath()                + UtilsAndCommons.NACOS_NAMING_CONTEXT + "/instance/" + "statuses", params, serverIP);        } catch (Exception e) {            Loggers.SRV_LOG.warn("[STATUS-SYNCHRONIZE] Failed to get service status from " + serverIP, e);            return null;        }        if(result == null || result.equals(StringUtils.EMPTY)) {            return null;        }        Message msg = new Message();        msg.setData(result);        return msg;    }}
  • ServiceStatusSynchronizer实现了Synchronizer接口,其send方法会异步执行post请求,将statuses通知到目标server

小结

ServiceReporter实现Runnable接口,其run方法会遍历allServiceNames,取出distroMapper.responsible的serviceName,重新计算recalculateChecksum,然后添加到ServiceChecksum中,构造Message,遍历sameSiteServers使用synchronizer.send发送该消息;最后往UtilsAndCommons.SERVICE_SYNCHRONIZATION_EXECUTOR重新注册ServiceReporter

上述就是小编为大家分享的nacos中ServiceReporter的作用是什么了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

方法 接口 作用 内容 消息 分析 专业 中小 内容丰富 小结 就是 文章 更多 目标 知识 篇文章 行业 角度 资讯 资讯频道 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 罗永浩视频软件开发 我的世界养老服务器招管理 ftp上传服务器文件 网络安全与我同行黑板报 笔记本安装服务器系统控制台 企业文件服务器找哪个软件好 江阴信息软件开发进货价 平均人体头发数据库 计算机网络技术应用的未来 数据库账套可疑怎么做备份 网络安全工程师危害 辣椒基因数据库 网络安全宣传周宣讲ppt 基础软件开发是指哪些 怀旧服部落战秒进服务器 保定网络安全公司排名 生活中的数据库哪些问题 华为云服务器无法输入代码 数据库原理及技术电子书 互联网科技公司骗局 endnote数据库转移到电脑 我的世界mod服务器要什么 彩讯科技股份产业互联网专家 互联网科技产业有哪些 塔科夫资源最多的服务器 万载县小黄蜂战队网络技术服务部 数据库默认最大的设计区 重庆公共数据库挖掘数据科学方案 数据库技术及应用基础第二版 华为云服务器无法输入代码
0