研究之dubbo-registry模块

maybe multi java process use the file, please config: dubbo.registry.file=xxx.properties 看到一篇解释比较好的文章: https://blog.csdn.net/lkforce/article/details/78544120 阅读详情
  dubbo-registry注册中心模块,基于注册中心下发地址的集群方式,以及对各种注册中心的抽象。 
   registry模块顶层接口为RegistryService和NotifyListener以及一个工厂接口RegistryFactory。 
   RegistryService接口包含4个方法。 
   void register(URL url); 注册服务 
   void unregister(URL url); 取消注册 
   void subscribe(URL url, NotifyListener listener); 订阅服务(推) 
   void unsubscribe(URL url, NotifyListener listener);取消订阅 
   List<URL> lookup(URL url); 订阅服务(拉) 
   
  Registry模块使用经典的消费者生成者模式,dubbo消费者订阅服务,dubbo服务者注册服务。 
  AbstractRegistry为RegistryService接口实现的一个抽象类,提供一些默认实现。 
 
Java代码  收藏代码
  1. public AbstractRegistry(URL url) {  
  2.     setUrl(url);  
  3.     // 启动文件保存定时器  
  4.     syncSaveFile = url.getParameter(Constants.REGISTRY_FILESAVE_SYNC_KEY, false);  
  5.     String filename = url.getParameter(Constants.FILE_KEY, System.getProperty("user.home") + "/.dubbo/dubbo-registry-" + url.getHost() + ".cache");  
  6.     File file = null;  
  7.     if (ConfigUtils.isNotEmpty(filename)) {  
  8.         file = new File(filename);  
  9.         if(! file.exists() && file.getParentFile() != null && ! file.getParentFile().exists()){  
  10.             if(! file.getParentFile().mkdirs()){  
  11.                 throw new IllegalArgumentException("Invalid registry store file " + file + ", cause: Failed to create directory " + file.getParentFile() + "!");  
  12.             }  
  13.         }  
  14.     }  
  15.     this.file = file;  
  16.     loadProperties();  
  17.     notify(url.getBackupUrls());  
  18. }  

   可以看出AbstractRegistry类在构建的时候,会去本地磁盘文件读取文件,转成properties对象。文件默认路径是user.home/.dubbo/dubbo-registry-host.cache 
   读取完之后会把这个url存到本地缓存文件里面去,但是该方法并非递增修改,而且是全部重写文件。 
 
Java代码  收藏代码
  1. public void doSaveProperties(long version) {  
  2.      if(version < lastCacheChanged.get()){  
  3.          return;  
  4.      }  
  5.      if (file == null) {  
  6.          return;  
  7.      }  
  8.      Properties newProperties = new Properties();  
  9.      // 保存之前先读取一遍,防止多个注册中心之间冲突  
  10.      InputStream in = null;  
  11.      try {  
  12.          if (file.exists()) {  
  13.              in = new FileInputStream(file);  
  14.              newProperties.load(in);  
  15.          }  
  16.      } catch (Throwable e) {  
  17.          logger.warn("Failed to load registry store file, cause: " + e.getMessage(), e);  
  18.      } finally {  
  19.          if (in != null) {  
  20.              try {  
  21.                  in.close();  
  22.              } catch (IOException e) {  
  23.                  logger.warn(e.getMessage(), e);  
  24.              }  
  25.          }  
  26.      }       
  27.   // 保存  
  28.      try {  
  29. newProperties.putAll(properties);  
  30.          File lockfile = new File(file.getAbsolutePath() + ".lock");  
  31.          if (!lockfile.exists()) {  
  32.             lockfile.createNewFile();  
  33.          }  
  34.          RandomAccessFile raf = new RandomAccessFile(lockfile, "rw");  
  35.          try {  
  36.              FileChannel channel = raf.getChannel();  
  37.              try {  
  38.                  FileLock lock = channel.tryLock();  
  39.                 if (lock == null) {  
  40.                      throw new IOException("Can not lock the registry cache file " + file.getAbsolutePath() + ", ignore and retry later, maybe multi java process use the file, please config: dubbo.registry.file=xxx.properties");  
  41.                  }  
  42.                 // 保存  
  43.                  try {  
  44.                     if (! file.exists()) {  
  45.                          file.createNewFile();  
  46.                      }  
  47.                      FileOutputStream outputFile = new FileOutputStream(file);    
  48.                      try {  
  49.                          newProperties.store(outputFile, "Dubbo Registry Cache");  
  50.                      } finally {  
  51.                         outputFile.close();  
  52.                      }  
  53.                  } finally {  
  54.                     lock.release();  
  55.                  }  
  56.              } finally {  
  57.                  channel.close();  
  58.              }  
  59.          } finally {  
  60.              raf.close();  
  61.          }  
  62.      } catch (Throwable e) {  
  63.          if (version < lastCacheChanged.get()) {  
  64.              return;  
  65.          } else {  
  66.              registryCacheExecutor.execute(new SaveProperties(lastCacheChanged.incrementAndGet()));  
  67.          }  
  68.          logger.warn("Failed to save registry store file, cause: " + e.getMessage(), e);  
  69.      }  
  70.  }  

  如果是两个不同的注册中心,不能使用一个缓存文件。 
  值得注意一点的是,多个dubbo服务公用一个cache文件的时候,如果一起启动,可能会出现Failed to load registry store File 这类异常信息,这是因为当时该文件其他服务占用了。这种情况开发环境比较多,可以无视掉。因为会重复去注册的,下面会说明,但是尽量还是手动指定注册缓存文件比较好。尽量不使用同一个缓存文件。 
 
