随着现代应用程序的复杂性和规模的不断增加,微服务架构在Web应用程序中变得越来越流行。微服务将系统分解为小型服务,这些服务可独立部署和扩展。这种架构有助于开发和维护大型应用程序,但也带来了新的挑战,例如服务治理和监控。在本篇文章中,我们将探讨基于 Node.js 的微服务治理及监控。
什么是微服务治理?
微服务架构的核心理念是将复杂的系统分解为更小,更集中的单元。每个单元(即微服务)都独立运行,可以分配功能,便于扩展,更容易开发和维护。这意味着,要使应用程序成功运行,每个微服务都需要在系统中持续地共同工作。
微服务治理是微服务架构中至关重要的一部分。它是确保微服务在系统中协同工作的落实机制。它包括:
- 服务发现 - 该过程可以帮助微服务识别其它微服务,以达成协作。
- 服务路由 - 该过程管理请求和响应之间的路由逻辑。
- 负载均衡 - 这个过程确保不同的请求被平均分布到可用的微服务实例中。
- 错误处理 - 这个过程使得系统能处理出现故障的微服务。
微服务治理的目标是使系统过程可用,可靠和容错。
为什么需要微服务治理?
在微服务架构中,每个微服务都是独立的,可以运行在不同的服务器上,不同的端口上,所以我们无法手动进行监控和管理。如果不能让微服务互相发现和协作,那么应用程序的性能和可靠性将会受到影响。这就是为什么需要微服务治理的原因。
进行服务发现:在分布式系统中,如果每个微服务都需要知道其它微服务的位置,端口和路径,那么系统就会变得混乱和难以维护。微服务治理可以通过DNS,负载均衡或API网关等方式,集中管理所有微服务的信息。
有效路由:在微服务架构中,提供REST接口的每个微服务都有自己的URL路径。微服务治理可以通过路由,将请求从一个微服务路由到另一个微服务的URI上。
处理微服务故障: 在微服务中,可能会出现故障,例如:一个微服务可能会响应慢,或者根本没有响应。微服务治理可以检测到这些问题,并使用合适的策略来处理它们,例如使用容错或故障转移机制。
##微服务监控
在微服务架构中,追踪和监控应用程序的状态和健康状况非常重要。因为每个微服务都是独立运行,不同的微服务可能在不同的服务器上运行,并且可能会有多个实例。因此,我们需要进行一些特殊的监控来确保整个系统始终保持稳定。
微服务监控是对后端服务各种指标的跟踪,包括两方面:一是服务的指标,例如:磁盘空间占用,系统负载平均值等。二是请求的指标,例如:有多少个请求获得响应,响应的时间是多长等。这些指标的监测可以帮助开发人员和运维团队方便地管理和优化微服务。好的微服务监测系统应该支持以下功能:
- 实时通知 - 运维人员能够对服务和请求的指标设定阈值,并在指标超过该阈值时得到实时通知。
- 可视化的指标展示 - 可以通过图示的方式,以清晰的可视化效果展示指标数据。
- 多维数据仓库 - 数据管理系统,用来存储指标数据,通过特定的查询语言支持良好的数据存储和查询。
基于 Node.js 实现微服务治理和监控
下面,我们将用Node.js实现一个简单的微服务治理和监控系统。我们使用NPM上提供的现成的包,分别是:express,consul,request-promise 和 prom-client。
- 首先,我们需要安装以上的依赖包:
npm i express body-parser consul request-promise prom-client
- 在代码中导入依赖:
const express = require('express'); const bodyParser = require('body-parser'); const consul = require('consul')(); const request = require('request-promise'); const { Registry } = require('consul-registry'); const client = require('prom-client');
- 创建一个简单的HTTP Server
我们使用express创建一个HTTP服务器,并暴露API接口,用户可以在该接口中注册服务,健康检查,微服务列表的提供等操作。
// javascriptcn.com 代码示例 const app = express(); const port = 3000; app.use(bodyParser.json()) app.get('/', (req, res) => { const registry = new Registry({consul}); registry.service.list('microservice') .then(services => { res.json(services); }) .catch(error => { console.log(error); return res.status(500).json(error); }) }); app.post('/register', (req, res) => { const {name, address, port} = req.body; const registry = new Registry({consul}); registry.service.register(name, address, port, {tags: 'microservice'}) .then(result => { console.log(result); return res.json(result); }) .catch(error => { console.log(error); return res.status(500).json(error); }) }); app.get('/health', (req, res) => { const registry = new Registry({consul}); registry.service.list('microservice') .then(services => { Promise.all(services.map(service => { return request(`http://${service.Address}:${service.Port}/health`, {timeout: 2500}) .then(response => { return { name: service.Service, status: 'UP' } }) .catch(error => { return { name: service.Service, status: 'DOWN' } }) })) .then(result => { if (result.some(r => r.status !== 'UP')) { console.log('Service down!'); return res.status(500).json(result); } else { return res.json(result); } }) }) });
- 添加Microservice健康检查
为了进行微服务检查的监测,微服务需要实现一个名为 '/health' REST 接口,告诉所有请求者微服务的健康状况。
app.get('/health', (req, res) => { return res.json({status: 'UP'}); });
- 把监控数据推入Prometheus
使用prom-client将每个微服务的指标推送到Prometheus。同时,将Prometheus的请求绑定到 express web 路由上,以便Prometheus可以通过该路由获取微服务的指标。
// javascriptcn.com 代码示例 const requestCounter = new client.Counter({ name: 'requests_total', help: 'Total number of requests' }); app.get('/metrics', (req, res) => { res.set('Content-Type', client.register.contentType); res.end(client.register.metrics()); }); app.use((req, res, next) => { requestCounter.inc(); next(); })
总结
本文介绍了从微服务治理到监控的全过程。我们用Node.js实现了一个简单的治理和监控功能,您可以根据需要自行扩展。基于Node.js的微服务治理和监控,使得分布式系统更加灵活和高效,为应用程序的稳定性和可靠性带来了长足的发展。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6528f7307d4982a6ebb8793a