Node ZooKeeper 服务发现获取服务节点信息并发送请求
公司服务治理需通过 ZK 来做服务发现,Java都被集成,有封装好的包,直接注释器调用即可。Node还需自己手搓。
1. node-zookeeper-client 包连接 ZK
官方文档:https://www.npmjs.com/package/node-zookeeper-client
安装
npm i node-zookeeper-client
2. 连接ZK
const Zookeeper = require('node-zookeeper-client');
const CONNECTION_STRING = "127.0.0.1:2181"; // 要连接的ZK地址
const OPTIONS = {sessionTimeout: 5000
}
const zk = Zookeeper.createClient(CONNECTION_STRING, OPTIONS);zk.on('connected', function(){console.log("zk=====", zk);
});
//获取根节点下的子节点
zk.getChildren('/', function(error, children, stat){if(error){console.log(error.stack);return;}console.log(children);
})
zk.connect();
3. 其他API
// 判断节点是否已存在
zk.exists('/phpnode',function(error,stat){if(stat){console.log("节点存在");}else{console.log("节点不存在");}
})// 创建/注册节点
zk.create('/phpnode',new Buffer('hello'),function(error,path){console.log(path);
})// 获取节点数据
zk.getData('/phpnode',function(error,data,stat){console.log(data.toString());
});//节点删除
zk.remove('/phpnode',function(error){if(!error){console.log('node 节点删除成功');}
})
4. DEMO(获取服务ip+port,发起请求)
- 因为我的Node服务只需调用其他服务,无需其他服务调用我,所以无需注册ZK,直接获取服务地址即可。
- 还可以通过 js-to-java 、调用 dubbo 等方式进行更优雅的调用,可自行扩展研究
封装 zk.ts 文件,方便调用
// ZK基础信息,可改为配置或传入
export const ZK = {clientAddress: 'localhost:2181/zk/test', // ZK地址servicePath: '/test-service', // 服务路径
};
const zookeeper = require('node-zookeeper-client');
let zkClient: any = null;// 获取服务ip+port
export const getZKServiceBaseUrl = (servicePath: string) => {return new Promise((resolve, reject) => {try {// 防止重复连接if (zkClient) {disconnectZKService();}// 新建连接zkClient = zookeeper.createClient(ZK.clientAddress);// 连接后执行一次zkClient.once('connected', async function () {// 获取服务节点信息const res: any = await listChildren(zkClient, servicePath);res.msgText ? reject(res) : resolve(res);});zkClient.connect();} catch (error) {reject(error);}});
};// 断开链接
export const disconnectZKService = () => {if (zkClient) {zkClient.close();}
};// 获取节点信息,取出ip+port
function listChildren(client, path) {return new Promise((resolve, reject) => {client.getChildren(path,function () {},function (error, children) {if (error) {reject({ ...error, msgText: `获取ZK节点error,Path: ${path}` });}try {let addressPath = path + '/';if (children.length > 1) {//若存在多个地址,则随机获取一个地址addressPath += children[Math.floor(Math.random() * children.length)];} else {//若只有唯一地址,则获取该地址addressPath += children[0];}//获取服务地址client.getData(addressPath, function (err, serviceAddress) {if (err) {reject({ ...error, msgText: `获取ZK服务地址error,Stack: ${err.stack}` });}if (!serviceAddress) {reject({ ...error, msgText: `ZK serviceAddress is not exist` });}const serviceInfo = JSON.parse(serviceAddress);const url = serviceInfo.address + ':' + serviceInfo.port;resolve(url);});} catch (error) {reject({ ...error, msgText: `list ZK children error` });}});});
}
使用
import { getZKServiceBaseUrl, disconnectZKService, ZK } from '../../utils/zk';const requestBaseUrl = await getZKServiceBaseUrl(ZK.servicePath);
// 用后及时断联
disconnectZKService();
// 发起请求,这里是 egg 的请求方式
this.ctx.curl(requestBaseUrl + '/v3/list/save', {method: 'POST',data: {},dataType: 'json',headers: { 'Content-Type': 'application/json' },}).then((res) => {}).catch((err) => {});
- 因为我的Node服务只需调用其他服务,无需其他服务调用我,所以无需注册ZK,直接获取服务地址即可。
- 还可以通过 js-to-java 、调用 dubbo 等方式进行更优雅的调用,可自行扩展研究。
码字不易,觉得有帮助的小伙伴点个赞支持下~
Node ZooKeeper 服务发现获取服务节点信息并发送请求相关推荐
- 基于gRPC服务发现与服务治理的方案
重温最少化集群搭建,我相信很多朋友都已经搭建出来,基于Watch机制也实现了出来,相信也有很多朋友有了自己的实现思路,但是,很多朋友有个疑问,我API和服务分离好了,怎么通过服务中心进行发现呢,这个过 ...
- 获取BT节点信息bittorrent-discovery
2019独角兽企业重金招聘Python工程师标准>>> 获取BT节点信息bittorrent-discovery BT/磁力都是常见的P2P下载方式.用户作为一个节点node从其他用 ...
- taro中无法获取组件节点信息解决办法
最近小程序改版想尝试下taro,其中的一些坑也分享一下 业务场景: 设计稿如下,上面是一个图片列表我们被想用scroll-view包裹在最外层,下面是个tabbar,由于其他的一些业务需求这个tabb ...
- Spring Cloud【Finchley】-02服务发现与服务注册Eureka + Eureka Server的搭建
文章目录 服务发现组件概述 Eureka概述 Eureka原理 Maven父子工程的搭建 Eureka Server的搭建 新建 Maven Module 添加spring-cloud-starter ...
- 学习搭建 Consul 服务发现与服务网格-有丰富的示例和图片
第一部分:Consul 基础 1,Consul 介绍 官网文档描述:Consul 是一个网络工具,提供功能齐全的服务网格和服务发现. 它可以做什么:自动化网络配置,发现服务并启用跨任何云或运行时的安全 ...
- 【五】分布式微服务架构体系详解——服务发现和服务通信
前言 微服务架构的概念比容器技术早,但是却随着容器技术在13年的兴起,基于容器技术的微服务架构越来越被广泛应用.容器的轻量级部署方式很适合为每个微服务提供基础运行环境. 本文会基于Docker容器,先 ...
- 干货实操:微服务Spring Cloud 系列(二) Eureka服务发现与服务注册(strand alone)
此篇主要实操Eureka 服务端的服务注册,以及服务发现,并需要认证才能访问控制中心. 分五个部分说明: 一. 认识 Eureka 二. Eureka 服务端开发 三. Eureka 客户端开 ...
- 服务治理,服务发现,服务注册
什么是服务治理? 那就谈谈为什么要服务治理,是哪方面的需要才出现这个操作的.当我们服务于服务之间通讯调用的时候,我们前期的话就是简单粗暴的用httpclient去请求,没经过第三方的组件管理,然后访问 ...
- 【学习笔记】consul注册中心,服务注册、服务发现、服务监控笔记
consul api kv - Key/Value存储 agent - Agent控制,一般用来服务注册和检查注册 catalog - 管理nodes和services health - 管理健康监测 ...
最新文章
- 用python3实现指定目录下文件sha256及文件大小统计
- SQL与NoSQL区别-存储方式
- 互联网研发中负载均衡算法一点探索
- Stanford UFLDL教程 实现主成分分析和白化
- (十) 整合spring cloud云架构 - SSO单点登录之OAuth2.0登录认证(1)
- SAP 电商云 Spartacus UI production build 时遇到和 orderCore 相关的错误
- 隐藏windows任务栏中的窗口显示
- uniapp 开发踩坑记录
- mysql数据库登录历史_mysql数据库查看历史记录
- 【java】 jsp网页session和application,全局变量方法
- pccad 电气元件_CAD电气元件库谁有?
- .styl格式的CSS样式文件是什么文件
- 基于Python的拉勾网的模拟登录获取cookie
- 经典蓝牙inquiry与inquiry scan
- 再见PDF提取收费!我用100行Python代码搞定!去你的收费!
- 【ArcGIS教程02】HTML弹窗挂接显示调研照片
- 值得收藏!VScode 中这 15 个神仙插件写代码必备!
- Java获取基金接口天天基金_天天基金网数据接口
- php sequelize,关于javascript:eggjs-sequelize-的常用方法总结
- PHPWord 导出生成word
热门文章
- 游戏编程模式-子类沙盒
- 浅谈NAND FLASH的两种编程方式
- shell sort排序
- J02HTML5+CSS大作业——传统节日-春节(8页)
- C语言辩论课,你会Ps、C语言、写方案、搞活动、打辩论,却不会做一顿完整的饭?...
- fragment切换出现空白页
- 好用的工具/everything/wireshark/apowersoft/audacity/mediainfo/diskgenius/elecard sreamEye等
- 个人永久性免费-Excel催化剂功能第66波-数据快速录入,预定义引用数据逐字提示...
- 【医学图像处理】X-ray Fluoroscopy 荧光检查
- sql server DATEPART() 函数的使用(注意防止入坑)