当前位置: 首页 > 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微服务框架了。耐斯~

http://www.lryc.cn/news/298991.html

相关文章:

  • 156基于Matlab的光纤陀螺随机噪声和信号
  • 秋招上岸大厂,分享一下经验
  • 使用 C++23 从零实现 RISC-V 模拟器
  • Hugging Face 刚刚推出了一款开源的 AI 助手制造工具,直接向 OpenAI 的定制 GPT 挑战
  • powershell 雅地关闭UDP监听器
  • Google Cloud 2024 年报告重点介绍了关键的网络威胁和防御
  • 【算法题】102. 二叉树的层序遍历
  • 【龙年大礼】| 2023中国开源年度报告!
  • 本地搭建three.js官方文档
  • 【seata自动化治愈数据库问题解决方案】
  • Node.js之npm单独与批量升级依赖包的方式
  • 66.加一
  • UI自动化之Poco常用断言方式
  • c语言_实现类class的功能 实例
  • [2024]常用的pip指令
  • 【Java EE初阶十二】网络编程TCP/IP协议(二)
  • Idea Git Review插件
  • python的turtle可以定义多个海龟对象
  • LocalAI 部署(主要针对 mac m2 启动)
  • Swift Combine 管道 从入门到精通三
  • 【RISC-V DSP设计】基于CEVA DSP架构的指令集分析(二)-函数列表
  • 蓝桥杯(Web大学组)2022国赛真题:水果消消乐
  • LeetCode--代码详解 155.最小栈
  • 第6讲后端鉴权拦截器实现
  • uniapp从入门到进阶
  • CDN缓存404、403状态码
  • 【Python网络编程之DHCP服务器】
  • 【MySQL】:深入理解并掌握DML和DCL
  • CSP-动态规划-最长公共子序列(LCS)
  • 安装nodejs2011并配置npm仓库