Zookeeper实现分布式锁和注册中心

news2025/2/28 15:51:43

目录

分布式锁

实现方式

分布式锁场景如何选择Redis和zookeeper

用InterProcessMutex实现分布式锁

zookeeper实现注册中心


分布式锁

实现方式

  • 数据库唯一索引
  • Redis的setnx
  • Zookeeper创建临时节点及监听机制
  • Zookeeper创建临时有序节点

分布式锁场景如何选择Redis和zookeeper

一致性:

  • ZooKeeper是一个分布式协调服务,它保证了强一致性。这意味着在ZooKeeper中创建的节点的状态是全局可见的,并且所有节点都将在相同的时间看到相同的数据。这种一致性可以确保分布式锁的可靠性。
  • Redis是一个支持分布式的缓存和数据存储,但其一致性较弱。Redis的主从复制模式可能会导致一些短暂的不一致,这可能影响分布式锁的可靠性。

性能:

  • Redis通常被认为是一个高性能的内存数据库,适用于需要快速读写操作的场景。如果你的系统对性能要求较高,而且可以容忍一些短暂的不一致,那么使用Redis可能是个不错的选择。
  • ZooKeeper的性能可能不如Redis那么高,因为它的设计目标更侧重于提供强一致性和可靠性。

部署和维护:

  • Redis相对较简单,容易部署和维护。你只需要关注Redis节点的可用性和性能。
  • ZooKeeper需要维护一个ZooKeeper集群,确保其正常运行可能需要更多的配置和管理。

用InterProcessMutex实现分布式锁

1. 引入curator依赖

        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.8.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>5.1.0</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

2. java代码

public class CuratorLock {

    private final static  String CLUSTER_CONNECT_STR="192.168.6.128:2181,192.168.6.128:2182,192.168.6.128:2183";

    private static CuratorFramework client= CuratorFrameworkFactory.builder().connectString(CLUSTER_CONNECT_STR)
            .retryPolicy(new ExponentialBackoffRetry(100,1)).build();

    static {
        client.start();
    }

    private static final InterProcessMutex lock = new InterProcessMutex(client,"/curator_lock");

    public static void main(String[] args) throws Exception {
        int count = 0;
        // 加锁
        lock.acquire();
        try {
            // 执行业务逻辑
            count++;
        } finally {
            // 解锁
            lock.release();
        }
    }
}

zookeeper实现注册中心

1. 引入依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>


    <properties>
        <java.version>21</java.version>
        <spring-boot.version>3.2.1</spring-boot.version>
        <spring-cloud.version>2023.0.0</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web-services</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!-- zookeeper client -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.8.0</version>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

2. 修改配置application.yml

spring:
  cloud:
    zookeeper:
      connect-string: 192.168.6.128:2181,192.168.6.128:2182,192.168.6.128:2183
      discovery:
        instance-host: 127.0.0.1
  application:
    name: user-service
server:
  port: 8081

3. 整合feign

@FeignClient(name = "order-service")
public interface OrderFeign {

    @GetMapping("/order/findById")
    String findOrder(@RequestParam("id") String id);
}


@RequestMapping("/user")
@RestController
public class UserController {

    @Autowired
    private OrderFeign orderFeign;

    @GetMapping("/findOrder")
    public String findOrder() {
        return orderFeign.findOrder("5");
    }
}

4. zookeeper会生成对应应用节点

5. 访问接口, 验证User服务调Order服务

 

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

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

相关文章

Apple Unity Plugins 接入GameCenter 崩溃解决方案

目录 问题问题原因解决方案可直接使用的UnityPlugins 问题 调用 GKLocalPlayer.Local.FetchItems() 程序崩溃&#xff0c;报错&#xff1a;Thread 1: EXC_BAD_ACCESS (code257, address0x8000000000000002) 启动崩溃&#xff0c;报错&#xff1a;Library not loaded: rpath/Ap…

Ubuntu 22.04 安装ftp实现与windows文件互传

