Dubbo3使用Zookeeper作为注册中心的方案讨论!详解DubboAdmin与PrettyZoo来监控服务的优劣!
文章目录
一:Dubbo注册中心的基本使用
二:Zookeeper注册中心的使用
1:依赖引入
2:实际开发
三:Zookeeper作为注册中心的使用展示
1:启动注册Zookeeper服务
2:引入注册中心
(一):Provider
(二):Consumer
3:启动服务结果展示
4:监控服务的两种手段
一:Dubbo注册中心的基本使用
我们使用的和分析讲解的Dubbo版本是Dubbo3,作为Dubbo来讲Dubbo支持的注册中心有很多Zookeeper、Nacos、Consule等等。这是三种比较常见的注册中心当然我指的是在Dubbo当中,另外不太常见的还有Etced这样的注册中心。我们在进行Dubbo注册中心讲解的时候,会把这个三个着重挑选出来作为重点讲解对象,这个原因是非常简单的。
首先我们在前面的Rpc专栏的时候,Zookeeper我们已经分析过了,而另外的Nacos在微服务当中有着举足轻重的地位!他也是阿里的DNS这种解决方案当中N的这个元素,他在阿里的体系技术中有着很高的作用。对于Consul来讲,在云原生环境下这个Consul是非常适用于云原生环境的技术栈,所以适应新的潮流我们不得不对Consul进行分析和讲解。Etced相对来讲使用要少一点,我们暂时不对他进行相应的讲解。
二:Zookeeper注册中心的使用
应用Zookeeper作为注册中心,首先我们要对引入对应的依赖。这个依赖实际上包含的是两个部分的内容。第一个依赖是Zookeeper的Java客户端,客户端是Java应用与Zookeeper进行通信交互的基础,我们当前使用的是3.8.1这个版本,第二个依赖是对Zookeeper的Java客户端的高级封装curator,在这里我们选择的是curator5这个版本。实际上作为Zookeeper客户端和curator版本的使用,Dubbo已经在他的官网上给我们罗列出来了:
Zookeeper Server版本 | Dubbo版本 | Dubbo Zookeeper依赖包 | 说明 |
3.4.x及以下 | 3.0.x及以上 | dubbo-dependencies-zookeeper | 传递依赖Curator4.x、Zookeeper 3.4.x |
3.5.x及以上 | 3.0.x及以上 | dubbo-dependencies-zookeeper-curator5 | 传递依赖Curator5.x、Zookeeper 3.7.x |
3.4.x及以上 | 2.7.x及以下 | dubbo-dependencies-zookeeper | 传递依赖Curator4.x、Zookeeper 3.4.x |
3.5.x及以上 | 2.7.x及以下 | 无 | 需要手动添加Curator、Zookeeper等相关客户端依赖 |
这里边涉及到的版本有Dubbo的版本和Zookeeper的版本和他们对应的依赖包的说明,当前咱们的Dubbo选择的是3.2.0且Zookeeper的版本选择是的3.6这个版本,按照这个关系我们应该从第二行的表格中的设置方式去挑选。 所以应该选择dubbo-dependencies-zookeeper-curator5这个依赖包。
1:依赖引入
基于上边的依赖关系,我们挑选如下的版本来设置我们的Zookeeper客户端版本。
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper-curator5</artifactId><version>${dubbo.version}</version><type>pom</type><exclusions><exclusion><artifactId>zookeeper</artifactId><groupId>org.apache.zookeeper</groupId></exclusion></exclusions></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.8.1</version></dependency>
2:实际开发
接下来我们就需要进行相应的开发了。接下来的开发反而比较简单了,首先我们的依赖已经引入进来了。我们只需要在provider和consumer当中进行一个配置即可,其中一个非常指的注意的是,不论我们选择使用什么注册中心或者Zookeeper或者Nacos也好,只要在Dubbo的体系下使用注册中心,那么这个配置必须在我们的Provider和Consumer下面都进行注册!
如果我们还引入了DubboAdmin的话,我们也得在DubboAdmin当中对注册中心进行相应的配置。并且呢Provider对注册中心的配置和Consumer对注册中心的配置以及DubboAdmin对注册中心的配置要保持一致!所以,我们的配置流程就是在Consumer和Provider的配置文件中去配置一个dubbo.registry.address即可:
dubbo:registry:address:zookeeper://127.0.0.1:2181
注册中心的地址里面如果我们选择的是Zookeeper作为注册中心,那么需要使用Zookeeper协议。Zookeeper://这样就代表了Zookeeper的协议,如果后续我们选择Nacos的话,只需要使用:
dubbo:registry:address:nacos://127.0.0.1:2181
值得注意的是,协议后边的ip地址就是我们的注册中心服务对应的主机ip地址。我们当前是本地安装那么就是127.0.0.1。当前的端口是注册中心的监听端口,Zookeeper的默认端口是2181,Nacos的默认端口是8848,Consul的默认端口是8500 ,通过这样的一种方式,我们就在我们的整个服务中引入了Zookeeper作为我们的注册中心了。
三:Zookeeper作为注册中心的使用展示
1:启动注册Zookeeper服务
启动命令:bin/zkServer.cmd
启动结果:
使用我们的PrettyZoo可视化工具可以看到Zookeeper的服务内容。 当前我们可以清楚的看到在我们的根节点下只有我们一个zookeeper的节点,这是非常正常和干净的。接下来我们启动我们的服务来进行测试。
2:引入注册中心
(一):Provider
spring:application:name: DUBBO-02-REGISTER-PROVIDERdubbo:application:qos-enable: falseregister-mode: interfaceprotocol:name: dubboport: -1registry:address: zookeeper://127.0.0.1:2181
(二):Consumer
spring:application:name: DUBBO-03-REGISTER-CONSUMERdubbo:application:qos-enable: falseregistry:address: zookeeper://127.0.0.1:2181
3:启动服务结果展示
首先我们直接启动提供者,然后在启动我们的消费者。
消费者:
@SpringBootTest
public class TestDubbo {@DubboReferenceprivate UserService userService;@Testvoid test1() throws IOException {String xiaohei = userService.login("xiaohei", "11111");System.out.println("xiaohei = " + xiaohei);System.in.read();}
}
启动之后,服务向我们的注册中心发起注册,PrettyZoo界面发生变化:
消费者是基于测试启动的一个服务,然后UserService代理对象已经基于DubboReference注解注入了进来,我们加入一个阻塞方便查看结果,首先是我们的消费端的结果展示:
2023-11-23 22:51:04.008 INFO 4272 --- [ main] o.a.d.r.c.m.MigrationRuleHandler : [DUBBO] Succeed Migrated to APPLICATION_FIRST mode. Service Name: com.suns.service.UserService, dubbo version: 3.2.0, current host: 192.168.8.1
2023-11-23 22:51:04.008 INFO 4272 --- [ main] org.apache.dubbo.config.ReferenceConfig : [DUBBO] Referred dubbo service: [com.suns.service.UserService]. it's not GenericService reference, dubbo version: 3.2.0, current host: 192.168.8.1
2023-11-23 22:51:04.011 INFO 4272 --- [Report-thread-1] o.a.d.m.s.z.ZookeeperMetadataReport : [DUBBO] store consumer metadata. Identifier : org.apache.dubbo.metadata.report.identifier.MetadataIdentifier@440c2c9d; definition: org.apache.dubbo.common.url.component.URLParam$URLParamMap@58ea4a38, dubbo version: 3.2.0, current host: 192.168.8.1
xiaohei = this is login
提供者基于SpringBoot入口类进行服务启动,服务启动完毕之后等待消费者的调用,接下来是我们消费者的调用结果:
2023-11-23 22:48:38.704 INFO 612 --- [pool-1-thread-1] .b.c.e.AwaitingNonWebApplicationListener : [Dubbo] Current Spring Boot Application is await...
2023-11-23 22:51:03.960 INFO 612 --- [erverWorker-3-1] o.a.d.r.t.netty4.NettyServerHandler : [DUBBO] The connection of /192.168.8.1:55886 -> /192.168.8.1:20880 is established., dubbo version: 3.2.0, current host: 192.168.8.1
2023-11-23 22:51:04.123 INFO 612 --- [erverWorker-3-1] o.a.dubbo.rpc.protocol.dubbo.DubboCodec : [DUBBO] Because thread pool isolation is enabled on the dubbo protocol, the body can only be decoded on the io thread, and the parameter[decode.in.io.thread] will be ignored, dubbo version: 3.2.0, current host: 192.168.8.1
UserServiceImpl.login name is xiaohei password is 11111
从结果上来看,我们从消费端出入的参数在服务提供端控制台正确的被打印了出来,说明我们的消费者和提供者之间的Rpc调用成功进行,也证明了基于此次Zookeeper作为我们的注册中心完成消费者和提供者之间的通信是成功的!
4:监控服务的两种手段
当然我们刚才监控注册中心的方式是基于PrettyZoo的形式来检测我们的注册中心,那么还有没有其他的方式来监控我们的注册中心中的内容呢?当时是有的,这个手段就是基于DubboAdmin当我们启动完毕DubboAdmin之后,可能会遇到这样的一个问题导致启动失败。这个异常就是端口地址绑定失败,这个是因为我们的DubboAdmin启动的时候会模拟一个Dubbo服务出来往我们的注册中心发起注册,现在报错是因为我们的我们刚才启动的提供者的服务已经把我们的本地20880端口给占用了,这个时候DubboAdmin在基于这个端口启动就启动不起来了,我们需要先启动我们的DubboAdmin,然后在启动我们的Provider和Consumer即可,因为按照道理来讲也应该先启动我们的监控平台,在启动我们的Dubbo服务。
浏览器中输入Localhost:9000就可以查看我们的DubboAdmin监控平台。上来之后,我们可发发现DubboAdmin中只有我们的MockService。这个时候重新启动我们的提供者和消费者即可。这个时候,我们可以在DubboAdmin中看到我们的Dubbo服务了。
这件事情告诉我们如何监控我们的服务,第一种方式就是基于我们的注册中心,如果是Zookeeper作为注册中心的话,我们可以使用PrettyZoo作为可视化工具进行检测即可。第二种方式就是使用DubboAdmin也可以完成对Dubbo服务的监控!
后续,我们强烈建议使用DubboAdmin来监控我们的服务,首先就是DubboAdmin不仅仅可以可以监测到具体的服务,另外还可以对服务进行测试、服务的统计等等功能。所以后续我们的Pretty可以少用,尽量多用我们的DubboAdmin。
为什么我们切换启动顺序之后,后续的Provider的端口就不再是20880了呢?当前我们的提供者基于Dubbo协议,他的端口号我们设置的是-1,这个负一的特点就是如果服务启动的时候如果默认端口号20880被占用的话,就会在原有的基础上进行+1,这样我们的DubboAdmin中的MockService和提供者服务就都能正常启动了。值得注意的是DubboAdmin启动的时候,是没有端口号+1的这个功能的。
相关文章:

