springboot+dubbo+zookeeper的注册服务和调用实践

目录

    • zookeeper为什么可作为注册中心
    • zookeeper注册中心优缺点
    • 启动zookeeper
    • 编写springboot项目提供dubbo服务
      • 1. 服务接口
      • 2. Springboot引入dubbo实现服务接口
        • 2.1 工程目录和依赖
        • 2.2 启动程序和application.properties
        • 2.3 @DubboService 实现服务接口
        • 2.4 测试api,用于测试启动
    • 开启两个springboot应用
    • dubboAdmin配置随机策略
    • 客户端测试
      • zookeeper客户端查看服务信息
      • zookeeper node metadata字段含义说明
      • 服务提供者2个实例
      • 测试输出和关闭
    • dubbo客户端分析
    • dubbo服务端分析

zookeeper为什么可作为注册中心

在这里插入图片描述

zookeeper注册中心优缺点

首先需要了解下zookeeper作为注册中心的优缺点
在这里插入图片描述

在这里插入图片描述
结论:尽管ZooKeeper在服务注册与发现、配置管理、分布式锁等场景中非常有用,但它并不适合所有的场景。在选择使用ZooKeeper时,需要根据具体的应用需求、性能要求以及系统的复杂性来综合考虑其优缺点。在一些情况下,可以考虑使用更轻量级的解决方案如Consul或Etcd,这些工具在某些方面可能更适合特定的需求。

启动zookeeper

随意启动即可

mubi@mubideMacBook-Pro zookeeper-3.4.12 $ ./bin/zkServer.sh start conf/zoo_local.cfg
ZooKeeper JMX enabled by default
Using config: conf/zoo_local.cfg
Starting zookeeper ... STARTED

编写springboot项目提供dubbo服务

1. 服务接口

在这里插入图片描述
简单的测试服务接口

package com.example.demoapi.dubboprovider;

/**
 * @Author mubi
 * @Date 2025/2/21 21:46
 */
public interface TestService {
    int add(int a, int b);
}

依赖

<dependency>
    <groupId>com.dq</groupId>
    <artifactId>spring-groovy-open-service</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

2. Springboot引入dubbo实现服务接口

2.1 工程目录和依赖

在这里插入图片描述

依赖如下

  • dubbo 2.7.8
  • spring 4.3.18.RELEASE
  • springboot 2.1.4.RELEASE
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-groovy-test</artifactId>
        <groupId>com.dq</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-api2</artifactId>

    <dependencies>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.8</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.8</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.8.0</version>
        </dependency>

        <!--模块依赖-->
        <dependency>
            <groupId>com.dq</groupId>
            <artifactId>spring-groovy-open-service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!--依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>


        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.76</version>
        </dependency>


        <!-- junit依赖包 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>
<parent>
 	<groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
</parent>
2.2 启动程序和application.properties
package com.example.demoapi;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

/**
 * @Author mubi
 * @Date 2021/2/13 12:04
 */
@EnableDubbo
@SpringBootApplication
@ComponentScan("com.example")
public class DemoApiApplication2 {

	public static void main(String[] args) {
		SpringApplication.run(DemoApiApplication2.class, args);
	}
}

  • application.properties
#https
server.port=8089

# Dubbo 配置
dubbo.application.name=demoprovider
dubbo.registry.address=zookeeper://127.0.0.1:2181 
dubbo.protocol.name=dubbo
dubbo.scan.base-packages=com.example.demoapi.dubboprovider
dubbo.protocol.port=20881
2.3 @DubboService 实现服务接口
package com.example.demoapi.dubboprovider;

import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Service;

@DubboService
@Service
public class TestServiceImpl implements TestService {
    @Override
    public int add(int a, int b) {
        return a + b + 1;
    }
}

2.4 测试api,用于测试启动
package com.example.demoapi.control;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author mubi
 * @Date 2021/2/13 12:04
 */
@RestController
public class TestControl {

    @GetMapping(value = "/test")
    public String getTest() {
        return "hello test2";
    }

}

在这里插入图片描述

开启两个springboot应用

都提供同样的服务:com.example.demoapi.dubboprovider.TestService,dubbo端口不同

dubbo.protocol.port=20880
dubbo.protocol.port=20881

为了方便测试,可以故意把实现写的不一样