Java代码  收藏代码
  1. <dubbo:registry address="${zookeeper.address}" file=".cache/dubbo-registry-car.cache" />  

这样指定的话,缓存文件会在当前工程目录下。 
RegistryService接口的所有方法参数都有URL对象,说明dubbo服务最终是转成URL来注册的。通过URL来表示服务的全部信息。 
FailbackRegistry是AbstractRegistry类的子类,通过模式设计模式扩展,重写了AbstractRegistry类一些实现,并新增模板方法,交个子类去实现。 
Java代码  收藏代码
  1. public FailbackRegistry(URL url) {  
  2.       super(url);  
  3.       int retryPeriod = url.getParameter(Constants.REGISTRY_RETRY_PERIOD_KEY, Constants.DEFAULT_REGISTRY_RETRY_PERIOD);  
  4.       this.retryFuture = retryExecutor.scheduleWithFixedDelay(new Runnable() {  
  5.           public void run() {  
  6.               // 检测并连接注册中心  
  7.               try {  
  8.                   retry();  
  9.               } catch (Throwable t) { // 防御性容错  
  10.                   logger.error("Unexpected error occur at failed retry, cause: " + t.getMessage(), t);  
  11.               }  
  12.           }  
  13.       }, retryPeriod, retryPeriod, TimeUnit.MILLISECONDS);  
  14.   }  

  FailbackRegistry构建的时候通过ScheduledExecutorService来延迟执行连接注册中心,默认延迟周期为5秒。 
  其中retry()方法从set集合里面取出注册失败的url,然后不断去重新注册。如果注册中心当机了,但是只要注册中心重新启动之后,dubbo还是会去重新注册的。 
 
Java代码  收藏代码
  1. @Override  
  2.  public void register(URL url) {  
  3.      super.register(url);  
  4.      failedRegistered.remove(url);  
  5.      failedUnregistered.remove(url);  
  6.      try {  
  7.          // 向服务器端发送注册请求  
  8.          doRegister(url);  
  9.      } catch (Exception e) {  
  10.          Throwable t = e;  
  11.   
  12.          // 如果开启了启动时检测,则直接抛出异常  
  13.          boolean check = getUrl().getParameter(Constants.CHECK_KEY, true)  
  14.                  && url.getParameter(Constants.CHECK_KEY, true)  
  15.                  && ! Constants.CONSUMER_PROTOCOL.equals(url.getProtocol());  
  16.          boolean skipFailback = t instanceof SkipFailbackWrapperException;  
  17.          if (check || skipFailback) {  
  18.              if(skipFailback) {  
  19.                  t = t.getCause();  
  20.              }  
  21.              throw new IllegalStateException("Failed to register " + url + " to registry " + getUrl().getAddress() + ", cause: " + t.getMessage(), t);  
  22.          } else {  
  23.              logger.error("Failed to register " + url + ", waiting for retry, cause: " + t.getMessage(), t);  
  24.          }  
  25.   
  26.          // 将失败的注册请求记录到失败列表,定时重试  
  27.          failedRegistered.add(url);  
  28.      }  
  29.  }  

  register方法把具体的注册实现交给子类的doRegister实现。注册失败的都会记录到失败的set集合里面去,值得注意一个check 配置,当设置<dubbo:registry check="false" />时,记录失败注册和订阅请求,后台定时重试。 
  zookeeper注册中心是dubbo推荐使用的注册中心,本身zookeeper的基于是Paxos,一个分布式一致性算法。 
  
 
  流程: 