Ubuntu 22.04 安装ftp实现与windows文件互传 1、配置安装 安装&#xff1a; sudo apt install vsftpd -y使能开机自启&#xff1a; sudo systemctl enable vsftpd 启动&#xff1a; sudo systemctl start vsftpd创建ftp工作目录&#xff1a; sudo mkdir -p /home/ftp/uftp…

FPGA实现 NIC 10G 网卡,纯verilog代码编写,提供工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的UDP方案3、10G网卡基本性能简介4、详细设计方案接口概述PCIe HIPDMA IFAXI总线接口时钟同步处理TXQ和RXQ队列TXCQ和RXCQ队列完成EQ MAC PHY流水线队列管理发送调度程序端口和接口数据路径以及发送和接收引擎分段内存接口 5、vivado工程详…

SpringBoot 日志打印

一. 自定义打印日志 开发者自定义打印日志实现步骤: • 在程序中得到日志对象 • 使用日志对象的相关语法输出要打印的内容. 得到日志对象: //日志工厂需要将需要打印的类的类型传递进去,这样我们才知道日志的归属类,才能更方便的定位到文体类 private static Logger logger …

软件测试/测试开发丨Python 内置库 sys 学习笔记分享

sys 概述 是 Python 自带的内置模块是与 Python 解释器交互的桥梁 sys 使用 常用属性常用方法导入 sys 模块 # 导入sys模块 import sys# 查看sys模块帮助文档 help(sys)# 查看sys模块的属性和方法 print(dir(sys))sys 常用属性 sys.version&#xff1a;返回 Python 解释器…

Chapter 7 - 8. Congestion Management in Ethernet Storage Networks以太网存储网络的拥塞管理

Stomped CRC Counters Stomped CRC counters help in finding the location of bit errors in a network that uses cut-through switches. More precisely, these counters help in finding where bit errors do not exist. Stomped CRC 计数器有助于在使用直通式交换机的网络…

keil5修改默认配色方案

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1. 找到Keil_5\UV4路径下的两个文件2. 修改global.prop文件中的内容第一种 配色方案第二种 配色方案第三种 配色方案第四种 配色方案 最后 前言 提示&#xff…

使用递归实现深拷贝

文章目录 为什么要使用递归什么深拷贝具体实现基础实现处理 函数处理 Symbol处理 Set处理 Map处理 循环引用 结语-源码 为什么要使用递归什么深拷贝 我们知道在 JavaScript 中可以通过使用JSON序列化来完成深拷贝&#xff0c;但是这种方法存在一些缺陷&#xff0c;比如对于函数…

【远程开发】穿越跳板机和CLion远程开发——全面配置流程

文章目录 穿越跳板机配置 ProxyJump 方案Cygwin上的配置 建立 SSH Tunneling 方案 代码映射目录映射方案配置Rsync加速 远程服务器方案(todo) 远程Debug tips&#xff1a;本文讲了两种穿越跳板机的方案(推荐ProxyJump方案)&#xff0c;和两种代码映射的方案。实际任选一对搭配即…

VC2019更改文件名称代码

VC2019更改文件名称代码 效果代码 效果 华为手机拍摄的视频默认名称是“VID_20231213_111723”,图片名称是“IMG_20231213_111723”&#xff0c;需要批量将“VID”改为“IMG” 代码 代码&#xff08;C#&#xff09;&#xff1a; csharpStringBuilder sbnew StringBuilder()…

Vue-Vben-Admin:打造高效中大型项目后台解决方案

Vue-Vben-Admin&#xff1a;打造高效中大型项目后台解决方案 摘要&#xff1a; Vue-Vben-Admin是一个基于Vue3.0、Vite、Ant-Design-Vue和TypeScript的开源项目&#xff0c;旨在为开发中大型项目提供一站式的解决方案。它涵盖了组件封装、实用工具、钩子函数、动态菜单、权限验…

Vue2Element-ui编写可复用增删改查列表思路及实现方式