一个是return a + b;
一个是return a + b + 1;

dubboAdmin配置随机策略

下载一个dubboAmdin.war 然后放到tomcat webapps下启动tomcat即可,如下图
在这里插入图片描述

打开dubbo-admin: http://localhost:8080/dubbo-admin-2.8.4/
在这里插入图片描述
配置一个随机策略,方便测试

在这里插入图片描述

客户端测试

随便起个maven项目
在这里插入图片描述

spring xml配置如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <dubbo:application name="dubbotest" />

    <dubbo:registry address="zookeeper://127.0.0.1:2181" />

    <!-- 向注册中心订阅服务 -->
    <dubbo:reference id="testService" interface="com.example.demoapi.dubboprovider.TestService" />
</beans>
  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>dubbo-demo</artifactId>
        <groupId>com.mubi.dubbo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>dubbotest</artifactId>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

        <!-- spring版本号 -->
        <spring.version>4.3.18.RELEASE</spring.version>

        <!-- log4j日志包版本号 -->
        <slf4j.version>1.7.18</slf4j.version>
        <log4j.version>1.2.17</log4j.version>
    </properties>

    <dependencies>
        <!--模块依赖-->
        <dependency>
            <groupId>com.dq</groupId>
            <artifactId>spring-groovy-open-service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!-- spring begin -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-oxm</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- spring end -->

        <!-- 注册中心zookeeper begin -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.14</version>
        </dependency>
        <!-- 注册中心zookeeper end -->

        <!-- 添加日志相关jar包 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>

        <!-- dubbo -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>

    </dependencies>

</project>
  • 测试
    在这里插入图片描述
    有时候输出4, 有时候输出5,符合预期的负载均衡策略

zookeeper客户端查看服务信息

mac使用PrettyZoo可参考文档:https://blog.csdn.net/gitblog_06511/article/details/142393820

可以看到服务如下

在这里插入图片描述

zookeeper node metadata字段含义说明

在ZooKeeper中,节点(node)的元数据(metadata)包含了关于该节点的各种信息,这些信息通常通过ZooKeeper的Stat类表示。Stat类包含了多个字段,每个字段都提供了关于节点的不同方面信息。以下是一些常见的Stat类字段及其含义:

  1. czxid - 创建节点的事务ID(Transaction ID)。这是创建该节点时ZooKeeper服务器分配的事务ID。

  2. mzxid - 最后修改节点的事务ID。这是最后一次修改该节点内容或其子节点时ZooKeeper服务器分配的事务ID。

  3. pzxid - 最后修改子节点的事务ID。这是最后一次修改该节点的子节点时ZooKeeper服务器分配的事务ID。

  4. ctime - 创建时间。这是节点被创建的时间戳(以毫秒为单位)。

  5. mtime - 最后修改时间。这是节点最后一次被修改的时间戳(以毫秒为单位),包括内容或子节点的修改。

  6. version - 版本号。每次对节点数据进行修改,版本号会增加。

  7. cversion - 子节点版本号。每次对节点的子节点进行增加、删除操作时,此版本号会增加。

  8. aversion - ACL版本号。每次对节点的ACL(访问控制列表)进行修改时,此版本号会增加。

  9. ephemeralOwner - 临时节点的所有者会话ID。如果是临时节点,则此字段包含创建该临时节点的会话ID;如果是持久节点,则此字段为0。

  10. dataLength - 数据长度。这是存储在节点中的数据部分的长度(以字节为单位)。

  11. numChildren - 子节点数量。这是直接子节点的数量。

  12. pzxid - 最后子节点变更的事务ID(在某些实现中可能不直接暴露,但在某些情况下,特别是在使用某些特定命令或API时可以看到)。

服务提供者2个实例

如下,服务具体提供者(黄色框)是临时结点,其它是持久结点。

  • 测试程序有2个服务提供者
    在这里插入图片描述

测试输出和关闭

  • 测试了三次,且没有关闭测试程序,可以看到三个服务消费者(也是临时结点)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

可以看到有4的输出,也有5的输出


测试进程关闭后,consumer也就没有临时结点了
在这里插入图片描述

dubbo客户端分析

注意到客户端一直能看到如下日志,即客户端与zookeeper保持了心跳连接

