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

Dubbo集成Zookeeper embbed模式

为了简化应用支持服务方便的分合,使用Zookeeper embbed模式。集成Zookeeper比较容易,使用starter或自己写代码都可以。但是由于集成了Dubbo,每次启动时都会发现zookeeper没有启动就开始报错退出,但是确是已经集成了。

于是只能翻Dubbo源码

发现Dubbo启动时,会添加一个早期事件DubboConfigInitEvent。在spring afterproperties后,会立即触发该事件。在该事件里调用zookeeper注册事件。

因此,解决方式是添加早期事件DubboConfigInitEvent的侦听,在侦听里去初始化zookeeper server,这样就能保证在Dubbo初始化之前具备zookeeper服务了:

添加一个Helper Bean,实现代码如下:

package org.ccframe.commons.helper;import lombok.Getter;
import lombok.SneakyThrows;
import org.apache.dubbo.config.spring.context.event.DubboConfigInitEvent;
import org.apache.zookeeper.server.NIOServerCnxnFactory;
import org.apache.zookeeper.server.ZooKeeperServer;
import org.ccframe.config.GlobalEx;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;import java.io.File;
import java.net.InetSocketAddress;
import java.nio.file.Path;
import java.nio.file.Paths;@Component
public class EmbeddedZookeeperLauncher implements ApplicationListener<DubboConfigInitEvent>{private String zooDir;@Value("${app.zookeeper.embed.dir:}")public void setZooDir(String zooDir) {this.zooDir = zooDir;if (zooDir == null || zooDir.isEmpty()) {this.zooDir = GlobalEx.APP_BASE_DIR + File.separator + GlobalEx.EMBEDDED_ZOOKEEPER_DIR; //zookeeper数据放到应用运行目录}}@Value("${app.zookeeper.embed.port:2181}")private Integer zooPort;@Value("${app.zookeeper.embed.max-connection:1024}")private Integer maxConnection;@Value("${app.zookeeper.embed.tick-time:500}")private Integer tickTime;@Getterprivate ZooKeeperServer zooKeeperServer;@Override@SneakyThrowspublic void onApplicationEvent(DubboConfigInitEvent event){if (event.getApplicationContext().getParent() == null) {Path zooPath = Paths.get(zooDir);zooKeeperServer = new ZooKeeperServer(zooPath.toFile(), zooPath.toFile(), tickTime);NIOServerCnxnFactory factory = new NIOServerCnxnFactory();System.setProperty("zookeeper.maxCnxns", Integer.toString(maxConnection));factory.configure(new InetSocketAddress(zooPort), maxConnection);factory.startup(zooKeeperServer);}}}

然后启动就不会报错了

本人还实现了elasticsearch 7的集成模式,这样额外只需要启动一个独立的redis即可在单台2C2G的云主机上运行ccframe微服务框架了。耐斯~

相关文章:

  • 屏幕字体种类介绍
  • 第62讲商品搜索动态实现以及性能优化
  • CVE-2022-0760 漏洞复现
  • 力扣:376. 摆动序列
  • vue监视和深度监视
  • 红队打靶练习:GLASGOW SMILE: 1.1
  • DS Wannabe之5-AM Project: DS 30day int prep day14
  • Spring Cloud Neflix Hystrix应用实战详解
  • IM聊天系统为什么需要做消息幂等?如何使用Redis以及Lua脚本做消息幂等【第12期】
  • 如何把手机平板变为电脑的屏幕
  • 《Docker极简教程》--Docker环境的搭建-在Windows上搭建Docker环境
  • C#向数组指定索引位置插入新的元素值:自定义插入方法 vs List<T>.Add(T) 方法
  • docker本地目录挂载
  • 9.0 Zookeeper 节点特性
  • 面试高频知识点:2线程 2.1.5如何自定义实现一个线程池
  • 【剑指offer】让抽象问题具体化
  • 【刷算法】求1+2+3+...+n
  • 07.Android之多媒体问题
  • Android优雅地处理按钮重复点击
  • C++入门教程(10):for 语句
  • ESLint简单操作
  • Git初体验
  • JAVA 学习IO流
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Ruby 2.x 源代码分析:扩展 概述
  • SpringBoot 实战 (三) | 配置文件详解
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Tornado学习笔记(1)
  • Travix是如何部署应用程序到Kubernetes上的
  • Vue2 SSR 的优化之旅
  • vue脚手架vue-cli
  • 初识 beanstalkd
  • 前端js -- this指向总结。
  • 新书推荐|Windows黑客编程技术详解
  • 一个JAVA程序员成长之路分享
  • 正则表达式小结
  • #if #elif #endif
  • #微信小程序(布局、渲染层基础知识)
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (pytorch进阶之路)扩散概率模型
  • (SpringBoot)第二章:Spring创建和使用
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (定时器/计数器)中断系统(详解与使用)
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • ***检测工具之RKHunter AIDE
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .Net CF下精确的计时器
  • .NET HttpWebRequest、WebClient、HttpClient