石家庄新钥匙建站广州有什么好玩的山

bicheng/2026/1/25 4:05:29/文章来源:
石家庄新钥匙建站,广州有什么好玩的山,做网站要租服务器,怎么注册网上店铺前言 说到服务信息#xff0c;我们还是得回到NamingService#xff0c;因为这是和NacosServer进行服务注册的核心组件#xff0c;内部提供了注册、获取Nacos实例的能力。至于其他组件#xff0c;如Ribbon#xff0c;在调用时需要所有实例信息来进行负载#xff0c;那肯定… 前言 说到服务信息我们还是得回到NamingService因为这是和NacosServer进行服务注册的核心组件内部提供了注册、获取Nacos实例的能力。至于其他组件如Ribbon在调用时需要所有实例信息来进行负载那肯定就是通过NamingService的能力来获取到所有的实例。 NamingService 在NamingService中获取实例主要有两类方法一类是getAllInstances、另一类是selectInstances它们最主要的区别就是selectInstances增加了对实例是否健康的过滤的支持。 既然如此那我们直接来就看看selectInstances的逻辑 Override public ListInstance selectInstances(String serviceName, String groupName, ListString clusters, boolean healthy,boolean subscribe) throws NacosException {ServiceInfo serviceInfo;if (subscribe) {serviceInfo hostReactor.getServiceInfo(NamingUtils.getGroupedName(serviceName, groupName),StringUtils.join(clusters, ,));} else {serviceInfo hostReactor.getServiceInfoDirectlyFromServer(NamingUtils.getGroupedName(serviceName, groupName),StringUtils.join(clusters, ,));}return selectInstances(serviceInfo, healthy); }上述代码有两个逻辑 1、传入的subscribe如果是true就代表是订阅模式就走hostReactor.getServiceInfo查询反之走hostReactor.getServiceInfoDirectlyFromServer查询。 2、根据实例的健康状态进行过滤返回。 那我们就先走进HostReactor对它提供的两个能力进行分析 HostReactor 这个类是在实例化NamingService时在构造函数中实例化的一个对象。 而在HostReactor实例化时其构造函数会创建一个定时线程池核心线程数量可以通过spring.cloud.nacos.discovery.namingPollingThreadCount进行控制默认是当前机器核心数的一半最少为1。 也会实例化一个FailoverReactor是一个容灾备份反应器其内部实例化了一个单线程的定时线程池内部由两个延迟定时任务组成 SwitchRefresher 每隔5秒去检查文件系统中是否有cacheDir /failover00-00---000-VIPSRV_FAILOVER_SWITCH-000---00-00文件如果有那么就标记为容灾模式。 cacheDir的取值如下 private void initCacheDir() {cacheDir System.getProperty(com.alibaba.nacos.naming.cache.dir);if (StringUtils.isEmpty(cacheDir)) {cacheDir System.getProperty(user.home) /nacos/naming/ namespace;} }FailoverFileReader 如果是容灾模式就从文件中读取Service信息。 DiskFileWriter 初始延迟30分钟后每隔1天将serviceInfoMap(服务信息)写入到cacheDir /failover文件夹下。 整个FailoverReactor的示意图如下 在了解了HostReactor的基本情况后我们来对上面调用的两个方法进行分析。 getServiceInfo public ServiceInfo getServiceInfo(final String serviceName, final String clusters) {NAMING_LOGGER.debug(failover-mode: failoverReactor.isFailoverSwitch());String key ServiceInfo.getKey(serviceName, clusters);// 如果是容灾模式就从failoverReactor中获取文件系统中缓存的ServiceInfo信息if (failoverReactor.isFailoverSwitch()) {return failoverReactor.getService(key);}// 从HostReactor维护的serviceInfoMap中取ServiceInfoServiceInfo serviceObj getServiceInfo0(serviceName, clusters);// 如果HostReactor中没有if (null serviceObj) {serviceObj new ServiceInfo(serviceName, clusters);// 存入serviceInfoMapserviceInfoMap.put(serviceObj.getKey(), serviceObj);updatingMap.put(serviceName, new Object());// 查询服务端的这个Service的信息如果有则使用和接收到服务端Service推送一致的更新处理updateServiceNow(serviceName, clusters);updatingMap.remove(serviceName);} else if (updatingMap.containsKey(serviceName)) {// 如果原来的serviceInfoMap有数据但updatingMap又存在说明可能存在了并发问题则需要锁住serviceObj一段时间等待执行完成if (UPDATE_HOLD_INTERVAL 0) {// hold a moment waiting for update finishsynchronized (serviceObj) {try {serviceObj.wait(UPDATE_HOLD_INTERVAL);} catch (InterruptedException e) {NAMING_LOGGER.error([getServiceInfo] serviceName: serviceName , clusters: clusters, e);}}}}// 用一个定时线程池去执行Servcie的主动更新scheduleUpdateIfAbsent(serviceName, clusters);// 从本地serviceInfoMap中获取ServiceInforeturn serviceInfoMap.get(serviceObj.getKey()); }在现在就去更新服务信息的方法updateServiceNow中最终会调用的processServiceJson方法方法太长直接说逻辑 public ServiceInfo processServiceJson(String json) {.... }1、如果是以前就存在于本地serviceInfoMap中的数据就分别计算出其中新增修改删除的实例如果是修改的实例需要更新心跳信息。 2、更新本地serviceInfoMap。 3、使用EventDispatcher发布通知事件。 4、ServiceInfo写入本地磁盘。 在定时更新服务信息的方法scheduleUpdateIfAbsent中 public void scheduleUpdateIfAbsent(String serviceName, String clusters) {if (futureMap.get(ServiceInfo.getKey(serviceName, clusters)) ! null) {return;}synchronized (futureMap) {if (futureMap.get(ServiceInfo.getKey(serviceName, clusters)) ! null) {return;}ScheduledFuture? future addTask(new UpdateTask(serviceName, clusters));futureMap.put(ServiceInfo.getKey(serviceName, clusters), future);} }如果futureMap中不存在这个Service的任务才会使用addTask进行添加。addTask中就是将UpdateTask延迟1s执行一次。具体后续调用是在UpdateTask中实现的。 Override public void run() {long delayTime DEFAULT_DELAY;try {ServiceInfo serviceObj serviceInfoMap.get(ServiceInfo.getKey(serviceName, clusters));if (serviceObj null) {updateService(serviceName, clusters);return;}if (serviceObj.getLastRefTime() lastRefTime) {updateService(serviceName, clusters);serviceObj serviceInfoMap.get(ServiceInfo.getKey(serviceName, clusters));} else {// if serviceName already updated by push, we should not override it// since the push data may be different from pull through force pushrefreshOnly(serviceName, clusters);}lastRefTime serviceObj.getLastRefTime();if (!eventDispatcher.isSubscribed(serviceName, clusters) !futureMap.containsKey(ServiceInfo.getKey(serviceName, clusters))) {// abort the update taskNAMING_LOGGER.info(update task is stopped, service: serviceName , clusters: clusters);return;}if (CollectionUtils.isEmpty(serviceObj.getHosts())) {incFailCount();return;}delayTime serviceObj.getCacheMillis();resetFailCount();} catch (Throwable e) {incFailCount();NAMING_LOGGER.warn([NA] failed to update serviceName: serviceName, e);} finally {executor.schedule(this, Math.min(delayTime failCount, DEFAULT_DELAY * 60), TimeUnit.MILLISECONDS);} }上述代码简化一下就是以下几个点 1、如果本地serviceInfoMap中没有这个Service就去服务端查询并更新。 2、如果通过这样的拉模式下最后修改的时间是大于这个Service本身的修改时间的才进行更新。 3、下一次执行的时间是根据失败次数来定的比如第一次失败那就是delayTime左移一位失败几次就左移几次最多左移6次且最大延迟60s执行。 getServiceInfoDirectlyFromServer public ServiceInfo getServiceInfoDirectlyFromServer(final String serviceName, final String clusters)throws NacosException {String result serverProxy.queryList(serviceName, clusters, 0, false);if (StringUtils.isNotEmpty(result)) {return JacksonUtils.toObj(result, ServiceInfo.class);}return null; }这个方法就是直接请求服务端拿到ServiceInfo的数据。 思考 看到这里我们会不会有个疑问那就是HostReactor是通过定时执行去更新服务信息的那如果在时间间隔内有其他Servcie信息的更新呢那我们岂不是得等到下一次任务执行时才能得到更新后的信息 Nacos是考虑到了的通过用定时任务通过HTTP去拉数据和接收服务端通过UDP推送的数据一拉一推来保证数据的实时性。 HostReactor中的PushReceiver就是客户端侧对服务端侧推数据的处理器。 PushReceiver HostReactor在实例化时其构造方法中也会实例化一个PushReceiver其内部是一个单线程的定时线程池死循环用来接收来自服务端的信息以及向服务端发送ACK确认信息。 核心代码如下 Override public void run() {while (!closed) {try {// byte[] is initialized with 0 full filled by defaultbyte[] buffer new byte[UDP_MSS];DatagramPacket packet new DatagramPacket(buffer, buffer.length);udpSocket.receive(packet);String json new String(IoUtils.tryDecompress(packet.getData()), UTF_8).trim();NAMING_LOGGER.info(received push data: json from packet.getAddress().toString());PushPacket pushPacket JacksonUtils.toObj(json, PushPacket.class);String ack;if (dom.equals(pushPacket.type) || service.equals(pushPacket.type)) {hostReactor.processServiceJson(pushPacket.data);// send ack to serverack {\type\: \push-ack\ , \lastRefTime\:\ pushPacket.lastRefTime \, \data\: \\};} else if (dump.equals(pushPacket.type)) {// dump data to serverack {\type\: \dump-ack\ , \lastRefTime\: \ pushPacket.lastRefTime \, \data\: \ StringUtils.escapeJavaScript(JacksonUtils.toJson(hostReactor.getServiceInfoMap())) \};} else {// do nothing send ack onlyack {\type\: \unknown-ack\ , \lastRefTime\:\ pushPacket.lastRefTime \, \data\: \\};}udpSocket.send(new DatagramPacket(ack.getBytes(UTF_8), ack.getBytes(UTF_8).length,packet.getSocketAddress()));} catch (Exception e) {NAMING_LOGGER.error([NA] error while receiving push data, e);}} }上述代码主要有以下几个逻辑 1、死循环接收udp的数据。 2、如果是dom或者service类型的消息会交由HostReactor进行处理。 3、向服务端发送ack确认信息。 总结 Nacos是通过定时任务使用HTTP拉数据和接收服务端通过UDP推送的数据来实现更新服务信息的目的。 今天的内容中还涉及到了Nacos的容灾处理可以通过在磁盘中配置达到开启本地容灾的模式。在获取实例时就会去本地磁盘中的备份文件中去找服务实例的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/86975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

