当前位置: 首页 > news >正文

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:2183discovery:instance-host: 127.0.0.1application: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 {@Autowiredprivate OrderFeign orderFeign;@GetMapping("/findOrder")public String findOrder() {return orderFeign.findOrder("5");}
}

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

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

 

相关文章:

  • 基于SpringBoot的图书电子商务网站的设计与实现
  • thinkphp6入门(14)-- 多关联模型查询
  • 项目经验简单总结
  • SpringValidation自定义注解以及分组校验
  • 第6章-第1节-Java中基本数据类型的包装类
  • 松松2023年工作汇报
  • 通过data恢复postgresql
  • 【蓝桥杯】比赛大纲整理
  • RK3568驱动指南|第九篇 设备模型-第95章 创建属性文件并实现读写功能实验1
  • 详解卡尔曼滤波(Kalman Filter)
  • vue常见面试题
  • C++:第十一讲DFS深搜
  • 后端开发——jdbc的学习(一)
  • 企业微信会话存档sdk报错:A fatal error has been detected by the Java Runtime Environment
  • 【MySQL】数据库中为什么使用B+树不用B树
  • AHK 中 = 和 == 等比较运算符的用法
  • C语言笔记(第一章:C语言编程)
  • Java的Interrupt与线程中断
  • Js基础知识(四) - js运行原理与机制
  • Linux后台研发超实用命令总结
  • overflow: hidden IE7无效
  • Redis的resp协议
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • windows下mongoDB的环境配置
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 多线程事务回滚
  • 关于List、List?、ListObject的区别
  • 一文看透浏览器架构
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 1.Ext JS 建立web开发工程
  • AI算硅基生命吗,为什么?
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 国内开源镜像站点
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​什么是bug?bug的源头在哪里?
  • # 透过事物看本质的能力怎么培养?
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • #在 README.md 中生成项目目录结构
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (八)Spring源码解析:Spring MVC
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (四)库存超卖案例实战——优化redis分布式锁
  • (五)网络优化与超参数选择--九五小庞
  • (转)【Hibernate总结系列】使用举例
  • (转)EOS中账户、钱包和密钥的关系
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • .Net FrameWork总结
  • .NET MVC之AOP