1.服务提供者启动时向/dubbo/com.foo.BarService/providers目录下写入URL 
2.服务消费者启动时订阅/dubbo/com.foo.BarService/providers目录下的URL向/dubbo/com.foo.BarService/consumers目录下写入自己的URL 
3.监控中心启动时订阅/dubbo/com.foo.BarService目录下的所有提供者和消费者URL 
  dubbo如何通过注册中心来实现服务治理,则下篇文章博文单独讲解。 
实用工具抓取youtube热门数据 YouTube作为全球第二大搜索引擎,2024年日均视频播放量突破50亿次,头部创作者单月广告分成可达百万美元量级。但对数据分析者而言,其反爬机制堪称业界最严: ‌反爬技术升级‌:Google部署的Botguard系统可检测异常流量,触发机制包括: 单IP每小时请求超过50次即封禁 检测Headless浏览器指纹(如Chrome的navigator.webdriver属性) 动态加载内容(如评论数据需滚动页面3次后加载) ‌数据价值维度‌:某MCN机构研究显示,前100热门视频的标题关键词复用率高达67% 阅读详情

相关推荐

告别死记硬背!用业务场景驱动理解SAP PS OPSA参数文件配置

本文通过制造业新产品研发项目案例,详细解析SAP PS模块中OPSA参数文件配置的实际应用。从项目立项、WBS分解到研发物料管理,系统讲解关键配置项的业务价值,帮助用户告别死记硬背,实现业务场景驱动的参数配置学习。特别适合制造业项目管理人员提升SAP PS配置效率。

weixin_30415113的博客 480

dubbo用户文档摘选

dubbo使用文档摘选

noob_can的博客 773

ShardingSphere-JDBC 关键字问题

这里得到的提示就是,假设一个老库一堆表,只对个别表进行分表。引入sharding后虽然指定了分表的bindingTables,其余的走default-data-source就是默认不分表的。但是sharding会接管数据源,老表用默认的mybatis正常,sharding可能会报错。preciseAlgorithmClassName对应的是类名,注意yaml的缩进。这不是常见的没有配置sharding数据源导致empty的错误。使用sharding的时候,遇到了两个问题。...

bohu83的博客 4995

DUBBO源码学习(二)注册中心源码解析

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

lisyee的博客 1107

状态错误CS0234命名空间“Windows”中不存在类型或命名空间名“Management”(是否缺少程序集引用?)

解决源码编译UE打包失败问题

五百零一 2338

箱式连续提升机

箱式连续提升机,是对具有高度差较大(>1500mm)的输送线之间进行连接,将箱式物资进行连续输送的提升(或下降)的输送设备,可根据输送线的具体输送要求作相应的参数设计。目前的箱式连续提升机种类比较多,常用的形式主要有Z型和C型,工作原理相同,只是入口和出口分别在两侧和同侧。

月生沧溟 1248

dubbo 配置文件详解

一、dubbo常用配置 &lt;dubbo:service/&gt; 服务配置,用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心。 eg、&lt;dubbo:service ref="demoService" interface="com.unj.dubbotest.provider.DemoService" /&gt; &lt;dub...

weixin_34280237的博客 606

SMPTE ST 2110 概论(一)