建手机端网站代码生成器手机版

一.Docker环境配置 1.拉取Docker镜像 sudo docker pull ubuntu:18.04拉取的为ununtu18版本镜像&#xff0c;环境十分干净&#xff0c;可以通过以下命令查看容器列表 sudo docker images 如果想删除多余的docker image&#xff0c;可以使用指令 sudo docker rmi -f <id&g…

seo技术306如何进行网站的seo

方法一&#xff1a; 打开 Microsoft 官网&#xff1a; 打开开发人员工具&#xff08;按 F12 或右键点击“检查”&#xff09;。 点击“电脑模拟手机”按钮&#xff0c;即下图&#xff1a; 点击后重新加载此网页&#xff0c;即可看到下载选项。

h5跟传统网站有啥区别商务网站建设详细步骤

概念性的介绍&#xff0c;一略而过&#xff0c;不重要。 16.1 数据仓库技术 16.2 联机分析处理技术 16.3 数据挖掘技术 16.4 大数据时代的新型数据仓库 16.5 小结

网站后台的形成淄博网站制作方案

ps -ef |grep python # 查找工具执行PID python pid 11287lsof -p 11287 |wc -l 查看进程占用句柄设置句柄上限IOError: [Errno 24] Too many open files:解决方法

物理机安装虚拟机做网站好处深圳市光明区官网

