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

凡科建站登录官网陈村大良网站建设

凡科建站登录官网,陈村大良网站建设,厦门网站制作推广,it运维主要做什么文章目录 问题背景前言实现搭建Zookeeper容器引入依赖ZK客户端的配置类ZK客户端的工厂类注入bean构建测试类 问题背景 研究分布式锁#xff0c;基于ZK实现#xff0c;需要整合到SpringBoot使用 前言 参考自SpringBoot集成Curator实现Zookeeper基本操作#xff0c;Zookeeper入… 文章目录 问题背景前言实现搭建Zookeeper容器引入依赖ZK客户端的配置类ZK客户端的工厂类注入bean构建测试类 问题背景 研究分布式锁基于ZK实现需要整合到SpringBoot使用 前言 参考自SpringBoot集成Curator实现Zookeeper基本操作Zookeeper入门本篇的代码笔者有自己运行过需要注意组件的版本号是否兼容否则会有比较多的坑 实现 搭建Zookeeper容器 采用Docker compose快速搭建ZK容器很快几分钟就好了而且是集群方式搭建。详情见笔者的Docker搭建zookeeper 引入依赖 需要注意的点Curator 2.x.x-兼容两个zk 3.4.x 和zk 3.5.xCurator 3.x.x-兼容兼容zk 3.5根据搭建的zk的版本使用对应的curator依赖。引入的zk依赖如果项目中有使用logback日志 需要排除zk中的log4j12依赖详情见下面笔者给出的依赖 dependenciesdependencygroupIdorg.apache.curator/groupIdartifactIdcurator-client/artifactIdversion2.12.0/version/dependencydependencygroupIdorg.apache.curator/groupIdartifactIdcurator-framework/artifactIdversion2.12.0/version/dependencydependencygroupIdorg.apache.curator/groupIdartifactIdcurator-recipes/artifactIdversion2.12.0/version/dependencydependencygroupIdorg.apache.zookeeper/groupIdartifactIdzookeeper/artifactIdversion3.5.7/versionexclusionsexclusionartifactIdslf4j-log4j12/artifactIdgroupIdorg.slf4j/groupId/exclusionexclusionartifactIdslf4j-api/artifactIdgroupIdorg.slf4j/groupId/exclusion/exclusions/dependencyZK客户端的配置类 配置ZK的参数使用ConfigurationProperties可以令配置热更新比如搭配Apollo、Nacos如果使用Valid则无法热更新必须重启项目才能生效 Component ConfigurationProperties(prefix curator) Data public class ZKClientProps {private String connectString;private int retryCount;private int elapsedTimeMs;private int sessionTimeoutMs;private int connectionTimeoutMs; }对应yml如下 #curator配置 curator:connectString: 192.168.163.128:2181,192.168.163.128:2182,192.168.163.128:2183 # zookeeper 地址retryCount: 1 # 重试次数elapsedTimeMs: 2000 # 重试间隔时间sessionTimeoutMs: 60000 # session超时时间connectionTimeoutMs: 10000 # 连接超时时间ZK客户端的工厂类 定制ZK客户端 Component public class ZKClientFactory {Resourceprivate ZKClientProps zkClientProps;public CuratorFramework createSimple() {//重试策略第一次重试等待1S第二次重试等待2S第三次重试等待4s//第一个参数等待时间的基础单位单位为毫秒//第二个参数最大重试次数ExponentialBackoffRetry retry new ExponentialBackoffRetry(zkClientProps.getElapsedTimeMs(), zkClientProps.getRetryCount());//获取CuratorFramework示例的最简单方式//第一个参数zk的连接地址//第二个参数重试策略return CuratorFrameworkFactory.newClient(zkClientProps.getConnectString(), retry);}public static CuratorFramework createWithOptions(String connectionString, RetryPolicy retryPolicy,int connectionTimeoutMs, int sessionTimeoutMs) {return CuratorFrameworkFactory.builder().connectString(connectionString).retryPolicy(retryPolicy).connectionTimeoutMs(connectionTimeoutMs).sessionTimeoutMs(sessionTimeoutMs).build();} }注入bean 创建ZK的客户端详情如下 Component Slf4j public class ZKClient {Resourceprivate ZKClientFactory zkClientFactory;public static final ZKClient INSTANCE new ZKClient();private ZKClient() {}public CuratorFramework getClient() {return zkClientFactory.createSimple();}public boolean isNodeExist(String path) {CuratorFramework client getClient();try {client.start();Stat stat client.checkExists().forPath(path);return stat ! null;} catch (Exception e) {e.printStackTrace();} finally {CloseableUtils.closeQuietly(client);}return false;}public void createNode(String path, byte[] bytes) {CuratorFramework client getClient();try {// 必须start否则报错client.start();client.create().creatingParentContainersIfNeeded().withMode(CreateMode.PERSISTENT).forPath(path, bytes);} catch (Exception e) {e.printStackTrace();} finally {CloseableUtils.closeQuietly(client);}}public void deleteNode(String path) {CuratorFramework client getClient();try {client.start();client.delete().forPath(path);} catch (Exception e) {e.printStackTrace();} finally {CloseableUtils.closeQuietly(client);}}public ListString getChildren(String path) {ListString result new LinkedList();CuratorFramework client getClient();try {client.start();result client.getChildren().forPath(path);} catch (Exception e) {log.error(ZKClient getChildren error.);}return result;}}构建测试类 测试基类设置激活环境 Slf4j ActiveProfiles(test) RunWith(SpringRunner.class) SpringBootTest(classes GmallZookeeperApplication.class) ContextConfiguration public class BaseTest {}创建节点、删除节点、获取节点信息、分布式锁的方法如下ActiveProfiles(company)是激活笔者一个application-company.yml文件 application.yml如下 server:port: 8022spring:profiles:active: homeapplication-compay.yml如下 #curator配置 curator:connectString: 192.168.163.128:2181,192.168.163.128:2182,192.168.163.128:2183 # zookeeper 地址retryCount: 1 # 重试次数elapsedTimeMs: 2000 # 重试间隔时间sessionTimeoutMs: 60000 # session超时时间connectionTimeoutMs: 10000 # 连接超时时间创建节点、删除节点、获取节点信息、分布式锁的方法如下 Slf4j ActiveProfiles(company) public class ZKClientTest extends BaseTest{Resourceprivate ZKClient zkClient;public static final int THREAD_NUM 10;Testpublic void distributedLock() throws InterruptedException, BrokenBarrierException {String lockPath /test/distributed2/lock;CuratorFramework client zkClient.getClient();client.start();InterProcessMutex lock new InterProcessMutex(client, lockPath);// 阻塞主线程等待全部子线程执行完CyclicBarrier cyclicBarrier new CyclicBarrier(THREAD_NUM);for (int i 0; i THREAD_NUM; i) {new Thread(() - {log.info({}-尝试竞争锁, Thread.currentThread().getName());try {lock.acquire(); // 阻塞竞争锁log.info({}-成功获得锁, Thread.currentThread().getName());Thread.sleep(2000);cyclicBarrier.await();} catch (Exception e) {e.printStackTrace();} finally {try {lock.release(); //释放锁} catch (Exception e) {e.printStackTrace();}}}, Thread- i).start();}// 目的是为了等子线程抢完锁再结束子线程否则无法看到日志效果cyclicBarrier.await();log.info(全部子线程已执行完毕);}Testpublic void createNode() {// 创建一个ZNode节点String data hello;byte[] payload data.getBytes(StandardCharsets.UTF_8);String zkPath /test/CRUD/node-1;zkClient.createNode(zkPath, payload);log.info(createNode succeeded!);}Testpublic void getChildren() {String zkPath /test/CRUD;ListString children zkClient.getChildren(zkPath);printList(children);}Testpublic void deleteNode() {String parentPath /test;log.info(Before delete);ListString before zkClient.getChildren(parentPath);printList(before);String zkPath /test/CRUD/node-1;zkClient.deleteNode(zkPath);log.info(delete node secceeded!);log.info(After delete);ListString after zkClient.getChildren(parentPath);printList(after);}private void printList(ListString data) {if (!CollectionUtils.isEmpty(data)) {for (String datum : data) {log.info(datum:{}, data);}}} }
http://www.huolong8.cn/news/224088/