SMPTE ST 2110 概论(一)前言ST 2110与ST 2022-6ST 2110-10:基本结构与时序ST 2110-20:未压缩的视频流后续 前言 这是一份我在实习期间制作的,关于SMPTE ST 2110的简单介绍。 这篇文章主要以梳理总结 SMPTE ST 2110 的概念为主,关于具体的内容,比如IP数据报的格式、RTP时间戳的具体代码内容等等,大家可以查阅 SMPTE ST 2...

Cidd0422的博客 2万+

Dubbo 学习、面试、总结

摘要:一直都在使用Dubbo,前面也写了一些Dubbo相关的文章,今天总结一下,仅供参考,如有哪里不对,请各位友友指正批评! 一:Dubbo介绍和总结系列一: 1、什么是Dubbo? Dubbo是阿里巴巴开发用来治理服务的中间件,资源调度和治理中心的管理工具。 2、ZooKeeper节点类型? ZooKeeper节点是有生命周期的,这取决于节点的类型,在ZooKeeper中,节点类型可以...

https://gitee.com/micai-code 1106

COMSOL有限元仿真深度指南:为结构件添加预应变

一、什么是预应力和预应变? 我们知道,结构力学问题中,结构件在外载荷作用下产生变形响应以吸收外载荷做功带来的能量;而在结构内部,整体的受力和变形则是通过固体微元的应力与应变传递的。 对于线弹性材料来说,应力与应变的关系可以线性表达,也即 σ=Dεσ = Dεσ=Dε ;在该式中,无论固体微元的应变程度多大,弹性矩阵DDD都是一个不变的常值。而对于超弹性材料来说,应力与应变的关系则需要通过应变能密度函数WWW来表征(详细参加博客《COMSOL有限元仿真深度指南:超弹性模型有限元分析入门》)。 从上面我们也不难

忘了面孔的Batou 7170

Python 实战:全面解析“微信搜一搜”内容爬取,从入门到企业级架构

本文将带你从零搭建爬虫项目,采用 Requests、Scrapy、Selenium、Proxy 池、中间人监控(如 Fiddler/mitmproxy)、分布式调度、数据库持久化、断点续抓等方案,实现可持续、抗封能力强的内容抓取系统。理解“微信搜一搜”页面结构与 Javascript 渲染逻辑;使用 Scrapy 框架搭建分布式爬虫;使用 Selenium 模拟浏览器抓取;构建代理池提升爬取成功率;对抗验证码、IP 封禁与 cookie 过期问题;

2201_76125261的博客 1393

dubbo源码研究之dubbo-registry模块

dubbo-registry注册中心模块,基于注册中心下发地址的集群方式,以及对各种注册中心的抽象。 registry模块顶层接口为RegistryService和NotifyListener以及一个工厂接口RegistryFactory。 RegistryService接口包含4个方法。 void register(URL url); 注册服务 void ...

u012425586的博客 506

PrimeTime low power-多电压设计流程(2)

