Apache Curator

基于zookeeper分布式锁

早过忘川 提交于 2021-02-20 16:48:46
最近项目中新上线了抢优惠券功能,虽然用户不多但是,如何防止超发呢?单体应用情况下只需要在抢券方法前用synchronized修饰即可,但是目前大部分项目都是分布式微服务架构,所以就需要加分布式锁。项目用的SpringMVC+dubbo,注册中心使用的zookeeper,所以就选用的基于zookeeper的分布式锁。 原生的zookeeper分布式锁写起来比较复杂,使用zookeeper的Curator框架轻松实现,代码实现: pom文件 <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>4.0.1</version> </dependency> Spring集成 <!-- 重连策略 --> <bean id="retryPolicy" class="org.apache.curator.retry.ExponentialBackoffRetry"> <!-- 间隔时间基数 -->

Zookeeper系列四:Zookeeper实现分布式锁、Zookeeper实现配置中心

给你一囗甜甜゛ 提交于 2021-02-18 17:26:59
一、Zookeeper实现分布式锁 分布式锁主要用于在分布式环境中保证数据的一致性。 包括跨进程、跨机器、跨网络导致共享资源不一致的问题。 1. 分布式锁的实现思路 说明: 这种实现会有一个缺点,即当有很多进程在等待锁的时候,在释放锁的时候会有很多进程就过来争夺锁,这种现象称为 “惊群效应” 2. 分布式锁优化后的实现思路 3. Zookeeper分布式锁的代码实现 准备工作: 1)安装Zookeeper,具体参考我前面的我文章 Zookeeper系列一:Zookeeper介绍、Zookeeper安装配置、ZK Shell的使用 2)新建一个maven项目ZK-Demo,然后在pom.xml里面引入相关的依赖 < dependency > < groupId > com.101tec </ groupId > < artifactId > zkclient </ artifactId > < version > 0.10 </ version > </ dependency > 3.1 Zookeeper分布式锁的核心代码实现 实现逻辑参考“ 2. 分布式锁优化后的实现思路 ”中的流程图 package com.study.demo.lock; import java.util.Collections; import java.util.List; import java.util

kafka集群管理工具kafka-manager部署安装

天大地大妈咪最大 提交于 2021-02-07 20:35:36
一、kafka-manager 简介 为了简化开发者和服务工程师维护Kafka集群的工作,yahoo构建了一个叫做Kafka管理器的基于Web工具,叫做 Kafka Manager。这个管理工具可以很容易地发现分布在集群中的哪些topic分布不均匀,或者是分区在整个集群分布不均匀的的情况。它支持管理多个集群、选择副本、副本重新分配以及创建Topic。同时,这个管理工具也是一个非常好的可以快速浏览这个集群的工具,有如下功能: 1.管理多个kafka集群 2.便捷的检查kafka集群状态(topics,brokers,备份分布情况,分区分布情况) 3.选择你要运行的副本 4.基于当前分区状况进行 5.可以选择topic配置并创建topic(0.8.1.1和0.8.2的配置不同) 6.删除topic(只支持0.8.2以上的版本并且要在broker配置中设置delete.topic.enable=true) 7.Topic list会指明哪些topic被删除(在0.8.2以上版本适用) 8.为已存在的topic增加分区 9.为已存在的topic更新配置 10.在多个topic上批量重分区 11.在多个topic上批量重分区(可选partition broker位置) kafka-manager 项目地址: https://github.com/yahoo/kafka-manager 二

坐下坐下,基本操作(ZooKeeper 操作篇)

大憨熊 提交于 2021-02-07 20:30:37
本文作者:HelloGitHub- 老荀 Hi,这里是 HelloGitHub 推出的 HelloZooKeeper 系列, 免费开源、有趣、入门级的 ZooKeeper 教程 ,面向有编程基础的新手。 ZooKeeper 是 Apache 软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。ZooKeeper 曾经是 Hadoop 的一个子项目,但现在是一个顶级独立的开源项目。 ZK 在实际开发工作中经常会用到,算的上是吃饭的家伙了,那可得玩透、用的趁手,要不怎么进阶和升职加薪呢?来和 HelloGitHub 一起学起来吧~ 本系列教程是 从零开始 讲解 ZooKeeper,内容从 最基础的安装使用到背后原理和源码的讲解 ,整个系列希望通过有趣文字、诙谐的气氛中让 ZK 的知识“钻”进你聪明的大脑。本教程是开放式:开源、协作,所以不管你是新手还是老司机,我们都希望你可以 加入到本教程的贡献中,一起让这个教程变得更好 : 新手:参与修改文中的错字、病句、拼写、排版等问题 使用者:参与到内容的讨论和问题解答、帮助其他人的事情 老司机:参与到文章的编写中,让你的名字出现在作者一栏 项目地址:https://github.com/HelloGitHub-Team/HelloZooKeeper 今天我们会讲解下,如何使用 Java 代码客户端去操作