前言 [MixedCli](https://zhangfisher.github.io/mixed-cli/)为monorepo应用开发命令行程序提供了一套解决方案&#xff0c;提供了更加友好的命令行开发体验。 第1步&#xff1a;创建工程 以一个典型的monorepo为例开始&#xff1a; flexapppackagescli corevuereact示例…

织梦云建站系统谷歌广告代理

前言&#xff1a;关于最近开源后&#xff0c;不少朋友问&#xff0c;怎么我下载下来&#xff0c;运行不了。或者怎么没有左边菜单。货不对板&#xff1f;还是我吃了数据&#xff1f;感言&#xff1a;开源不容易&#xff0c;更不容易的是&#xff0c;明明毫无保留&#xff0c;还…

狮山网站设计制作网站用什么软件有哪些

Spring最重要的功能就是操作数据&#xff0c;数据库编程也是互联网编程的基础&#xff0c;Spring为开发者提供了JDBC模板模式&#xff0c;使用JdbcTemplate可以简化许多编码工作&#xff0c;同时也提供了TransactionTemplate支持事务的模板&#xff0c;但都不是常用技术&#x…

网站关键词在哪里修改网络营销推广的劣势

说起IOC和DI,使用过ASP.NET Core的人对这两个概念一定不陌生&#xff0c;早前&#xff0c;自己也有尝试过去了解这两个东西&#xff0c;但是一直觉得有点很难去理解&#xff0c;总觉得对其还是模糊不清&#xff0c;所以&#xff0c;趁着今天有空&#xff0c;就去把两个概念捋清…

系部网站建设研究方案wordpress 插件发文章

ConceptDraw MINDMAP mac是一款思维导图绘制软件&#xff0c;它可以帮助用户快速创建各种类型的思维导图&#xff0c;如组织结构图、流程图、概念图和UML图等。该软件具有直观的界面和简单易用的操作方式&#xff0c;使得用户能够轻松地创建复杂的思维导图。此外&#xff0c;它…

和一起做网店类似的网站青岛建设集团有限公司

BottomAppBar 底部应用栏 BottomAppBar 是一个在 Jetpack Compose 中用于创建底部应用栏的组件。它提供了一个高度可定制且功能丰富的底部导航解决方案。 它的使用方式与 TopAppBar 类似。下面的图是 BottomAppBar 的基本样式图。 常见使用场景 BottomAppBar 在应用中常用于…

建网站的网站有哪些搜网站技巧

11、虚函数、多态、纯虚函数 虚函数覆盖调用 多态实现多态的两个必要条件多态 和 this指针多态的实现&#xff1a;虚函数表虚函数表与动态绑定动态绑定动态绑定对性能的影响 纯虚函数抽象类纯抽象类 虚函数 形如class 类名{ virtual 返回值 函数名(形参表) { … } }; 的成员函…

网站建设服务费帝国做网站是选择静态还是伪静态

码云使用记录 主要步骤 1、https://gitee.com 注册 2、下载Git 3、配置SSH 4、创建远程仓库 5、切到本地项目目录下将本地项目推到远程 前两步根据提示进行即可&#xff0c;下面从第三步开始讲解 3、配置SSH&#xff08;用于提交代码和更新代码&#xff09; https://gitee.…

中山小榄网站网站建设与维护费

某一个业务需求&#xff0c;需要拿到我的用户信息&#xff0c;后端不直接返回的情况下。我需要对token信息解码拿到该信息&#xff0c;对jsonwebtoken进行一下简单学习&#xff0c;以此记录。 jsonwebtoken&#xff1a; jsonwebtoken 是一个 Node.js 中用于创建和验证 JSON W…

广东网站建设哪家好优分销app下载

目录 一、over()开窗函数 二、无参over()的使用 三、over(partition by 列名) 四、over(order by 列名 asc/desc) 五、over(partition by 列名 order by 列名 asc|desc) 六、练习&#xff08;笔试&#xff09; 一、over()开窗函数 拓展:数据库的版本 oracle:8i 9i 10g …

网站的角色设置如何做网站怎么做外链知乎

题目要求&#xff1a; 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”&#xff0c;要求按下列格式打印 ************ *****所谓“沙漏形状”&#xff0c;是指每行输出奇数个符号&#xff1b;各行符号中心对齐&#xff1b;相邻两行符号数差2&#xff1b;…

珠海网站制作推广知页怎么转换wordpress

在SAP中&#xff0c;科目设置错了统驭科目类型并且记账了要如何修改&#xff1f; 例如&#xff1a;前期应收账款对应的统驭科目类型前期设置成了供应商&#xff0c;并且供应商用该科目过来账&#xff0c;现在需要调整&#xff0c;想要将供应商调整到客户&#xff0c;科目为当前…

WordPress更改网站地址东莞制作公司网站的公司

学习就像一段长跑&#xff0c;比的不是谁跑得快&#xff0c;而是谁更能坚持&#xff01;&#xff01; 1 队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First O…

有做酒席酒水网站吗wordpress后台满

用户域登录各窗口汇总表 主要任务&#xff1a;从kafka页面日志主题读取数据&#xff0c;统计 七日回流用户&#xff1a;之前活跃的用户&#xff0c;有一段时间不活跃了&#xff0c;之后又开始活跃&#xff0c;称为回流用户当日独立用户数&#xff1a;同一个用户当天重复登录&a…

网站建设一条龙怎么样经典网络营销案例

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 动态内存管理 1、为什么要有动态内存分配 2、malloc和free 2.1、malloc 2.2、free 3、calloc和realloc 3.1、calloc 3.2、realloc 4、常见的动态内存的错…