公司服务治理需通过 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 服务发现获取服务节点信息并发送请求相关推荐

  1. 基于gRPC服务发现与服务治理的方案

    重温最少化集群搭建,我相信很多朋友都已经搭建出来,基于Watch机制也实现了出来,相信也有很多朋友有了自己的实现思路,但是,很多朋友有个疑问,我API和服务分离好了,怎么通过服务中心进行发现呢,这个过 ...

  2. 获取BT节点信息bittorrent-discovery

    2019独角兽企业重金招聘Python工程师标准>>> 获取BT节点信息bittorrent-discovery BT/磁力都是常见的P2P下载方式.用户作为一个节点node从其他用 ...

  3. taro中无法获取组件节点信息解决办法

    最近小程序改版想尝试下taro,其中的一些坑也分享一下 业务场景: 设计稿如下,上面是一个图片列表我们被想用scroll-view包裹在最外层,下面是个tabbar,由于其他的一些业务需求这个tabb ...

  4. Spring Cloud【Finchley】-02服务发现与服务注册Eureka + Eureka Server的搭建

    文章目录 服务发现组件概述 Eureka概述 Eureka原理 Maven父子工程的搭建 Eureka Server的搭建 新建 Maven Module 添加spring-cloud-starter ...

  5. 学习搭建 Consul 服务发现与服务网格-有丰富的示例和图片

    第一部分:Consul 基础 1,Consul 介绍 官网文档描述:Consul 是一个网络工具,提供功能齐全的服务网格和服务发现. 它可以做什么:自动化网络配置,发现服务并启用跨任何云或运行时的安全 ...

  6. 【五】分布式微服务架构体系详解——服务发现和服务通信

    前言 微服务架构的概念比容器技术早,但是却随着容器技术在13年的兴起,基于容器技术的微服务架构越来越被广泛应用.容器的轻量级部署方式很适合为每个微服务提供基础运行环境. 本文会基于Docker容器,先 ...

  7. 干货实操:微服务Spring Cloud 系列(二) Eureka服务发现与服务注册(strand alone)

    此篇主要实操Eureka 服务端的服务注册,以及服务发现,并需要认证才能访问控制中心. 分五个部分说明: 一.  认识 Eureka 二.  Eureka  服务端开发 三.  Eureka 客户端开 ...

  8. 服务治理,服务发现,服务注册

    什么是服务治理? 那就谈谈为什么要服务治理,是哪方面的需要才出现这个操作的.当我们服务于服务之间通讯调用的时候,我们前期的话就是简单粗暴的用httpclient去请求,没经过第三方的组件管理,然后访问 ...

  9. 【学习笔记】consul注册中心,服务注册、服务发现、服务监控笔记

    consul api kv - Key/Value存储 agent - Agent控制,一般用来服务注册和检查注册 catalog - 管理nodes和services health - 管理健康监测 ...

最新文章

  1. 用python3实现指定目录下文件sha256及文件大小统计
  2. SQL与NoSQL区别-存储方式
  3. 互联网研发中负载均衡算法一点探索
  4. Stanford UFLDL教程 实现主成分分析和白化
  5. (十) 整合spring cloud云架构 - SSO单点登录之OAuth2.0登录认证(1)
  6. SAP 电商云 Spartacus UI production build 时遇到和 orderCore 相关的错误
  7. 隐藏windows任务栏中的窗口显示
  8. uniapp 开发踩坑记录
  9. mysql数据库登录历史_mysql数据库查看历史记录
  10. 【java】 jsp网页session和application,全局变量方法
  11. pccad 电气元件_CAD电气元件库谁有?
  12. .styl格式的CSS样式文件是什么文件
  13. 基于Python的拉勾网的模拟登录获取cookie
  14. 经典蓝牙inquiry与inquiry scan
  15. 再见PDF提取收费!我用100行Python代码搞定!去你的收费!
  16. 【ArcGIS教程02】HTML弹窗挂接显示调研照片
  17. 值得收藏!VScode 中这 15 个神仙插件写代码必备!
  18. Java获取基金接口天天基金_天天基金网数据接口
  19. php sequelize,关于javascript:eggjs-sequelize-的常用方法总结
  20. PHPWord 导出生成word

热门文章

  1. 游戏编程模式-子类沙盒
  2. 浅谈NAND FLASH的两种编程方式
  3. shell sort排序
  4. J02HTML5+CSS大作业——传统节日-春节(8页)
  5. C语言辩论课,你会Ps、C语言、写方案、搞活动、打辩论,却不会做一顿完整的饭?...
  6. fragment切换出现空白页
  7. 好用的工具/everything/wireshark/apowersoft/audacity/mediainfo/diskgenius/elecard sreamEye等
  8. 个人永久性免费-Excel催化剂功能第66波-数据快速录入,预定义引用数据逐字提示...
  9. 【医学图像处理】X-ray Fluoroscopy 荧光检查
  10. sql server DATEPART() 函数的使用(注意防止入坑)