get_power_switches`、`get_supply_nets` 和 `get_supply_ports` 命令的操作方式类似,并具有类似的命令选项。PrimeTime 根据 UPF 命令构建电源供应网络,包括 create_power_domain、create_supply_net、create_supply_set、create_supply_port、set_domain_supply_net 和 connect_supply_net。电源集句柄是为电源域隐式创建的一个抽象电源集。

QRBQ 712

Dubbo设计原理分析

总之,Dubbo的源码结构和设计原理非常丰富,需要深入的研究和理解。如果您有兴趣深入了解Dubbo的源码,我建议您从Dubbo的GitHub仓库开始,查看各个模块的源代码并阅读相关文档。在代码中,您可以看到服务接口的导出、消费者的动态代理、调用逻辑等。Dubbo的设计强调面向接口编程,服务提供者和消费者通过共享的接口定义进行交互。Protocol是Dubbo的协议模块,定义了服务的暴露和引用。Dubbo的源码非常庞大,由多个模块组成,涉及服务导出、调用、协议、序列化、注册中心、集群等。

kankan_s的专栏 58

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Dubbo项目启动报错 — [DUBBO] Failed to save registry store file, cause: Invalid file path

Dubbo项目启动报错 — [DUBBO] Failed to save registry store file, cause: Invalid file path

sao_jie的博客 5004

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Dubbo源码

今天,我们从消费方发起调用开始介入,逐步分析Dubbo的每层模块的由来以及承担的职责,形成对Dubbo的整体了解,最后在 Dubbo 3.0.7 源码层面上标识出每个模块与工程的 Module 对号入座。一个简简单单的调用,居然有这么多需要关注的层次模块,即便是你自己写的RPC调用框架壮大成型后,代码层次结构设计以及每层可能遇到的问题,和 Dubbo 框架其实会有着相似的解决套路。

qq_33240556的博客 1237

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java进阶【二十五】将近2万字的Dubbo原理解析,彻底搞懂dubbo (上)

​ 前面我们研究了RPC的原理,市面上有很多基于RPC思想实现的框架,比如有Dubbo。今天就从Dubbo的SPI机制、服务注册与发现源码及网络通信过程去深入剖析下Dubbo。Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。服务容器负责启动,加载,运行服务提供者。

jcc4261的博客 851

Dubbo 3.2版本分析Provider启动前的前菜

一直以来对Dubbo的实现原理颇为好奇,前几个月在Dubbo专栏里也陆续写了几遍文章,奈何自身原因+客观原因,就没有坚持下来。这次重启Dubbo源码刨析系列,也刚好可以借着2023年7月发布的比较新的Dubbo 3.2版本源码进行学习研究,共勉!

legendaryhaha的博客 1297

nacos dubbo指定外网ip

nacos 指定ip。

weixin_38301116的博客 1200

dubbo web工程示例_想要通过 Dubbo 进大厂,可能性高吗?

今天我想和你聊聊 Dubbo 。Dubbo 是由阿里开源,后来加入了 Apache 基金会,目前已经从孵化器毕业,成为 Apache 的顶级项目。Apache Dubbo 目前已经有接近 32.8 K 的 Star、21.4 K 的 Fork,其热度可见一斑, 很多互联网大厂(如阿里、滴滴、去哪儿网等)都是直接使用 Dubbo 作为其 RPC 框架,也有些大厂会基于 Dubbo 进行二次...

weixin_39652646的博客 118

【Java】已解决:com.alibaba.dubbo.rpc.RpcException: No provider available from registry

场景:一个Spring Boot项目中,使用Dubbo进行服务调用。服务提供者注册到注册中心(如Zookeeper),服务消费者从注册中心获取服务并进行调用。在分布式系统中,Dubbo是一个非常流行的RPC框架,用于实现高性能的远程服务调用。为了解决该报错问题,我们需要确保服务提供者正确启动并注册到注册中心,同时检查消费者的配置。这一错误通常发生在消费者尝试调用服务提供者时,未能找到相应的服务提供者。通过以上配置,我们可以确保服务提供者和消费者正确连接到注册中心,并且服务能够被正确发现和调用。

屿小夏.的知识博客 1187

Dubbo偶现无法注入服务

关于Dubbo偶现无法注入服务 ——————————————————————————————————————————————— 初次试水dubbo,偶现@Refrece注入其他服务为null, 但是单纯的重启这个服务就又可以注册上了,仔细研究dubbo资料发现 系统服务之间相互依赖严重,架构时只关闭了消费者启动时检查 加入三行 dubbo.reference.check=false # 提供者检查 dubbo.consumer.check=false #消费者检查 dubbo.registry.chec

embelfe_segge的博客 1645

dubbo源码解析(8)dubbo服务引用

入口找到ReferenceBean,关注到这个类继承了FactoryBean,熟悉spring的人知道继承了这个接口会通过 getObject()方法来获取bean, public Object getObject() throws Exception { return get(); } -----> public synchronized T get() { ...

m0_37139189的博客 321

Dubbo之HashedWheelTimer实现原理

11111111111111111111111111

zhaodongchao的博客 1134

Dubbo——demo

仅作自己参考用 1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl...

weixin_30719711的博客 138

dubbo php java_php可以实现dubbo接口吗

DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。不巧的是我司也在用,之前的解决方案是JAVA包装成HTTP的restful API给中间层Node.js或者PHP调用,但是其实有时候需求比较紧急的情况下,直接RPC...

weixin_36483301的博客 208
上一篇: MongoDB_MongoDB事务
下一篇: Apache Curator入门实战
hxpjava1
博客等级 码龄19年 1365粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值