Dubbo3使用Zookeeper作为注册中心的方案讨论!详解DubboAdmin与PrettyZoo来监控服务的优劣!
文章目录 一:Dubbo注册中心的基本使用 二:Zookeeper注册中心的使用 1:依赖引入 2:实际开发 三:Zookeeper作为注册中心的使用展示 1:启动注册Zookeeper服务 2:引入注册中心 (一)…...
前端uni微信小程序和后端nodejs使用websoket
需求 前端向后台服务器发请求获取验证码,然后端游输入验证码,向我的后端发请求获取验证信息。后台给游戏端返回信息的时候同时给微信小程序端返回验证结果。意思是不要微信小程序端主动触发,验证是否绑定的请求。 思路 后端生成验证码时存…...

java小游戏之【王者荣耀】
首先创建一个新的Java项目命名为“王者荣耀”,并在src下创建两个包分别命名为“com.sxt"、”com.stx.beast",在相应的包中创建所需的类。 代码 package com.sxt;import javax.swing.*; import java.awt.*;public class Background extends GameObject {p…...

QT网络协议知识体系(一)
//获取主机的名称和ip地址 //获取主机的所有信息...

【数据库】表的连接在执行时的算法解析,嵌套循环连接算法的几种实现,多表连接中表的数量会影响什么
嵌套循环连接 专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新…...
【刷新:重新发现商业与未来】书笔记
收获 同理心:站在他人角度考虑他人感受,他人需要什么,我能提供什么;他人可以是员工,家人等;对于员工来讲核心四件事:1、薪水;2、有结果;3、有成长;4、工作开…...
Lua实现面向对象三大特性
面向对象是基于table实现的 封装 :(冒号) 自动将调用该函数的对象作为第一个参数传入 --Object就是第一参数 function Object:new() self:代表默认传入的第一个参数 _index:当自己的变量中找不到时,会默认找原表中_index指向的内容 Obj…...

竞赛python区块链实现 - proof of work工作量证明共识算法
文章目录 0 前言1 区块链基础1.1 比特币内部结构1.2 实现的区块链数据结构1.3 注意点1.4 区块链的核心-工作量证明算法1.4.1 拜占庭将军问题1.4.2 解决办法1.4.3 代码实现 2 快速实现一个区块链2.1 什么是区块链2.2 一个完整的快包含什么2.3 什么是挖矿2.4 工作量证明算法&…...
C#结合JavaScript实现上传视频到腾讯云点播平台
目录 需求 关键代码 界面元素布局 C# 实现服务端的签名类 上传视频的JS实现 视频演示 小结 需求 在云培训系统里,制作视频课件是我们的主要工作之一,制作完成后如果将这些素材存储到服务器并进行分发播放,是摆在我们面前的一个问题。…...

简单介绍一下js中的构造函数、原型对象prototype、对象原型__proto__、原型链
构造函数 function Star (uname, age){this.uname unamethis.age agethis.sing function(){ log(唱歌~) }}let xzq new Star(薛之谦, 30)let ldh new Star(刘德华, 20)log(ldh) // { uname: 刘德华, age: 20, sing: f }ldh.sing() // 唱歌~log(ldh.sing xzq.sing) // fal…...

Java基于springboot+vue开发服装商城小程序
演示视频: 小程序 https://www.bilibili.com/video/BV1rM411o7m4/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07ae139b 管理员 https://www.bilibili.com/video/BV1fc411D7V3/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07ae…...

设计模式之十二:复合模式
模式通常被一起使用,并被组合在同一个解决方案中。 复合模式在一个解决方案中结合两个或多个模式,以解决一般或重复发生的问题。 首先重新构建鸭子模拟器: package headfirst.designpatterns.combining.ducks;public interface Quackable …...
java通过年月获取当前月所有周(跨月),获取每周开始日期和结束日期
/*** 根据年月返回本月共几周,每周开始与结束日期*/public static List<Map<String, String>> queryWeek(String year, String month) throws ParseException {/** 周 **/final String[] weeks { "第一周", "第二周", "第…...

9.3 Windows驱动开发:内核解析PE结构节表
在笔者上一篇文章《内核解析PE结构导出表》介绍了如何解析内存导出表结构,本章将继续延申实现解析PE结构的PE头,PE节表等数据,总体而言内核中解析PE结构与应用层没什么不同,在上一篇文章中LyShark封装实现了KernelMapFile()内存映…...

Zephyr:Direct Distillation of LM Alignment
Zephyr:Direct Distillation ofLM Alignment IntroductionMethod Introduction dSFT已经被可以提升模型的指令遵循能力的准确性,但是student model 不会超过 teacher model。 作者认为 dSFT虽然可以让模型更好的理解用户意图,但是无法与人类…...
二叉树--算法题总结
1、利用层序遍历的产生的字符串来创建二叉树 /*** 使用层序遍历的字符串创建二叉树* param treeInfo* return*/public static TreeNode generateTreeNodeSecond(String treeInfo) {LinkedList<TreeNode> treeNodeLinkedList new LinkedList<>();if(StringUtils.is…...

PyQt6 QLabel标签控件
锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计21条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话…...
即时通讯技术文集(第24期):音视频WebRTC好文合集 [共20篇]
为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第 24 期。 [- 1 -] 开源实时音视频技术WebRTC的现状 [链接] http://www.52im.net/article-126-1.html [摘要] 作为Google开源的技术,WebRTC并不…...

HTML+CSS+JS网页设计与制作摄影类个人网页
可以使用网页三剑客htmlcssjs实现网页设计与制作,页面排版布局高端大气。 使用HTMLCSS页面布局设计,HTMLCSSJS网页设计与制作摄影类个人网页,这是一个优质的个人网页制作。 凭借简约的设计风格、精湛的制作工艺,突破与创新的理念…...

U-boot(五):启动内核
本文主要探讨210的uboot启动内核过程。 嵌入式系统状态启动 未上电时bootloader、kernel、rootfs以镜像形式存储在启动介质中(X210为iNand/SD卡),运行时搬运到DDR中 未上电时u-boot.bin,zImage,rootfs在SD卡中各自对应的分区中,启动时去对应分区寻找(分区表一…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...