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

目录

分布式锁

实现方式

分布式锁场景如何选择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服务

 

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

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

相关文章

为即将到来的量子攻击做好准备的 4 个步骤

当谈到网络和技术领域时&#xff0c;一场风暴正在酝酿——这场风暴有可能摧毁我们数字安全的根本结构。这场风暴被称为 Q-Day&#xff0c;是即将到来的量子计算时代的简写&#xff0c;届时量子计算机的功能将使最复杂的加密算法变得过时。 这场量子革命正以惊人的速度到来&am…

RFC6749-OAuth2.0

前言 最近在项目中需要实现SSO(单点登录)功能,以实现一处注册,即可在任何平台之间登录的功能。我们项目中并没有直接对接第三方认证系统而是通过集成keycloak 完成一系类安全协议的对接工作。如果我们在代码级别自己完成各种安全协议的对接是一项十分大的工程。不仅要走统一的…

论文解读:Coordinate Attention for Efficient Mobile Network Design(CVPR2021)

论文前言 原理其实很简单&#xff0c;但是论文作者说得很抽象&#xff0c;时间紧的建议直接看3.1中原理简述CBMA、原理简述CBMA以及3.2中原理简述coordinate attention block即可。 Abstract 最近关于mobile network设计的研究已经证明了通道注意(例如&#xff0c;the Squee…

【解决复杂链式任务打造全能助手】大模型思维链 CoT 应用:langchain 大模型 结合 做 AutoGPT

大模型思维链 CoT 应用&#xff1a;langchain 大模型 结合 做 AutoGPT&#xff0c;解决复杂链式任务打造全能助手 思维链 CoTlangchainlangchain 大模型结合打造 AutoGPT 思维链 CoT 最初的语言模型都是基于经验的&#xff0c;只能根据词汇之间的相关性输出答案&#xff0c;根…

现阶段SDH,MPLS-VPN,MSTP等广域网几种互联技术介绍

广域网也称远程网&#xff0c;通常跨接很大的物理范围&#xff0c;所覆盖的范围从几十公里到几千公里&#xff0c;它能连接多个城市或国家&#xff0c;或横跨几个洲并能提供远距离通信&#xff0c;形成国际性的远程网络。广域网可以分为公共传输网络、专用传输网络和无线传输网…

学习SpringCloud微服务

SpringCloud 微服务单体框架微服务框架SpringCloud微服务拆分微服务差分原则拆分商品服务拆分购物车服务拆分用户服务拆分交易服务拆分支付服务服务调用RestTemplate远程调用 微服务拆分总结 服务治理注册中心Nacos注册中心服务注册服务发现 OpenFeign实现远程调用快速入门引入…

面向对象基础-类与对象-封装

1、类与对象 1.1 概念 类&#xff1a;类是一个抽象的概念&#xff0c;用于描述一类对象的特点。 对象&#xff1a;根据类的概念所创造的实体。 【思考】一个对象可以没有对应的类嘛&#xff1f; 不可以&#xff0c;因为必须现有类才能创建对象。 1.2 类的内容 类中最基础的内容…

【SD】一致性角色 - 同一人物 不同姿势 - 2

首先生成4张不同姿势的图片 masterpiece,high quality,(white background:1.6),(simple background:1.4),1gril,solo,black footwear,black hair,brown eyes,closed mouth,full body,glasses,jacket,long hair,long sleeves,lookig at viewer,plaid,plaid skirt,pleated shirt,…

12.31_黑马数据结构与算法笔记Java

目录 345 设计跳表 Leetcode 1206 346 设计最小栈 Leetcode 155 347 设计端网址 Leetcode 355 348 设计推特 Leetcode 355 349 股票系列问题 Leetcode 121 350 股票系列问题 Leetcode 122 351 股票系列问题 Leetcode 714 352 股票系列问题 Leetcode 309 353 股票系列问…

接入Cloudflare后Nginx和Django获取用户真实IP的办法

可以用Nginx的real_ip的相关命令来实现这个需求。 01-real_ip命令集详解 real_ip命令的使用分为两个步骤: 01-1-设置从哪些代理IP获取真实IP 第1个步骤&#xff1a;通过set_real_ip_from命令设置从哪些代理IP请求获取真实的IP,比如下面的命令&#xff1a; set_real_ip_from…