Zookeeper源码分析

浪子不回头ぞ 提交于 2021-02-04 08:21:44
download: Zookeeper源码分析 Zookeeper作为阿里系与Dubbo完美搭配的注册中心,其江湖地位毋容置疑。本课程以最开始图解Zookeeper框架的架构和组件作为课程总起,进而“分而治之”各个击破Zookeeper框架的各个组件源码,如:序列化,数据模型,持久化,Client和Server架构、选举流程等,最后通过总结快速梳理所得。 适合人群 有代码洁癖的中高级Java工程师 从事分布式系统设计和开发的极客 认可“源码驱动式”学习方式的学生党 技术储备要求 Java基础扎实,对IO/NIO网络通信等知识有一定了解 了解序列化、持久化、多线程 了解zookeeper的一般使用命令 char const const pc = "123abc"; //这个pc指向的地址和内容都不变,极端状况 printf("pc content is %c\n", pc);//用于输出 指向的特定字符 printf("pc string content is %s\n" , pc);//用于输出整个字符串(缘由????) / 9.a指针函数(本质是一个函数,返回值是一个指针) b函数指针(函数名是一个指针)的区别 / / //类型标识符 函数名(参数表) a.int* f(x,y); 指针函数 b.int ( f) (int x); //声明一个函数指针   f=func; /

分布式全局唯一ID与自增序列

巧了我就是萌 提交于 2020-11-20 05:02:02
包含时间顺序的ID 此场景最简单的实现方案,就是采用 twitter 的 Snowflake 算法。 ID总长64位,第1位不可用,41位表示时间戳,10位表示生成机器的id,后12位表示序列号。 为什么第一位不可用?第一位为0,可以确保ID在java的long类型数据一直为正整数递增 同一时间戳即毫秒内,能产生多少个ID? 2^12 = 4096 个ID [ 0 ~ 4095 ] 唯一性?通过机器ID预先已经做了一次空间隔离,再通过时间戳做了一次时间隔离,最后通过时间戳内的计数实现了一定程度内的唯一 高性能?可以通过增加IDWorker来缓解高并发时的单机负载压力 缺点?时间受限,41位可以表示69年(不过可以减少机器位来增加时间位数) 自增序列 原理 根据key获取分布式锁,获得锁后取得序号,并偏移配置的偏移量,替换原先的序号,最后释放锁。 基于zookeeper实现 基于zookeeper可以很快实现自增序列服务,引入apache的curator封装的zookeeper客户端。 1 2 3 4 <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> </dependency> 建立zookeeper连接,打开zkclient后,如果重复会使用

利用Zookeeper实现

与世无争的帅哥 提交于 2020-11-06 13:56:46
许多场景中, 数据一致性 是一个比较重要的话题,在单机环境中,我们可以通过Java提供的 并发API 来解决;而在分布式环境(会遇到网络故障、消息重复、消息丢失等各种问题)下要复杂得多,常见的解决方案是 分布式事务 、 分布式锁 等。 本文主要探讨如何利用Zookeeper来实现分布式锁。 关于分布式锁 分布式锁是控制分布式系统之间 同步访问共享资源 的一种方式。 在 实现 分布式锁的过程中需要注意的: 锁的可重入性(递归调用不应该被阻塞、避免死锁) 锁的超时(避免死锁、死循环等意外情况) 锁的阻塞(保证原子性等) 锁的特性支持(阻塞锁、可重入锁、公平锁、联锁、信号量、读写锁) 在 使用 分布式锁时需要注意: 分布式锁的开销(分布式锁一般能不用就不用,有些场景可以用乐观锁代替) 加锁的粒度(控制加锁的粒度,可以优化系统的性能) 加锁的方式 以下是几种常见的实现分布式锁的方案及其优缺点。 基于数据库 1. 基于数据库表 最简单的方式可能就是直接创建一张锁表,当我们要锁住某个方法或资源时,我们就在该表中增加一条记录,想要释放锁的时候就删除这条记录。给某字段添加唯一性约束,如果有多个请求同时提交到数据库的话, 数据库会保证只有一个操作可以成功 ,那么我们就可以认为操作成功的那个线程获得了该方法的锁,可以执行方法体内容。 会引入数据库单点、无失效时间、不阻塞、不可重入等问题。 2.