连接在则服务在,consumer临时结点在,否则临时结点消失
在这里插入图片描述

服务的调用当然是dubbo rpc机制。这里暂不具体分析rpc机制,重点看下zookeeper 客户端 SendThread线程(百度AI回答如下)

在这里插入图片描述
所以当我们设计一个客户端的时候,也要考虑心跳维持,队列缓存,异常处理等等问题

dubbo服务端分析

通过dubbo-admin可以看到服务,并可进行简单的配置负载均衡策略

在这里插入图片描述

在这里插入图片描述

当关闭一个服务提供者之后,同客户端程序,临时结点也是没有了

在这里插入图片描述
在这里插入图片描述

所以服务的动态新增删除,用zookeeper临时结点很方便的表达了

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学习经验分享【39】YOLOv12——2025 年 2 月 19 日发布的以注意力为核心的实时目标检测器

YOLO算法更新速度很快&#xff0c;已经出到V12版本&#xff0c;后续大家有想发论文或者搞项目可更新自己的baseline了。 代码&#xff1a;GitHub - sunsmarterjie/yolov12: YOLOv12: Attention-Centric Real-Time Object Detectors 摘要&#xff1a;长期以来&#xff0c;增强 …

什么是方法

System.out.println(),那么它是什么呢&#xff1f; Java方法是语句的集合&#xff0c;它们在一起执行一个功能。 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建&#xff0c;在其他地方被使用 这段Java代码出现错误的原因在于&#xff0c;在…

装win10系统提示“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”解决方法

问题描述 我们在u盘安装原版win10 iso镜像时&#xff0c;发现在选择硬盘时提示了“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”&#xff0c;直接导致了无法继续安装下去。出现这种情况要怎么解决呢&#xff1f; 原因分析&#xff1a; 当您在安装Windows操作系统…

ue5.2.1 quixel brideg显示asset not available in uAsset format

我从未见过如此傻x的bug&#xff0c;在ue5.2.1上通过内置quixel下载资源显示 asset not available in uAsset format 解决办法&#xff1a;将ue更新到最新版本&#xff0c;通过fab进入商场选择资源后add to my library 点击view in launcher打开epic launcher&#xff0c;就可…

python: SQLAlchemy (ORM) Simple example using SQLite

领域层&#xff08;Domain Laye&#xff09;&#xff1a;定义了 School 实体类和 SchoolRepository 抽象基类&#xff0c;明确了业务实体和数据访问的契约。 基础设施层&#xff08;Infrastructure Laye&#xff09;&#xff1a;通过 SQLAlchemy 实现了 SchoolRepository 类&am…

蓝桥杯定时器实现led闪烁

step1.配置定时器&#xff0c;TIM1时高级定时&#xff0c;TIM2是通用定时器&#xff0c;用TIM2就行&#xff0c;用内部时钟源&#xff0c;记住相关公式&#xff0c;定时器中断配置时要使能&#xff0c;且生成代码后也要在mian中写使能函数 step2.写代码 配置生成代码后多出的…

【深度学习】Pytorch的深入理解和研究

一、Pytorch核心理解 PyTorch 是一个灵活且强大的深度学习框架&#xff0c;广泛应用于研究和工业领域。要深入理解和研究 PyTorch&#xff0c;需要从其核心概念、底层机制以及高级功能入手。以下是对 PyTorch 的深入理解与研究的详细说明。 1. 概念 动态计算图&#xff08;D…

HAProxy介绍与编译安装

目录 1、HAProxy介绍 2、HAProxy编译安装 Centos 基础环境 Ubuntu 基础环境 编译安装HAProxy 验证HAProxy版本 HAProxy启动脚本 配置文件 启动haproxy 验证haproxy状态 查看haproxy的状态页面 1、HAProxy介绍 HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年…

动静态链接与加载

目录 静态链接 ELF加载与进程地址空间&#xff08;静态链接&#xff09; 动态链接与动态库加载 GOT表 静态链接 对于多个.o文件在没有链接之前互相是不知到对方存在的&#xff0c;也就是说这个.o文件中调用函数的的跳转地址都会被设定为0&#xff08;当然这个函数是在其他.…

无人机遥控器接口作用详解!