相关文章:

  • 做视频最全的网站wordpress 本地服务器
  • 网站引导页是什么wordpress首页手机版
  • 外贸网站支付系统宁波制作网站企业
  • 网站建设公司工资设置注册局官网
  • 做微信扫码网站做公众号和网站主页的区别
  • 网站平台多少钱电商推广计划
  • 网站开发需要什么专业互联网是什么
  • 拼图式网站开发施工企业怎样报考a证
  • 租服务器发布网站搜索关键词排名优化
  • 建设银行黑龙江省分行官方网站微网站和网站同步像素
  • 恺策网优 营销型网站建设品牌服务商WordPress前端发布文章
  • 单位建设网站申请信用卡吗哪个公司制作网站好
  • 如何做一张旅游网站片多多影视剧免费观看在线观看
  • 前端网站开发实例视频实战网站开发
  • 手机网站建设哪家公司好室内设计师培训网
  • 网站推广国外福田欧曼官网
  • 网站登录失败怎么回事网站开发选择题
  • 网站运营难吗广州市网络广告推广
  • 崂山网站建设房地产开发公司名字大全
  • 做图书馆网站网站备案是否收费
  • 怎么样建设一个电影网站潍坊微信网站开发
  • 湖南做网站磐石网络哪个公司做网站推广最好
  • 六安网站制作哪里有郑州发布最新通知
  • 珠海市官网网站建设价格摄影摄像网站建设
  • 韶关做网站需要多少钱广州市网站建设制作设计平台
  • 邯郸个人网站建设flask做克隆网站
  • 新乡网站建设服务办公室公共空间设计
  • 中国建设官网招聘网站专业网站建设服务报价
  • 在线推广网站的方法有哪些哪里有响应式网站企业
  • 服装设计网站有哪些大学生创业做创意宿舍装修网站