当前位置: 首页 > 后端技术 > Node.js

Node.js + Consul 实现服务注册、健康检查、配置中心

时间:2023-04-03 19:05:02 Node.js

Node.js+Consul实现服务注册、健康检查、配置中心服务注册发现在微服务架构中扮演着重要的角色。随着大量服务的出现,服务之间的配置管理和运维管理变得难以维护。Consul可以解决这些问题,实现服务治理,服务监控。关于Consul更多的知识点在此不再赘述,希望大家在学习本节之前能够有所了解。请移步我之前写的Consul系列文章微服务服务注册发现。InitializeaConsulclient初始化一个Consul客户端,以下Node.js中关于Consul客户端的项目都使用了node-consul模块。核心配置描述host(String,default:127.0.0.1):配置Consul地址port(Integer,default:8500):配置Consul端口secure(Boolean,default:false):enableHTTPSpromisify(Boolean|Function,optional):enablePromise样式,默认为CallbackExampleconstConsul=require('consul');constconsul=newConsul({host:'192.168.6.128',port:8500,promisify:true,});服务注册与健康检查注册一个服务并启动健康检查核心配置描述name(String):注册服务名称id(String,optional):服务注册标识符tags(String[],optional):服务标签地址(String,optional)):需要注册的服务地址(client)port(Integer,optional):需要注册的服务端口(client)check(Object,optional):服务健康检查的核心参数如下http(String):健康检查的路径,interval参数必须设置,它可以是对象数组的形式。参数参考上面的简单检查示例consul.agent。service.register({name:serviceName,address:'192.168.20.193',port:3000,check:{http:'http://192.168.20.193:3000/health',interval:'10s',timeout:'5s',}},函数(错误,结果lt){if(err){console.error(err);抛出错误;}console.log(serviceName+'注册成功!');})配置Consul管理控制台Consul提供Key/Value存储,可以作为服务的配置中心,提供JSON、YAML、HCL三种格式.在最早版本的Consul中,只有一种JSON格式。下面是我为Consul控制台配置的数据,如下图所示:服务配置中心实现了Consul的Key/Value功能,可以作为服务的配置中心。对于项目中一些可变的参数信息,可以在Consul中进行配置,这样当数据发生变化时,项目不需要因为配置变化而重新发布获取配置信息。Key为我们配置的路径,比如我要获取上面配置的User数据,Key会更新'develop/user'的配置信息consul.kv.get(key)key(String):updatedpath,如'develop/user'value(String|Buffer):更新的数据信息注意:如果我们要更新JSON中的某个字段,首先需要通过consul.kv.get读取JSON对象,程序处理后,它将作为传输更新的第二组参数。consul.kv.set('develop/user',JSON.stringify(user))HTTPAPI调用也可以直接通过HTTPAPI接口调用,例如:http://192.168.6.128:8500/v1/kv/develop/user?raw,如果只想使用Consul作为配置中心,也可以通过简单的HTTPAPI调用,将数据存储在本地,定时更新本地配置,但这要看你自己实现了。Nodejs中测试下面是一个简单的demo,展示了Node.js与Consul之间如何进行服务注册、健康检查和配置中心申请,可以用来练习上面讲解的理论知识。封装Consul//consul.jsconstConsul=require('consul');classConsulConfig{constructor(){constserviceName='consul-demo';//初始化领事this.consul=newConsul({host:'192.168.6.128',port:8500,promisify:true,});//服务注册和健康检查配置this.consul.agent.service.register({name:serviceName,address:'192.168.20.193',//注意:192.168。20.193是我本地的内网ip,通过ifconfig查看端口:3000,检查:{http:'http://192.168.20.193:3000/health',interval:'10s',timeout:'5s',}},function(err,result){if(err){console.error(err);throwerr;}console.log(serviceName+'注册成功!');})}asyncgetConfig(key){constresult=awaitthis.consul.kv.get(key);如果(!结果){returnPromise.reject(key+'不存在');}返回JSON.parse(result.Value);}//读取用户配置简单封装asyncgetUserConfig(key){constresult=awaitthis.getConfig('develop/user');如果(!key){返回结果;}返回结果[键];}//更新用户配置简单封装asyncsetUserConfig(key,val){constuser=awaitthis.getConfig('develop/user');用户[键]=val;returnthis.consul.kv.set('develop/user',JSON.stringify(user))}}module.exports=ConsulConfig;编写启动文件//app.jsconsthttp=require('http');constConsulConfig=require('./consul');constconsul=newConsulConfig();http.createServer(async(req,res)=>{const{url,method}=req;//测试健康检查if(url==='/health'){res.end('OK!');}//测试动态读取数据if(method==='GET'&&url==='/user/info'){constuser=awaitconsul.getUserConfig();res.end(`你好,我是${user.n今年是${user.age}`);}//测试数据更新if(method==='POST'&&url==='/user'){try{awaitconsul.setUserConfig('age',18)//将年龄更改为18res.end('好的!');}catch(err){console.error(err);res.end('错误!');}}}).listen(3000,'192.168.20.193');//192.168.20.193是我本地的内网ip,通过ifconfig查看接口测试健康检查接口这个接口是服务启动后根据consul.js文件配置到Consul配置中心注册和健康检查信息会自动调用$curlhttp://192.168.20.193:3000/healthOK!注册成功后,我们的服务名称和健康检查结果显示如下:获取配置信息接口$curlhttp://192.168.20.193:3000/user/info你好,我是Jack。今年20更新配置信息界面$curl-XPOSThttp://192.168.20.193:3000/userOK!更新后重新获取配置,可以看到使用Consul作为配置中心后,也可以在不重启我的项目的情况下实现数据的动态变化。$curlhttp://192.168.20.193:3000/user/info大家好,我是Jack,今年18,本节源码Github地址:Node.js+Consul实现服务注册、健康检查、配置中心Demo汇总总结本文的主要讲解在Node.js中应用了Consul的三个功能点后,客户端成功注册服务后,可以在Consul控制台看到当前的服务列表。健康检查功能可以检查接口的可用性,进一步可以用于运维监控和告警。配置中心对于我们开发者来说非常实用。有了它,我们可以做一些运行时配置。Consul的应用不限于以上三点。通过Consul,还可以做负载均衡和分布式锁。你觉得很厉害吗?这个功能是之前看SpringCloudConsul的时候学的。欢迎关注“Nodejs技术栈”,这些后续实践也会在后面分享。阅读推荐Nodejs-Interview-Questions——专注于Node.js面试和FAQ分享Nodejs技术栈——Node.js开发学习的技术栈指南关注“Nodejs技术栈”为你推荐更多Node.js相关学习指南首次亮相MOOC