当前位置: 首页 > news >正文

网站建设自学视频仿站容易还是建站容易

网站建设自学视频,仿站容易还是建站容易,哈尔滨网站备案手续费,哈尔滨市建设工程交易中心目录 一、Nacos客户端服务订阅的事件机制 1、监听事件的注册 2、ServiceInfo处理 serviceInfoHolder.processServiceInfo 一、Nacos客户端服务订阅的事件机制 Nacos客户端订阅的核心流程:Nacos客户端通过一个定时任务,每6秒从注册中心获取实例列表&…

目录

一、Nacos客户端服务订阅的事件机制

1、监听事件的注册

2、ServiceInfo处理

serviceInfoHolder.processServiceInfo


一、Nacos客户端服务订阅的事件机制

Nacos客户端订阅的核心流程:Nacos客户端通过一个定时任务,每6秒从注册中心获取实例列表,当发现实例发生变化时,发布变更事件,订阅者进行业务处理,然后更新内存中和本地的缓存中的实例。

        在第一步调用subscribe方法时,会订阅一个EventListener事件。而在定时任务UpdateTask定时获取实例列表之后,会调用ServiceInfoHolder.processServiceInfo方法对ServiceInfo进行本地处理,这其中就包括和事件处理。

1、监听事件的注册

在subscribe方法中,通过了下面的源码进行了监听事件的注册:

public class NacosNamingService implements NamingService {
...@Overridepublic void subscribe(String serviceName, String groupName, List<String> clusters, EventListener listener)throws NacosException {if (null == listener) {return;}String clusterString = StringUtils.join(clusters, ",");changeNotifier.registerListener(groupName, serviceName, clusterString, listener);clientProxy.subscribe(serviceName, groupName, clusterString);}

        在这其中我们主要要关注的就是changeNotifier.registerListener,此监听就是进行具体事件注册逻辑的,我们来看一下源码:
        可以看出,事件的注册便是将EventListener存储在InstancesChangeNotifier的listenerMap属性当中了。同时这里的数据结构为ConcurrentHashMap,key为服务实例的信息的拼接,value为监听事件的集合。

public class InstancesChangeNotifier extends Subscriber<InstancesChangeEvent> {private final String eventScope;private final Map<String, ConcurrentHashSet<EventListener>> listenerMap = new ConcurrentHashMap<>();
...public void registerListener(String groupName, String serviceName, String clusters, EventListener listener) {String key = ServiceInfo.getKey(NamingUtils.getGroupedName(serviceName, groupName), clusters);ConcurrentHashSet<EventListener> eventListeners = listenerMap.computeIfAbsent(key, keyInner -> new ConcurrentHashSet<>());eventListeners.add(listener);}

2、ServiceInfo处理

        上面的源码中已经完成了事件的注册,现在就来追溯触发事件的来源,UpdateTask中获取到最新的实例会进行本地化处理,部分源码如下:

// ServiceInfoUpdateService>UpdateTask>run()
ServiceInfo serviceObj = serviceInfoHolder.getServiceInfoMap().get(serviceKey);
if (serviceObj == null) {serviceObj = namingClientProxy.queryInstancesOfService(serviceName, groupName, clusters, 0, false);// 本地缓存处理serviceInfoHolder.processServiceInfo(serviceObj);lastRefTime = serviceObj.getLastRefTime();return;
}

serviceInfoHolder.processServiceInfo

这个逻辑简单来说:判断新的ServiceInfo数据是否正确,是否发生了变化。如果数据格式正确,且发生变化,那就发布一个InstancesChangeEvent事件,同时将ServiceInfo写入本地缓存。

public class ServiceInfoHolder implements Closeable {
...public ServiceInfo processServiceInfo(ServiceInfo serviceInfo) {String serviceKey = serviceInfo.getKey();if (serviceKey == null) {return null;}ServiceInfo oldService = serviceInfoMap.get(serviceInfo.getKey());if (isEmptyOrErrorPush(serviceInfo)) {//empty or error push, just ignorereturn oldService;}// 缓存服务信息serviceInfoMap.put(serviceInfo.getKey(), serviceInfo);// 判断注册的实例信息是否已变更boolean changed = isChangedServiceInfo(oldService, serviceInfo);if (StringUtils.isBlank(serviceInfo.getJsonFromServer())) {serviceInfo.setJsonFromServer(JacksonUtils.toJson(serviceInfo));}// 监控服务监控缓存Map的大小MetricsMonitor.getServiceInfoMapSizeMonitor().set(serviceInfoMap.size());// 服务实例已更变if (changed) {NAMING_LOGGER.info("current ips:({}) service: {} -> {}", serviceInfo.ipCount(), serviceInfo.getKey(),JacksonUtils.toJson(serviceInfo.getHosts()));// 添加实例变更事件,会被订阅者执行NotifyCenter.publishEvent(new InstancesChangeEvent(notifierEventScope, serviceInfo.getName(), serviceInfo.getGroupName(),serviceInfo.getClusters(), serviceInfo.getHosts()));// 记录Service本地文件DiskCache.write(serviceInfo, cacheDir);}return serviceInfo;}

分析到这里我们发现其实这个重点应该在服务信息变更之后,发布的InstancesChangeEvent事件,这个事件是NotifyCenter进行发布的,我们来追踪一下源码

Spring Cloud Alibaba - Nacos

干我们这行,啥时候懈怠,就意味着长进的停止,长进的停止就意味着被淘汰,只能往前冲,直到凤凰涅槃的一天!

http://www.yayakq.cn/news/758834/

相关文章:

  • 网站只做内容 不做外链hexo wordpress主题
  • 微信导航网站模板室内设计工作室排名
  • 网站建设公司的电话小企业网站建设
  • 织梦网站需要付费吗ui设计培训晚班
  • 网站建设选题意义c2c模式的概念
  • 图书网站建设的规模策划书网站建设数据库系统
  • 网站建设用户调查报告网页设计与制作教学设计
  • 门户网站建设百度文库常用的网站语言
  • 东营市建设网站阿里云买域名后怎么做网站
  • 微信网站怎么写住房和城乡建设部建设司网站首页
  • 暴富建站站酷网站的比赛网页谁做的
  • 如何制作网站板块建筑公司企业发展建议
  • 自适应网站和响应式网站的区别辽宁省工程新希望官网
  • 医疗手机网站模板9色3ce眼影
  • 秦皇岛网站推广价钱在线crm
  • 有什么网站专做买生活污水设备品牌设计公司宣传画册
  • 受欢迎的永州网站建设班级优化大师官方免费下载
  • 网站如何做交互传统企业网站建设运营分析
  • WordPress小说网站源码搜索引擎推广有哪些平台
  • 淘客网站佣金建设做政务网站
  • 查一下红之易道学做的什么网站百度网盘app下载安装官方免费版
  • nas 做网站服务器网页设计课程心得体会500字
  • 网站开发提高加载速度恩施网站制作公司
  • 怎样做动漫照片下载网站网站建设项目维护与评价书
  • 定制网站成本多少咋建网站
  • ps网站轮播图怎么做的wordpress 登录菜单
  • 米拓cms可以做企业网站吗做网站的公司一般怎么培训销售
  • html网页设计论文2000字wordpress插件带seo
  • 跨境电商网站设计海口企业自助建站系统
  • 莱西市建设局网站如何在阿里云上做网站