USB接口&#xff1a; 功能&#xff1a;USB接口是一种通用串行总线接口&#xff0c;用于连接外部设备&#xff0c;如手机、平板、电脑或充电设备。在无人机遥控器上&#xff0c;USB接口通常用于数据传输和充电。 应用&#xff1a;用户可以通过USB接口将遥控器与电脑连接&#…

A100、H100、H800、H20等多种显卡配置对比

显卡对比 型号A10080GB SXMA10080GB PCIeH10080GB SXMH10080GB PCIeH20H80080GB SXMH80080GB PCIe数据来源链接链接链接链接链接链接链接GPU架构AmpereAmpereHopperHopperHopperHopperHopper显存容量80GB HBM2e80GB HBM2e80GB94GB96GB80GB80GB显存带宽1,935 GB/s2,039 GB/s3.3…

简讯:Rust 2024 edition and v1.85.0 已发布

详见 https://blog.rust-lang.org/2025/02/20/Rust-1.85.0.html 升级方法&#xff1a;rustup update stable

学工管理系统用户手册

学工管理系统是一种基于现代化信息技术的软件系统&#xff0c;旨在帮助学校、学院及教育机构全面管理学生的学习生活和个人发展。 1.系统简介 学工管理系统是一个综合性的学校管理平台&#xff0c;集成多个模块&#xff0c;包括学生信息管理、学生考勤管理、学生成绩管理、学生…

提效10倍:基于Paimon+Dolphin湖仓一体新架构在阿里妈妈品牌业务探索实践

1. 业务背景 阿里妈妈品牌广告数据包括投放引擎、下发、曝光、点击等日志&#xff0c;面向运筹调控、算法特征、分析报表、诊断监控等应用场景&#xff0c;进行了品牌数仓能力建设。随着业务发展&#xff0c;基于Lambda架构的数仓开发模式&#xff0c;缺陷日益突出&#xff1a;…

tauri2实现监听记住窗口大小变化,重启回复之前的窗口大小

要想实现记住窗口大小的功能&#xff0c;整体逻辑就是要监听窗口大小变化&#xff0c;将窗口大小保存下来&#xff0c;重启之后&#xff0c;读取保存的大小&#xff0c;然后恢复。这里可以使用rust层实现&#xff0c;也可以在前端实现。我这里就纯rust层实现了。 监听窗口变化…

【好玩的工具和命令】 ASCII 艺术生成工具: figlet

figlet 是一款用于生成 ASCII 艺术文字的工具&#xff0c;支持多种字体样式。它能将输入的文本转换为由字符组成的大型字母图案&#xff0c;广泛应用于命令行环境下的标题展示或装饰。 核心功能 生成 ASCII 文字艺术&#xff1a;将普通文本转化为大号的、由字符构成的艺术字…

Golang 相关的github 开源项目

1. pan-light url: http://github.com/peterq/pan-lightstar: 12.1kfork: 2.5kwatch: 284 用Golang和Qt5编写的不限速版百度网盘。相比之前版本的百度网盘客户端&#xff0c;当前版本拥有更友好、便捷的图形界面&#xff0c;体量更轻&#xff0c;便于使用&#xff0c;只需下载…

[ComfyUI]Recraft贴图开源方案,实现服装印花自由

一、介绍 今天发现了一个简单又好用的插件&#xff0c;可以实现类似Recraft的贴图功能&#xff0c;这是一个作者开发的ComfyUI插件&#xff0c;叫做Comfyui-Transform 这个插件比我们简单的图像覆盖多了一些可控参数&#xff0c;形状、透明度、倾斜、拉升和混合模式等诸多可控…

C语言--正序、逆序输出为奇数的位。

题目&#xff1a; 采用正序和逆序分别输出为奇数的位。例如输入12345&#xff0c;正序输出135&#xff0c;逆序输出531 代码&#xff1a; #include <stdio.h>void printOddDigits(int num) {int res 0;int divider 10;while (num / divider > 10) {divider * 10;…

最新版IDEA下载安装教程

一、下载IDEA 点击前往官网下载 或者去网盘下载 点击前往百度网盘下载 点击前往夸克网盘下载 进去后点击IDEA 然后点击Download 选择自己电脑对应的系统 点击下载 等待下载即可 二、安装IDEA 下载好后双击应用程序 点击下一步 选择好安装目录后点击下一步 勾选这两项后点击…