利用 PM2 实现高效的应用程序监控和管理
1. pm2
PM2 是一个流行的进程管理器,用于 Node.js 应用程序。它支持应用程序的负载均衡、自动重启、日志管理、监控以及多环境管理等功能。PM2让开发者能够以守护进程的方式运行和管理 Node.js 应用,即使在应用崩溃或服务器重启后也能自动重启应用。这使得 PM2非常适合在生产环境中部署 Node.js 应用。除此之外,PM2还支持应用的零停机更新,以及对 Docker 容器的支持。
2. 诞生背景
PM2 的诞生背景主要是为了解决 Node.js 应用程序在生产环境中的运维问题。在 PM2出现之前,Node.js 开发者经常面临如何有效管理和维持应用稳定运行的挑战,特别是在应对应用崩溃、服务器重启或是负载均衡等方面。
PM2的主要目标是提供一个简单而强大的工具,帮助开发者和系统管理员在生产环境中管理和维护 Node.js 应用。它解决的关键问题包括:
- 自动重启: 如果 Node.js 应用崩溃或由于某种原因停止,PM2可以自动重启应用,确保服务的持续可用性。
- 负载均衡: PM2支持集群模式,能够启动多个应用实例,并在它们之间自动分配负载,提高应用的可伸缩性和可用性。
- 无停机更新: PM2允许开发者在不停止当前服务的情况下,更新 Node.js 应用到新的版本,这对于需要24/7运行的服务来说非常重要。
- 日志管理: PM2提供了日志管理的功能,使得跟踪和调试生产环境中的应用更为便捷。
- 监控: PM2包含了一个监控系统,可以实时查看应用的 CPU 和内存使用情况,帮助开发者优化应用性能。
2. 安装
执行以下命令来全局安装 PM2。全局安装意味着你可以在任何地方运行 PM2命令。
npm install pm2 -g
这条命令会将 PM2安装到你的系统上,-g
参数表示全局安装,这样你就可以在任何目录下使用 PM2命令。
安装完成后,你可以运行以下命令来检查 PM2是否正确安装:
pm2 --version
3. 常用命令
命令 | 描述 | 使用示例及参数 |
---|---|---|
start |
启动应用 |
pm2 start app.js pm2 start app.js -i 4 --name myApp pm2 start app.js --watch
|
stop |
停止应用 |
pm2 stop app.js pm2 stop 0 pm2 stop all
|
restart |
重启应用 |
pm2 restart app.js pm2 restart all
|
delete |
删除应用 |
pm2 delete app.js pm2 delete 0 pm2 delete all
|
list |
列出所有应用 | pm2 list |
monit |
监控应用 | pm2 monit |
logs |
查看应用日志 |
pm2 logs pm2 logs app.js pm2 logs --lines 100
|
save |
保存当前应用列表 | pm2 save |
reload |
重载应用 |
pm2 reload app.js pm2 reload all
|
scale |
调整集群模式下的实例数量 |
pm2 scale app +1 pm2 scale app 4
|
describe |
查看应用详细信息 | pm2 describe 0 |
update |
更新 PM2守护进程 | pm2 update |
status |
查看应用状态 | pm2 status |
flush |
清空所有日志文件 | pm2 flush |
startup |
创建开机自启动脚本 | pm2 startup |
unstartup |
删除开机自启动脚本 | pm2 unstartup |
4. 配置文件
PM2的配置文件通常被称为ecosystem.config.js
,这是一个 JavaScript 文件,允许你配置和管理应用程序的多个方面。通过使用配置文件,你可以轻松地指定环境变量、日志文件路径、实例数量等,并且可以一次性启动多个应用。下面详细介绍如何使用 PM2配置文件。
基本结构
PM2的ecosystem.config.js
文件基本结构如下:
module.exports = {
apps: [
{
name: "app1", // 应用程序名称
script: "./app.js", // 主脚本路径
args: "arg1 arg2", // 传递给脚本的参数
instances: 4, // 应用实例数
autorestart: true, // 自动重启
watch: false, // 监控文件变动
max_memory_restart: "1G", // 内存超过1G 重启
env: {
// 环境变量
NODE_ENV: "development",
},
env_production: {
// 生产环境变量
NODE_ENV: "production",
},
},
{
name: "app2",
script: "./app2.js",
// 其他配置...
},
],
};
主要字段解释
- apps: 一个数组,包含了你要运行的应用的配置对象。
- name: 应用程序的名称。
- script: 应用程序的启动脚本或文件。
- args: 传递给脚本的参数。
-
instances: 启动应用实例的数量。对于无状态的应用,可以设置为
max
以根据 CPU 核心数量来启动最大实例数。 - autorestart: 如果应用崩溃或者停止,是否自动重启。
- watch: 是否启用文件监控和自动重启。
- max_memory_restart: 当应用超过指定内存量时自动重启。
- env: 在这个对象中,你可以指定传递给应用的环境变量。这些环境变量在所有环境下都会加载。
- env_production, env_development: 你可以为不同的环境指定不同的环境变量。
使用配置文件
-
启动应用: 使用配置文件启动应用时,运行如下命令:
pm2 start ecosystem.config.js
-
指定环境: 如果你有为不同环境定义的变量,可以在启动时指定:
pm2 start ecosystem.config.js --env production
这将使用
env_production
中定义的环境变量。 -
管理应用: 一旦应用启动,你可以使用 PM2的标准命令来管理它们,例如
pm2 stop
,pm2 restart
, 和pm2 delete
。
配置文件为应用部署提供了强大而灵活的管理方式,特别是当你需要部署多个应用或需要为应用指定特定的环境变量和配置时。通过精心设计的配置文件,你可以确保应用的部署更加一致和可预测。
5. CLI 实现配置文件效果
如果你不使用配置文件,而是选择直接使用 PM2的 CLI 命令来实现上面提到的功能,可以通过在命令行中添加特定的选项和参数来完成。下面是如何通过 CLI 命令实现配置文件中提到的一些主要功能:
-
启动应用并传递参数:
pm2 start app.js --name "app1" -- arg1=value1 arg2=value2
这里
--name "app1"
设定了应用的名称,-- arg1 arg2
向应用传递了参数。 -
指定实例数量:
pm2 start app.js -i 4
该命令启动了4个应用实例。如果你想要根据 CPU 核心数量来启动最大实例数,可以使用
-i max
。 -
启用自动重启: 自动重启是 PM2的默认行为,无需特别指定。
-
启用文件监控:
pm2 start app.js --watch
这会监控应用目录中文件的变动,并在变动时自动重启应用。
-
限制内存重启:
pm2 start app.js --max-memory-restart 1G
当应用消耗的内存超过1GB 时,PM2将自动重启应用。
-
设置环境变量: 你可以在启动命令中直接设置环境变量:
NODE_ENV=development pm2 start app.js
或者,为了同时设置多个环境变量,可以使用:
pm2 start app.js --env NODE_ENV=development,env1=13,env2=32
-
为生产环境设置环境变量: 对于生产环境,你可以这样设置:
NODE_ENV=production pm2 start app.js
使用 CLI 命令直接设置这些选项的好处是快速简便,特别是对于一次性或临时的任务。但对于更复杂的部署,或者当你需要在多个环境中维护一致的配置时,使用配置文件将更为有效和易于管理。
6. 监控
PM2提供了一个内置的监控工具,允许你实时查看运行在 PM2下的应用的性能指标,如 CPU 和内存使用情况。这个监控工具可以帮助你了解应用的运行状况,及时发现潜在的问题。
使用 PM2监控命令行工具
-
启动监控控制台:
要查看实时的监控数据,可以在命令行中使用以下命令:
这会打开一个交互式的监控控制台,其中展示了所有由 PM2管理的进程的 CPU 和内存使用情况。pm2 monit
使用 PM2 Web 界面
PM2还提供了一个 Web 界面,称为 PM2 Plus,用于更高级的监控和管理功能,包括远程监控和日志管理。不过,这需要在 PM2 Plus 网站上注册并设置 keymetrics 代理。
-
PM2 Plus:
- 你可以访问PM2 Plus来获取更多关于这个服务的信息。
- 它允许你监控关键指标,设置告警,查看日志,和进行实时的问题排查。
自定义指标
PM2还允许你定义自己的指标来监控。你可以在你的应用中集成 PM2的 API 来发送自定义指标,这样就可以在 PM2的监控工具中查看这些指标了。
7. 其它
7.1 负载均衡下的会话管理
在使用 PM2的集群模式运行多个实例的场景下,确保会话(session)一致性是一个重要的考虑点。由于每个实例都是独立运行的,直接在内存中存储会话信息可能会导致会话不一致的问题,因为用户的后续请求可能被路由到不同的实例上,而不同的实例之间无法共享内存中的会话信息。
为了解决这个问题,通常的做法是使用一个*存储来存储会话信息,这样不同的实例可以共享这些信息。以下是一些常见的解决方案:
-
使用 Redis 存储会话: Redis 是一种常用的解决方案,它提供了快速的数据读写并支持数据持久化。使用 Redis 作为会话存储,可以确保不同的实例能够访问和更新同一份会话数据。
-
使用数据库存储会话: 另一种常见的方法是将会话存储在数据库中,如 MongoDB 或 MySQL 等。这样可以确保会话信息的一致性,但可能比使用内存存储或 Redis 的性能稍低。
-
使用其他共享存储方案: 根据应用的具体需求,还可以考虑使用其他类型的共享存储方案,如 Memcached、Etcd 等。
对于 Node.js 应用,如果你使用 Express 框架,可以利用express-session
配合 Redis 等存储的中间件来实现会话的共享。例如,使用connect-redis
中间件将会话存储在 Redis 中:
const session = require("express-session");
const RedisStore = require("connect-redis")(session);
app.use(
session({
store: new RedisStore({
// Redis 服务器配置
host: "localhost",
port: 6379,
}),
secret: "your_secret",
resave: false,
saveUninitialized: false,
})
);
使用这种方式,无论用户的请求被路由到哪个实例,应用都能访问到同一份会话信息,从而避免了会话不一致的问题。确保你的会话存储方案是可伸缩的,并且可以处理你的应用负载。
7.2 异常重启处理
当 PM2重启应用时,确保应用的当前状态完成后再继续,以及在异常重启下恢复重启前的状态,需要在应用层面做一些策略设计。这通常涉及到优雅的关闭处理和持久化状态管理。
优雅的关闭处理
-
捕获关闭信号:在 Node.js 应用中,你可以监听如
SIGINT
和SIGTERM
这样的信号,这样当 PM2尝试重启应用时,你的代码可以捕获这些信号并执行清理逻辑。process.on("SIGINT", function () { console.log("Received SIGINT. Performing graceful shutdown."); gracefulShutdown(); }); function gracefulShutdown() { // 在这里执行清理操作,如关闭数据库连接、完成正在处理的请求等 }
-
完成正在处理的请求:在收到关闭信号后,应用应该停止接受新的请求,但同时确保当前正在处理的请求完成。这可能涉及到跟踪所有活跃的请求并等待它们结束。
恢复状态
-
状态持久化:为了在重启后恢复状态,应用的关键状态需要持久化,例如存储在数据库或文件系统中。这样,在应用重启后,可以从这些持久化的存储中恢复状态。
-
启动时的状态恢复逻辑:应用启动时应该包含逻辑来检查并恢复之前的状态。这可能包括读取数据库中的数据,或从文件系统中恢复信息等。
PM2特定策略
-
进程守护:PM2会守护你的应用进程,如果应用崩溃或非正常退出,它会自动重启应用。这是通过配置 PM2的
restart
策略实现的。 -
零停机重启:使用 PM2的
reload
或gracefulReload
命令可以实现零停机重启,这对于不间断服务的应用特别有用。这些命令会等待新的实例启动并接收连接后,再停止旧的实例。
7.3 SIGINT 信号超时处理
const express = require("express");
const app = express();
const server = app.listen(3000, () =>
console.log("Server started on port 3000")
);
let activeConnections = new Set();
app.get("/", (req, res) => {
// 模拟长时间运行的请求
const requestId = Date.now();
activeConnections.add(requestId);
console.log(`Request ${requestId} started`);
setTimeout(() => {
res.send("Hello World");
activeConnections.delete(requestId);
console.log(`Request ${requestId} finished`);
}, 10000); // 假设请求处理需要10秒
});
process.on("SIGINT", () => {
console.log("Received SIGINT. Graceful shutdown start.");
// 停止服务器接受新的连接
server.close(() => {
console.log("Server closed. No new connections are accepted.");
});
// 等待所有活动请求完成
const checkActiveConnections = () => {
if (activeConnections.size > 0) {
console.log(
`Waiting for ${activeConnections.size} active connections to finish.`
);
setTimeout(checkActiveConnections, 1000);
} else {
console.log("All connections finished. Exiting now.");
process.exit(0);
}
};
checkActiveConnections();
});
捕获SIGINT
信号后,进程确实有机会执行清理逻辑,但这并不意味着 PM2无法再去主动 kill 进程。当你的应用捕获SIGINT
信号并进入清理阶段时,PM2会等待一段时间(默认是1600毫秒),这个时间是可配置的。如果应用在这段时间内没有退出,PM2会发送SIGKILL
信号来强制终止进程。
这意味着你的清理逻辑需要在 PM2的超时时间内完成,以确保它能够正常执行并让进程优雅地退出。如果清理逻辑需要的时间超过了 PM2的超时阈值,你可以调整 PM2的配置来增加这个超时时间。
例如,你可以在启动应用时通过--kill-timeout
参数来设置这个超时时间:
pm2 start app.js --kill-timeout 3000
这里,--kill-timeout 3000
表示 PM2将等待3000毫秒(3秒)给应用足够的时间来处理清理逻辑。如果应用在3秒内没有退出,PM2将使用SIGKILL
来强制终止应用。
这个机制确保了你的应用有机会在 PM2重启或停止它之前完成必要的清理工作,同时也保留了 PM2在应用无法正确响应终止信号时强制关闭它的能力。
微信搜索“好朋友乐平”关注公众号。
github原文地址
上一篇: 7 位解码(Java)
下一篇: PM2 易用手册
推荐阅读
-
广联达:"数字建筑 "将推动建筑业向现代工业化水平迈进--一是全过程、全要素、全参与方的数字化。"数字建筑 "整合了人员、流程、数据、技术和业务系统,对建筑从规划设计到施工建设、运营维护的全生命周期进行管理。 二是数字化、在线化、智能化。这也是数字化建筑的三大典型特征。其中,数字化是基础,在线化是关键,智能化是目标。 三是新设计、新建设、新运维。试想,未来通过全数字化样板设计实现个性化最优方案,通过工业化施工提高效率精益求精,通过智能化运维提升建筑品质低碳宜居,将推动建筑业向现代工业化水平迈进。 广联达的一批标杆项目和应用案例备受关注。
-
澎湃新闻对话腾讯丁珂:从 "治已病 "到 "治未病",企业需快速构建 "安全免疫力"--丁珂指出,对企业而言,安全不是成本而是生命线 丁珂指出,对企业而言,安全不是成本而是生命线,也是商业 "硬币 "的另一面。在数字智能化的新阶段,发展驱动安全建设已成为普遍共识,企业需要转变安全思维,从被动建设到主动防御,构建一套新的安全范式和框架,以更加积极、主动的安全观来提升数字安全免疫力,以 "治未病 "的理念取代 "治已病",前置安全,快速构建 "安全免疫力"。对 "已病",前置预判,及时应对处置安全风险,才能维护品牌价值,保障健康发展。 与此同时,安全建设还普遍存在 "不知道往哪投、怎么投 "的痛点。对此,腾讯安全提出,企业可以按照数字安全免疫模型的框架进行安全全局部署,重点在业务安全、数据安全、安全运维管理、边界安全、终端安全、应用开发安全等薄弱环节的关键领域注入 "免疫增强针"。 今年进入公众视野的AIGC还在产业化、产品化的过程中,但大量攻击者已经利用它生成攻击脚本、钓鱼邮件,甚至伪造身份进行诈骗。"人工智能本身是否安全,会不会让网络更不安全? 腾讯安全研究认为,AIGC的风险主要集中在 "无法解释 "和 "无法追踪 "的特点上,但这在技术上是能够找到应对方法的。丁珂谈到,AIGC作为生产力的巨大提升,确实会带来更复杂的攻防态势和更大的防御难度。但任何新技术都要经历这样的周期。而法律法规也会随着技术的演进而不断更新,使新技术的发展更加规范和健全。 丁珂认为,随着我国网络安全法律法规体系的不断完善,合规性将给企业推进网络安全带来很大的推动力,并很直观地展现在需求端。未来,伴随着数据要素市场的建立或企业对数据价值的挖掘,也将带动数据安全市场的快速增长。 对于腾讯安全的商业逻辑和运营,丁珂表示,不谋求建立竞争壁垒,而是期望与生态共同发展,腾讯安全希望通过能力开放,实现安全与业务相伴的生态模式。 谈到未来,丁磊表示,安全领域已经进入加速发展期,在蓝海中会持续关注很多新的业务领域,希望孵化出新的商业模式,腾讯安全团队也会持续关注并抓住机会做好产品。 以下为采访实录(在不改变原意的基础上略有删减): 冲浪新闻:当前,以人工智能、大数据等新技术为驱动的第四次工业革命正向纵深推进,给人类生产生活带来深刻变革。而互联网作为新技术的载体,面临的安全挑战不仅数量越来越多,形式也越来越复杂。从互联网安全从业者的角度,腾讯观察到近年来国内外网络安全形势发生了哪些变化?这些变化呈现出怎样的趋势?
-
利用 PM2 实现高效的应用程序监控和管理
-
windows下进程间通信的(13种方法)-摘 要 本文讨论了进程间通信与应用程序间通信的含义及相应的实现技术,并对这些技术的原理、特性等进行了深入的分析和比较。 ---- 关键词 信号 管道 消息队列 共享存储段 信号灯 远程过程调用 Socket套接字 MQSeries 1 引言 ---- 进程间通信的主要目的是实现同一计算机系统内部的相互协作的进程之间的数据共享与信息交换,由于这些进程处于同一软件和硬件环境下,利用操作系统提供的的编程接口,用户可以方便地在程序中实现这种通信;应用程序间通信的主要目的是实现不同计算机系统中的相互协作的应用程序之间的数据共享与信息交换,由于应用程序分别运行在不同计算机系统中,它们之间要通过网络之间的协议才能实现数据共享与信息交换。进程间通信和应用程序间通信及相应的实现技术有许多相同之处,也各有自己的特色。即使是同一类型的通信也有多种的实现方法,以适应不同情况的需要。 ---- 为了充分认识和掌握这两种通信及相应的实现技术,本文将就以下几个方面对这两种通信进行深入的讨论:问题的由来、解决问题的策略和方法、每种方法的工作原理和实现、每种实现方法的特点和适用的范围等。 2 进程间的通信及其实现技术 ---- 用户提交给计算机的任务最终都是通过一个个的进程来完成的。在一组并发进程中的任何两个进程之间,如果都不存在公共变量,则称该组进程为不相交的。在不相交的进程组中,每个进程都独立于其它进程,它的运行环境与顺序程序一样,而且它的运行环境也不为别的进程所改变。运行的结果是确定的,不会发生与时间相关的错误。 ---- 但是,在实际中,并发进程的各个进程之间并不是完全互相独立的,它们之间往往存在着相互制约的关系。进程之间的相互制约关系表现为两种方式: ---- (1) 间接相互制约:共享CPU ---- (2) 直接相互制约:竞争和协作 ---- 竞争——进程对共享资源的竞争。为保证进程互斥地访问共享资源,各进程必须互斥地进入各自的临界段。 ---- 协作——进程之间交换数据。为完成一个共同任务而同时运行的一组进程称为同组进程,它们之间必须交换数据,以达到协作完成任务的目的,交换数据可以通知对方可以做某事或者委托对方做某事。 ---- 共享CPU问题由操作系统的进程调度来实现,进程间的竞争和协作由进程间的通信来完成。进程间的通信一般由操作系统提供编程接口,由程序员在程序中实现。UNIX在这个方面可以说最具特色,它提供了一整套进程间的数据共享与信息交换的处理方法——进程通信机制(IPC)。因此,我们就以UNIX为例来分析进程间通信的各种实现技术。 ---- 在UNIX中,文件(File)、信号(Signal)、无名管道(Unnamed Pipes)、有名管道(FIFOs)是传统IPC功能;新的IPC功能包括消息队列(Message queues)、共享存储段(Shared memory segment)和信号灯(Semapores)。 ---- (1) 信号 ---- 信号机制是UNIX为进程中断处理而设置的。它只是一组预定义的值,因此不能用于信息交换,仅用于进程中断控制。例如在发生浮点错、非法内存访问、执行无效指令、某些按键(如ctrl-c、del等)等都会产生一个信号,操作系统就会调用有关的系统调用或用户定义的处理过程来处理。 ---- 信号处理的系统调用是signal,调用形式是: ---- signal(signalno,action) ---- 其中,signalno是规定信号编号的值,action指明当特定的信号发生时所执行的动作。 ---- (2) 无名管道和有名管道 ---- 无名管道实际上是内存中的一个临时存储区,它由系统安全控制,并且独立于创建它的进程的内存区。管道对数据采用先进先出方式管理,并严格按顺序操作,例如不能对管道进行搜索,管道中的信息只能读一次。 ---- 无名管道只能用于两个相互协作的进程之间的通信,并且访问无名管道的进程必须有共同的祖先。 ---- 系统提供了许多标准管道库函数,如: pipe——打开一个可以读写的管道; close——关闭相应的管道; read——从管道中读取字符; write——向管道中写入字符; ---- 有名管道的操作和无名管道类似,不同的地方在于使用有名管道的进程不需要具有共同的祖先,其它进程,只要知道该管道的名字,就可以访问它。管道非常适合进程之间快速交换信息。 ---- (3) 消息队列(MQ) ---- 消息队列是内存中独立于生成它的进程的一段存储区,一旦创建消息队列,任何进程,只要具有正确的的访问权限,都可以访问消息队列,消息队列非常适合于在进程间交换短信息。 ---- 消息队列的每条消息由类型编号来分类,这样接收进程可以选择读取特定的消息类型——这一点与管道不同。消息队列在创建后将一直存在,直到使用msgctl系统调用或iqcrm -q命令删除它为止。 ---- 系统提供了许多有关创建、使用和管理消息队列的系统调用,如: ---- int msgget(key,flag)——创建一个具有flag权限的MQ及其相应的结构,并返回一个唯一的正整数msqid(MQ的标识符); ---- int msgsnd(msqid,msgp,msgsz,msgtyp,flag)——向队列中发送信息; ---- int msgrcv(msqid,cmd,buf)——从队列中接收信息; ---- int msgctl(msqid,cmd,buf)——对MQ的控制操作; ---- (4) 共享存储段(SM) ---- 共享存储段是主存的一部分,它由一个或多个独立的进程共享。各进程的数据段与共享存储段相关联,对每个进程来说,共享存储段有不同的虚拟地址。系统提供的有关SM的系统调用有: ---- int shmget(key,size,flag)——创建大小为size的SM段,其相应的数据结构名为key,并返回共享内存区的标识符shmid; ---- char shmat(shmid,address,flag)——将当前进程数据段的地址赋给shmget所返回的名为shmid的SM段; ---- int shmdr(address)——从进程地址空间删除SM段; ---- int shmctl (shmid,cmd,buf)——对SM的控制操作; ---- SM的大小只受主存限制,SM段的访问及进程间的信息交换可以通过同步读写来完成。同步通常由信号灯来实现。SM非常适合进程之间大量数据的共享。 ---- (5) 信号灯 ---- 在UNIX中,信号灯是一组进程共享的数据结构,当几个进程竞争同一资源时(文件、共享内存或消息队列等),它们的操作便由信号灯来同步,以防止互相干扰。 ---- 信号灯保证了某一时刻只有一个进程访问某一临界资源,所有请求该资源的其它进程都将被挂起,一旦该资源得到释放,系统才允许其它进程访问该资源。信号灯通常配对使用,以便实现资源的加锁和解锁。 ---- 进程间通信的实现技术的特点是:操作系统提供实现机制和编程接口,由用户在程序中实现,保证进程间可以进行快速的信息交换和大量数据的共享。但是,上述方式主要适合在同一台计算机系统内部的进程之间的通信。 3 应用程序间的通信及其实现技术 ---- 同进程之间的相互制约一样,不同的应用程序之间也存在竞争和协作的关系。UNIX操作系统也提供一些可用于应用程序之间实现数据共享与信息交换的编程接口,程序员可以通过自己编程来实现。如远程过程调用和基于TCP/IP协议的套接字(Socket)编程。但是,相对普通程序员来说,它们涉及的技术比较深,编程也比较复杂,实现起来困难较大。 ---- 于是,一种新的技术应运而生——通过将有关通信的细节完全掩盖在某个独立软件内部,即底层的通讯工作和相应的维护管理工作由该软件内部来实现,用户只需要将通信任务提交给该软件去完成,而不必理会它的具体工作过程——这就是所谓的中间件技术。 ---- 我们在这里分别讨论这三种常用的应用程序间通信的实现技术——远程过程调用、会话编程技术和MQSeries消息队列技术。其中远程过程调用和会话编程属于比较低级的方式,程序员参与的程度较深,而MQSeries消息队列则属于比较高级的方式,即中间件方式,程序员参与的程度较浅。 ---- 4.1 远程过程调用(RPC)
-
利用Alist和Docker容器,轻松实现小雅xiaoya资源的灵活挂载与管理
-
金融科技的高效省力秘籍:打造全面连接、全景覆盖、智能化的数字化运营体系" - 当下金融科技运营:挑战与机遇共存的时代解读 在快速发展的数字技术和企业数字化转型的大背景下,中国金融科技产业步入了提质增效的新阶段。面对市场的起伏变革与不确定性,金融机构需积极拥抱创新,灵活运用新技术,确保在竞争激烈的市场环境中稳固立足。 - 面临的双重考验: 1. 技术迭代压力:持续跟进行业内的科技革新,掌握新兴工具和平台,时刻应对瞬息万变的市场需求是金融科技运营的一大挑战。 2. 安全与隐私挑战:伴随着网络安全风险加剧和数据泄漏频发,如何强化信息安全体系、防范攻击、维护客户资金及隐私安全显得尤为重要。同时,伴随金融科技公司崛起,个人隐私权保障愈发关键。 - 喜人的发展空间: 1. 提升运营效益与降低成本:借助数字化技术,实现流程自动化、信息整合以及数据分析等,有效提升工作效能并缩减运营成本。 2. 扩大市场份额与增收途径:利用数字化手段拓宽销售渠道,优化用户体验,吸引更多用户并带动收入增长。 3. 加强客户联系与提升满意度:通过数字化科技运营,企业能更好地与客户互动沟通,增强客户信任感与忠诚度。 - 构建金融科技降本增效的核心驱动力:实施“全感知、全链接、全场景、智能”的科技运营体系升级路径
-
移动云加强全方位云网保护,守护数字中国发展 - 新增云安全中心涵盖终端安全,整合EDR的查杀、预警、应对及溯源功能,实现终端安全管理一体化。它能迅速定位并处理各类网络威胁,如病毒、入侵和新漏洞,减少人工应对负担。EDR在HVV行动中是关键防护,能在终端建立坚固防线,阻止威胁扩散,并协同其他产品追踪攻击链路。 态势感知全面覆盖监控、审计、运维、评估和预警等多个方面,针对混合云环境,提供统一业务安全管理、全面安全信息收集、智能安全事件关联分析以及系统性能与可用性的全面检测,满足等保标准、安全运营、数据保护和重要时期的保障需求。 云堡垒机推出全新混合云版本,支持混合云、私有云及客户自建平台部署,专为运维资源管理和审计提供安全保障。安全资源池行业版则针对于私有云和行业云,提供定制化的场景化安全合规整体解决方案,并可根据需要提供改造、统一管理、远程更新等一系列配套服务。 共同构建安全、便捷且高效的远程办公环境。
-
小米的运维架构服务:利用Open-Falcon进行高效监控与管理
-
在React和Vue中,我们是如何玩转router的? - 使用HTML5 History API,React Router利用pushState和replaceState方法在不刷新页面的情况下管理导航历史。它像这样工作: 1. 当URL发生变化时,React Router悄悄地“监听”浏览器地址栏的改动,主要通过popstate事件来察觉url更改。 2. 随着URL的变化,Router会对照预先设定好的JavaScript路由配置对象,依据一套规则找出与当前URL匹配的路径。 3. 一旦找到合适的路线,React Router就会如魔法般地渲染相应的组件到网页上,从而实现了页面内容的实时更新。让我们来看一个React Router实际运用的例子。
-
玩转Java底层:JMX详解 - jconsole与自定义MBean监控工具的实际应用与区别" 在日常JVM调优中,我们熟知的jconsole工具通过JMX包装的bean以图形化形式展示管理数据,而像jstat和jmap这类内建监控工具则由JVM直接支持。本文将以jconsole为例,深入讲解其实质——基于JMX的MBean功能,包括可视化界面上的bean属性查看和操作调用。 MBeans在jconsole中的体现是那些可观察的组件属性和方法,如上图所示,通过名为"Verbose"的属性能看到其值为false,同时还能直接操作该bean的方法,例如"closeJerryMBean"。 尽管jconsole给我们提供了直观的可视化界面,但请注意,这里的MBean并非固定不变,开发者可根据JMX提供的接口将自己的自定义bean展示到jconsole。以下步骤展示了如何创建并注册一个名为"StudyJavaMBean"的自定义MBean: 1. 首先定义接口`StudyJavaMBean`,接口需遵循MBean规范,即后缀为"MBean"且包含getter方法代表属性,如`getApplicationName`,和无返回值的setter方法代表操作,如`closeJerryMBean`。 ```java public interface StudyJavaMBean { String getApplicationName(); void closeJerryMBean(); } ``` 2. 编写接口的实现类`StudyJavaMBeanImpl`,实现接口中的方法: ```java public class StudyJavaMBeanImpl implements StudyJavaMBean { @Override public String getApplicationName() { return "每天学Java"; } @Override public void closeJerryMBean() { System.out.println("关闭Jerry应用"); } } ``` 3. 在代码中注册自定义MBean,涉及的关键步骤包括: - 获取平台MBeanServer - 定义ObjectName,指定唯一的MBean标识符 - 注册MBean到服务器 - 启动RMI连接器服务,以便jconsole能够访问 ```java public void registerMBean() throws Exception { // ... 具体实现省略 ... } ``` 实际运行注册后的MBean,您将在jconsole中发现并查看自定义bean的属性和调用相关方法。然而,这种方式相较于传统的属性/日志查看和HTTP接口,实用性相对有限,可能存在潜在的安全风险。但不可否认的是,JMX及其MBean机制对于获取操作系统信息、内存状态等关键性能指标仍然具有重要价值。例如: 1. **获取操作系统信息**:通过JMX MBean,可以直接获取到诸如CPU使用率、操作系统版本等系统级信息,这对于资源管理和优化工作具有显著帮助。