从构建分布式秒杀系统聊聊分布式锁

走远了吗. 提交于 2020-10-30 19:55:24
前言 最近懒成一坨屎,学不动系列一波接一波,大多还都是底层原理相关的。上周末抽时间重读了周志明大湿的 JVM 高效并发部分,每读一遍都有不同的感悟。路漫漫,借此,把前段时间搞着玩的秒杀案例中的分布式锁深入了解一下。 案例介绍 在尝试了解分布式锁之前,大家可以想象一下,什么场景下会使用分布式锁? 单机应用架构中,秒杀案例使用ReentrantLcok或者synchronized来达到秒杀商品互斥的目的。然而在分布式系统中,会存在多台机器并行去实现同一个功能。也就是说,在多进程中,如果还使用以上JDK提供的进程锁,来并发访问数据库资源就可能会出现商品超卖的情况。因此,需要我们来实现自己的分布式锁。 实现一个分布式锁应该具备的特性: 高可用、高性能的获取锁与释放锁 在分布式系统环境下,一个方法或者变量同一时间只能被一个线程操作 具备锁失效机制,网络中断或宕机无法释放锁时,锁必须被删除,防止死锁 具备阻塞锁特性,即没有获取到锁,则继续等待获取锁 具备非阻塞锁特性,即没有获取到锁,则直接返回获取锁失败 具备可重入特性,一个线程中可以多次获取同一把锁,比如一个线程在执行一个带锁的方法,该方法中又调用了另一个需要相同锁的方法,则该线程可以直接执行调用的方法,而无需重新获得锁 在之前的秒杀案例中,我们曾介绍过关于分布式锁几种实现方式: 基于数据库实现分布式锁 基于 Redis 实现分布式锁 基于

使用zookeeper API实现分布式锁

人盡茶涼 提交于 2020-10-27 04:56:36
1、使用zookeeper API实现分布式锁 DistributedLock.java import java.io.IOException ; import java.util.List ; import java.util.SortedSet ; import java.util.TreeSet ; import java.util.concurrent.CountDownLatch ; import java.util.concurrent.TimeUnit ; import java.util.concurrent.locks.Condition ; import java.util.concurrent.locks.Lock ; import org.apache.zookeeper.CreateMode ; import org.apache.zookeeper.KeeperException ; import org.apache.zookeeper.WatchedEvent ; import org.apache.zookeeper.Watcher ; import org.apache.zookeeper.ZooDefs ; import org.apache.zookeeper.ZooKeeper ; import org.apache.zookeeper

Dubbo2.6.5+Nacos注册中心(代替Zookeeper)

☆樱花仙子☆ 提交于 2020-10-25 01:45:24
在 上一节 的小栗子的基础上,只需要更改两个地方 第一个:父工程的pom依赖增加 <!-- Dubbo Nacos registry dependency --> < dependency > < groupId > com.alibaba </ groupId > < artifactId > dubbo-registry-nacos </ artifactId > < version > 0.0.1 </ version > </ dependency > 第二个:服务生产者和消费者的application.properties文件修改注册中心部分 # 注册中心 dubbo.registry.id = dubboRegistry dubbo.registry.timeout=5000 dubbo.registry.address = 127.0.0.1:8848 dubbo.registry.protocol=nacos #dubbo.registry.address = 127.0.0.1:2181 #dubbo.registry.client = curator #dubbo.registry.protocol=zookeeper 然后下载注册中心并启动。 https://github.com/alibaba/nacos/releases 解压并进入bin目录,双击启动