前提:堂弟在学校学计算机,有一个期末作业,需要做一个简单的UI界面 先看下基本效果 登录页面包含基本信息校验及登录和保存用户信息 登录之后的列表页面显示 由于是多个tab中午没有太多时间就直接复用数据模式 整体代码在270多行左右 列表 新增弹窗 修改弹窗 删除 其实这里…

爬虫详细教程第1天

爬虫详细教程第一天 1.爬虫概述1.1什么是爬虫&#xff1f;1.2爬虫工具——Python1.3爬虫合法吗&#xff1f;1.4爬虫的矛与盾1.4.1反爬机制1.4.2反爬策略1.4.3robots.txt协议 2.爬虫使用的软件2.1使用的开发工具: 3.第一个爬虫4.web请求4.1讲解一下web请求的全部过程4.2页面渲染…

HCIP:rip综合实验

实验要求&#xff1a; 【R1-R2-R3-R4-R5运行RIPV2】 【R6-R7运行RIPV1】 1.使用合理IP地址规划网络&#xff0c;各自创建环回接口 2.R1创建环回 172.16.1.1/24 172.16.2.1/24 172.16.3.1/24 3.要求R3使用R2访问R1环回 4.加快网络收敛&#xff0c;减少路由条目数量&#xff0c;增…

Maven下载和安装的详细教程

文章目录 一、Maven下载和安装1.1 下载 Maven1.2 配置环境变量 参考资料 一、Maven下载和安装 1.1 下载 Maven 打开 Maven 的官方网站Maven – Download Apache Maven&#xff0c;下载最新版本的 Maven 在可选择的版本中&#xff0c;不同版本的区别在于: binary是已经编译过的…

【深入浅出JVM原理及调优】「搭建理论知识框架」全方位带你深度剖析Java线程转储分析的开发指南

这里写目录标题 专栏介绍前提准备面向人群知识脉络分析线程转储线程转储分析的介绍JVM和线程运行机制JVM和中间件之间的软件交互 JVM线程转储Java快照的基本信息内存回收日志线程转储分解概述全线程转储标识符Java EE中间件&#xff0c;第三方和自定义应用程序线程HotSpot VM T…

2024任务驱动Java程序设计讲课提纲

文章目录 为何采用任务驱动&#xff1f;任务驱动Java程序设计课程概述项目一&#xff1a;踏上Java开发之旅任务1&#xff1a;安装配置JDK并开发第一个Java程序1、安装JDK2、配置JDK环境变量3、开发第一个Java程序 任务2&#xff1a;搭建Java集成开发环境IntelliJ IDEA1、安装In…

【微服务】springboot整合skywalking使用详解

目录 一、前言 二、SkyWalking介绍 2.1 SkyWalking是什么 2.2 SkyWalking核心功能 2.3 SkyWalking整体架构 2.4 SkyWalking主要工作流程 三、为什么选择SkyWalking 3.1 业务背景 3.2 常见监控工具对比 3.3 为什么选择SkyWalking 3.3.1 代码侵入性极低 3.3.2 功能丰…

计算器写作文

一起来交流编程吧【CSDN app】&#xff1a; http://qm.qq.com/cgi-bin/qm/qr?_wv1027&kx9pL9ccIHGKNLE0CWviAqQ_q6HzxomLW&authKeyVslKe623ptw8VRepda%2Bh0Ttr8Ruz8v%2FBW5HpVzyTWU7ECwpHIZpULMj6qIHYZBVb&noverify0&gro 计算器写作文 题目描述 众所周知&a…

大数据应用领域:数据驱动一切

大数据出现的时间只有十几年&#xff0c;被人们广泛接受并应用只有几年的时间&#xff0c;但就是这短短几年的时间&#xff0c;大数据呈现出爆炸式增长的态势。在各个领域&#xff0c;大数据的身影几乎无处不在。今天我们通过一些大数据典型的应用场景分析&#xff0c;一起来看…