Visual Studio 2015 中 SDL2 开发环境的搭建

Visual Studio 2015 中 SDL2 开发环境的搭建 Visual Studio 2015 中 SDL2 开发环境的搭建新建控制台工程拷贝并配置 SDL2 开发文件拷贝 SDL2 开发文件配置 SDL2 开发文件 测试SDL2 开发文件的下载链接 Visual Studio 2015 中 SDL2 开发环境的搭建 新建控制台工程 新建 Win32 …

Vue.js和Node.js的关系--类比Java系列

首先我们看一张图 这里我们类比了Java的jvm和JavaScript的node.js。 可以看到&#xff0c;node.js是基础&#xff0c;提供了基础的编译执行的能力。vue,js是实际上定义了一种他自己的代码格式&#xff0c;以加速开发。

CDH 6.3.2集成flink 1.18 zookeeper版本不匹配Flink-yarn启动失败

CDH 6.3.2集成flink 1.18 zookeeper版本不匹配Flink-yarn不能正常启动&#xff0c;而在CHD Web页面&#xff0c;flink日志报错提示不明确&#xff0c;不能定位具体错误。CM WEB启动失败错误日志如下图所示&#xff1a; CM查看完成错误日志 [31/Dec/2023 10:45:09 0000] 26000…

Java设计模式实战:从If-Else到策略+工厂方法的演变

引言 可能很多开发者&#xff0c;虽然理解了设计模式的概念&#xff0c;但在实际工作中应用却是另一回事。本篇文章旨在用一个具体的案例来展示如何将设计模式应用到工作的编程问题中。正所谓&#xff1a;“纸上得来终觉浅&#xff0c;绝知此事要躬行。”理论的学习固然重要&a…

若依generator模块解读,Java小白入门(七)

模块基本内容 若依的核心模块基本除了安全那一块&#xff0c;现在还是剩下一个比较重要的章节&#xff0c;是ruoyi-generator,就是代码根据模板来生成&#xff0c;这一块很有必要进行深入了解&#xff0c;本章节我们弄清楚基本框架&#xff0c;以后&#xff0c;我们会在这一块…

回顾 2023,展望 2024

by zhengkai.blog.csdn.net 项目与心得 今年最大的项目和心得&#xff0c;非GCP莫属&#xff0c;作为全球顶尖的云平台&#xff0c; GCP有他的优势&#xff0c;也有很多难用的地方。但是作为当时的一个strategic solution&#xff0c;我们的印度本地化项目必须使用GCP&#xf…

丰田「退股」电装,传统汽车供应链体系走到十字路口

就在中国市场热衷于车企与零部件厂商的合纵连横之际&#xff0c;本周&#xff0c;传统汽车巨头丰田公司宣布&#xff0c;将出售部分电装&#xff08;Denso&#xff09;公司股份&#xff0c;资金用于投入电动化、智能驾驶等新技术研发。 按照计划&#xff0c;丰田汽车拟出售超过…

OpenCV-11颜色通道的分离与合并

本次我们使用两个比较重要的API split&#xff08;mat&#xff09;将图像的通道进行分割。 merge&#xff08;(ch1&#xff0c;ch2&#xff0c;ch3)&#xff09;将多个通道进行融合。 示例代码如下&#xff1a; import cv2 import numpy as npimg np.zeros((480, 640, 3),…

【python 的各种模块】(8) 在python使用matplotlib和wordcloud库来画wordcloud词云图

目录 目标&#xff1a;用python画出&#xff0c;网上流行的wordcloud词云图 1 准备工作 1.1环境准备 1.1.1安装步骤 1.2 资源准备 1.2.1 文本文件内容如下 1.2.2 图片资源 2 代码测试 2.1 第一版代码和效果 2.1.1 代码和效果 2.1.2 一般plt里解决中文乱码问题 2.1…

【网络面试(4)】协议栈和套接字及连接阶段的三次握手原理

1. 协议栈 一直对操作系统系统的内核协议栈理解的比较模糊&#xff0c;借着这一篇博客做一下简单梳理&#xff0c; 我觉得最直白的理解就是&#xff0c;内核协议栈就是操作系统中的一个网络控制软件&#xff0c;就是一段程序代码&#xff0c;它负责和网卡驱动程序交互&#xff…