Java 技 术 专 区 技 术 播 客 系 列 : 第 4 季 Jeff Kunkle 深 入 讲 解 Node.js 播 出 日 期 :2012 年 4 月 27 日 GLOVER: 我 是 Andy Glover, 这 里 是 developerworks Java 技 术 播 客 系 列 这 一 次 的 特 邀 嘉 宾 是 Jeff Kunkle 他 是 Near Infinity 的 移 动 解 决 方 案 总 监, 最 近 我 参 加 了 在 华 盛 顿 特 区 举 行 的 会 议 Ruby Nation,Jeff 在 那 里 发 表 了 关 于 Node.js 的 演 讲 我 想 演 讲 的 题 目 可 能 是 What is Node.js( 什 么 是 Node.js), 或 者 类 似 的 题 目? KUNKLE: 是 的,Node.js Explained( 解 释 Node.js) GLOVER: 原 来 是 Node.js Explained 很 显 然, 在 该 演 讲 中,Jeff 很 好 地 概 述 了 什 么 是 Node.js 所 以 我 走 到 他 身 边, 我 说, 这 将 会 很 棒 您 愿 意 在 播 客 上 聊 聊 它 吗?Jeff, 欢 迎 来 到 这 个 播 客 让 我 们 了 解 一 下 什 么 是 Node.js? KUNKLE: 是 的, 你 知 道 我 决 定 做 一 个 讲 解 演 示, 因 为 有 很 多 您 会 看 到 很 多 关 于 Node.js 的 炒 作, 我 猜, 就 像 不 久 前 的 Ruby on Rails 那 样 GLOVER: 对 KUNKLE: 关 于 它 是 什 么, 有 很 多 错 误 的 观 念 和 误 解, 所 以 我 认 为, 对 什 么 是 Node 做 一 个 基 本 的 介 绍 会 非 常 有 用 在 它 的 核 心, 它 是 一 个 JavaScript 运 行 时, 针 对 联 网 应 用 程 序 的 构 建 进 行 了 高 度 的 调 优 所 以 或 许 可 将 它 用 于 构 建 Web 应 用 程 序, 或 者 构 建 一 个 连 接 到 后 端 系 统 的 RESTful API, 或 任 何 东 西 我 的 意 思 是, 有 人 构 建 过 DNS 服 务 器 DHCP 服 务 器 聊 天 服 务 器, 以 及 任 何 一 种 联 网 的 产 品, 这 些 人 能 很 好 地 适 应 它 这 其 实 是 因 为 它 以 非 阻 塞 I/O 的 完 整 概 念 为 基 础 GLOVER: 对, 对 是 的, 让 我 们 再 深 入 探 讨 一 下 请 说 得 更 详 细 一 点, 因 为 听 众 可 能 刚 刚 接 触 Node, 您 提 到 它 是 JavaScript, 并 且 JavaScript 一 直 都 存 在, 对 不 对? 所 以, 它 一 直 是 -1
您 编 写 表 单 验 证 的 语 言, 对 不 对? 但 显 然, 情 况 已 经 不 是 这 样 了, 但 我 敢 肯 定 有 些 人 喜 欢, 是 的, 我 恨 那 个 小 小 的 弹 出 窗 口, 告 诉 我 要 输 入 正 确 的 电 话 号 码 什 么 的 那 么, 好 的 为 什 么 它 现 在 成 为 了 联 网 应 用 程 序 的 热 门 首 选? KUNKLE: 这 很 有 意 思 我 的 感 觉 是, 虽 然 JavaScript 过 去 一 直 备 受 非 议, 但 现 在 更 像 是 享 受 它 的 文 艺 复 兴 时 期 GLOVER: 绝 对 是 的 KUNKLE: 你 知 道, 我 还 记 得 在 JavaScript 中 苦 苦 挣 扎, 让 人 非 常 生 气 的 日 子, 但 特 别 是 在 使 用 Node 的 时 候, 情 况 还 不 算 太 糟 糕, 因 为 我 觉 得 所 遇 到 的 一 些 困 难, 是 有 一 大 堆 不 同 的 实 现 对 吧? 您 会 有 微 软 针 对 IE 浏 览 器 完 成 的 实 现, 然 后 有 Mozilla 的 实 现 并 且 Node 更 好 一 点, 因 为 它 永 远 只 有 一 个 实 现, 就 是 V8 Google 的 V8 JavaScript 引 擎 其 实 是 面 向 Node 的 平 台 让 情 况 变 得 有 趣 的 是,Node 的 创 建 者 基 本 确 定 了 他 们 试 图 解 决 的 根 本 问 题 是, 有 大 量 I/O 的 应 用 程 序 要 等 待 很 长 时 间, 对 吧? 所 以 基 本 理 论 是, 虽 然 可 能 有 大 量 的 CPU 周 期 用 于 处 理, 但 从 旋 转 的 磁 盘 上 读 取 数 据, 或 者 建 立 数 据 库 网 络 连 接, 或 者 调 用 一 些 其 他 服 务 的 外 部 API 所 需 的 时 间 量 要 远 远 超 过 它 们 所 以 人 们 的 想 法 就 是, 能 否 更 多 地 采 取 事 件 触 发 的 模 式, 有 点 像 在 浏 览 器 中 已 经 习 惯 的 方 式, 对 不 对? 将 事 件 附 加 到 页 面 上 的 不 同 元 素, 并 在 发 生 某 个 事 件 的 某 个 时 间 点 回 调 代 码 这 里 也 适 用 同 样 的 概 念 例 如, 您 可 能 有 一 个 Web 服 务 器, 并 且 您 将 编 写, 基 本 上 是 在 Node 中 将 一 个 函 数 传 递 给 Web 服 务 器 代 码, 每 当 连 接 建 立 时 就 回 调 它 -2
GLOVER: 我 真 的 很 喜 欢 您 的 这 部 分 演 示, 虽 然 在 所 谓 的 vidcast( 视 频 播 客 ) 或 类 似 的 东 西 中 可 以 看 到 演 示, 但 在 播 客 中 却 不 能 看 到, 这 真 是 太 糟 糕 了 但 是 由 于 有 事 件 触 发 和 I/O 等 内 容, 所 以 传 统 的 模 式 可 能 有 助 于 比 较, 那 么, 它 有 什 么 不 同 呢, 比 方 说, 如 果 我 实 现 了 一 个 Web 服 务 器, 假 设 是 Java 或 类 似 的 东 西? KUNKLE: 是 的, 在 Java 中, 如 果 您 我 想 较 大 的 区 别 是 如 何 扩 展, 对 吧? GLOVER: 好 的 KUNKLE: 有 一 件 事 我 没 有 提 到, 使 用 Node 时, 它 是 单 个 流 程 它 不 仅 是 单 个 流 程, 它 还 是 单 个 线 程 所 以, 代 码 总 是 在 一 个 线 程 上 运 行 因 此, 它 其 实 利 用 了 I/O 已 经 完 成 的 优 势 你 知 道, 远 远 超 过 实 际 执 行 处 理 的 CPU 时 间 这 是 很 重 要 的 原 因 是, 在 Node 中, 每 当 等 待 I/O 时, 其 实 是 在 等 待 要 读 取 的 文 件, 或 等 待 一 个 网 络 连 接, 所 有 这 一 切 都 被 放 进 一 个 背 景 线 程 池, 或 者 它 使 用 操 作 系 统 的 一 些 本 地 异 步 API 然 后 主 线 程 被 释 放, 这 是 真 正 用 来 做 某 件 事 的 一 个 线 程, 让 它 可 完 成 更 多 的 计 算 工 作, 也 许 接 受 另 一 个 网 络 连 接, 执 行 一 些 处 理 然 后, 只 要 它 需 要 执 行 任 何 形 式 的 I/O, 它 在 后 端 会 再 一 次 离 开, 而 该 线 程 则 再 次 可 用 那 么, 在 节 点 中 处 理 扩 展 的 方 式 其 实 有 两 种, 对 吧? 因 此, 第 一 种 方 式 的 概 念 是, 这 个 线 程 有 大 部 分 时 间 用 于 等 待 I/O, 如 果 可 以 将 它 推 迟 到 Node 层, 一 个 线 程 能 够 做 比 原 来 更 多 的 工 作 在 Java 模 型 中, 如 果 我 们 准 备 扩 展 Java 模 型, 该 如 何 进 行 扩 展 呢? 我 们 用 多 个 线 程 实 现 扩 展 我 们 必 须 创 建 很 多 不 同 的 线 程 才 能 处 理 多 个 连 接 大 部 分 时 间, 这 些 -3
线 程 都 在 等 待 它 们 在 等 待 数 据 库 查 询, 它 们 在 等 待 读 取 文 件, 登 出 到 文 件 所 以 它 们 在 等 待 那 个 I/O 发 生, 它 们 无 法 服 务 任 何 其 他 请 求 ; 只 是 必 须 等 待 这 是 Node 有 根 本 性 区 别 的 地 方, 它 不 会 锁 定 正 在 等 待 I/O 的 线 程 ; 反 而 会 委 派 该 线 程 到 一 个 内 部 节 点 层, 然 后 该 线 程 就 可 以 处 理 下 一 个 请 求 之 后 一 旦 需 要 I/O, 就 把 它 推 入 内 部 节 点 层 处 理 另 一 个 请 求 GLOVER: 所 以 在 节 点 中 采 用 这 种 模 型, 而 您 的 Node 代 码, 假 设 有 一 些 东 西 要 和 数 据 库 通 信, 对 不 对? 那 么 就 会 有 一 些 I/O, 它 会 等 待, 我 喜 欢 这 种 方 式, 我 在 自 己 的 脑 海 中 设 想,Node 说, 好, 这 件 事 情 正 在 等 待, 那 我 们 先 把 它 放 在 一 边 KUNKLE: 对 GLOVER: 然 后, 我 回 去 开 始 处 理 请 求 在 某 个 时 间 点, 数 据 库 返 回 数 据 了, 或 者 I/O 完 成 了 结 果 集 从 数 据 库 回 来 了 现 在, 如 何 回 到 主 线 呢? KUNKLE: 好 在 Node 中, 如 果 看 一 下 任 何 形 式 的 代 码 示 例 或 花 点 时 间 去 编 程, 就 会 很 熟 悉 这 一 点, 也 就 是 所 调 用 的 很 多 方 法, 尤 其 是 与 I/O 有 关 的 方 法, 几 乎 总 是 会 传 递 一 个 函 数, 当 I/O 完 成 时, 会 回 调 该 函 数 基 本 上, 在 Node 中 发 生 的 事 情 是, 有 一 个 事 件 循 环 的 概 念, 一 个 单 线 程 事 件 循 环 然 后 有 一 个 事 件 队 列, 每 次 从 队 列 中 提 取 一 个 事 件 如 果 您 打 算 执 行 I/O 它 将 由 线 程 池 处 理 最 终 当 该 I/O 返 回 时, 在 执 行 I/O 时 最 初 所 传 递 的 函 数 被 回 调, 然 后 被 放 回 事 件 队 列, 最 终 被 处 理 掉, 并 利 用 I/O 操 作 的 结 果 完 成 实 际 的 执 行 工 作 -4
GLOVER: 我 明 白 了 我 明 白 了 事 件 触 发 的 I/O 和 事 件 循 环 这 个 概 念, 它 对 于 Node 并 不 是 新 东 西, 对 不 对? 我 的 意 思 是, 还 有 其 他 实 施, 如 Ruby 中 的 Event Machine 或 类 似 的 东 西? 我 的 意 思 是, 还 有 其 他 库, 对 吧? KUNKLE: 是 的, 几 乎 每 种 平 台 都 有 一 些 库 以 这 种 方 式 工 作 像 您 所 说 的, 在 Ruby 中 有 Event Machine 我 敢 肯 定 在 Java 中 也 有 一 个 ; 很 抱 歉, 我 实 际 上 不 知 道 它 是 什 么 我 们 也 会 在 任 何 一 种 用 户 界 面 框 架 中 经 常 看 到 这 种 模 式 我 们 谈 到 在 JavaScript 中, 在 您 的 浏 览 器 中, 这 里 也 有 相 同 的 模 型 还 有 浏 览 器 使 用 单 一 线 程 进 行 处 理, 所 以 有 事 件 触 发 的 回 调 现 在, 如 果 您 从 事 过 ios 编 程, 也 会 看 到 它, 它 们 有 一 个 事 件 循 环, 实 际 上 称 为 运 行 循 环, 也 是 同 样 的 概 念 在 ios 中, 也 可 以 有 线 程, 但 总 是 会 有 事 件 循 环 这 个 概 念 这 是 可 以 对 用 户 界 面 实 际 执 行 任 何 类 型 更 新 操 作 的 唯 一 线 程 所 以, 是 的, 它 已 经 存 在 一 段 时 间 了 让 Node 略 有 不 同 的 因 素 是 涉 及 到 事 件 循 环 时, 让 我 们 以 Ruby 的 Event Machine 为 例 有 一 件 不 同 的 事 情, 从 一 开 始, Node 的 创 建 者 [Ryan Dahl 其 实 是 原 创 者 ; 现 在 该 项 目 实 际 上 是 由 一 家 名 为 Juliant 的 公 司 拥 有 ] 决 定 从 一 开 始, 一 切, 所 有 的 I/O, 从 一 开 始 就 是 异 步 的 所 以 不 同 的 方 面 在 于, 虽 然 与 Ruby 中 的 Event Machine 类 似, 但 为 了 真 正 执 行 事 件 循 环, 并 实 现 异 步 I/O, 使 用 Event Machine 的 人 实 际 上 必 须 编 写 自 己 的 API 来 实 现 文 件 系 统 访 问 网 络 连 接, 因 为 那 些 在 Ruby 中 都 不 是 异 步 的 GLOVER: 我 明 白 了 我 明 白 了 KUNKLE: 所 以, 很 容 易 就 会 让 自 己 陷 入 麻 烦, 如 果 您 在 Event Machine 应 用 中 要 做 点 什 么 事 情, 又 碰 巧 使 用 在 某 个 地 方 找 到 的 GEM, 而 您 很 可 能 根 本 没 有 想 到, 哦, 它 做 I/O 吗, 如 果 做, 它 是 异 步 的 吗? -5
因 为 如 果 它 不 是 异 步 的, 那 么 您 真 的 是 在 自 找 麻 烦, 因 为 会 阻 塞 正 在 运 行 的 唯 一 线 程 GLOVER:[ 大 笑 ] KUNKLE: 而 它 正 在 进 行 异 步 操 作 GLOVER: 对, 我 记 得 其 实 在 我 们 都 参 加 的 同 一 个 会 议 中, 也 许 是 您, 有 一 个 关 于 Event Machine 的 演 讲, 或 者 是 有 人 提 出 这 个 话 题, 但 我 很 抱 歉, 它 是 一 个 SPDE 演 示, 他 提 到, 是 的, 当 您 如 果 您 构 建 一 个 Web 应 用 程 序, 假 设 使 用 Event Machine, 最 好 确 保 自 己 使 用 Event Machine 的 HTTP 请 求 和 响 应, 您 的 观 点 就 是 这 个, 对 不 对, 因 为 它 不 得 不 重 [ 写 ] 所 有 的 东 西 KUNKLE: 哦, 是 的, 不 那 样 做 其 实 很 容 易, 特 别 是 如 果 您 已 经 使 用 Ruby 编 程 很 长 一 段 时 间 了 你 知 道, 使 用 某 些 API 可 以 说 是 第 二 天 性 GLOVER: 好 的, 那 么, 事 件 触 发 的 库 和 事 件 触 发 的 理 论 以 及 实 施, 就 像 您 说 的, 绝 对 不 是 新 东 西 事 实 上, 您 提 到 了 ios, 为 不 熟 悉 ios 的 听 众 解 释 一 下, 这 是 iphone, 或 ipad 它 以 Objective-C 为 基 础, 比 我 们 所 有 人 加 起 来 都 老, 对 吧? 但 其 实 不 是 的 那 么, 为 什 么 Node 如 此 流 行 呢? 我 的 意 思 是, 它 是 JavaScript, 它 也 跟 我 们 所 有 人 加 起 来 一 样 老, 对 吧? 我 的 意 思 是, 它 只 是, 正 如 您 所 说, 有 很 多 炒 作 如 果 您 抛 去 所 有 的 炒 作, 实 际 上 存 在 一 些 实 质 的 东 西, 对 不 对? 很 显 然, 我 的 意 思 是, 你 们 都 用 它 是 什 么 让 它 如 此 流 行 呢? KUNKLE: 我 想 原 因 可 能 很 多, 这 可 能 是 一 个 范 围 很 大 的 问 题 但 我 认 为 有 几 个 因 素 起 了 作 用, 一 个 是, 它 实 际 上 是 JavaScript, 因 此 大 多 数 开 发 人 员, 特 别 是 那 些 在 Web 上 做 过 一 些 事 情 的 任 何 开 发 人 员 都 已 经 了 解 JavaScript 所 以, 它 这 是 一 个 新 平 台, 但 实 际 上 并 不 需 要 学 习 新 的 语 言 事 实 上, 在 您 谈 到 的 我 所 做 的 演 示 中, 其 中 一 个 标 志 其 实 是, -6
它 有 一 个 相 当 短 的 学 习 曲 线, 因 为 一 旦 您 理 解 了 事 件 触 发 的 模 型, 以 及 Node 如 何 利 用 事 件 循 环 和 单 线 程 处 理 该 模 型, 就 已 经 知 道 了 语 言 其 实 要 做 的 只 是 搞 清 楚 新 的 API GLOVER: 是 的, 没 错 KUNKLE: 所 以, 这 是 一 个 新 方 法, 有 更 多 优 点, 当 我 们 谈 论 HTML5 以 及 WebSockets 等 技 术, 并 试 图 有 更 多 交 互 式 更 多 实 时 或 近 乎 实 时 的 应 用 程 序 时, Node 似 乎 非 常 适 合, 您 可 以 在 Node 中 获 得 大 量 的 短 时 突 发 连 接, 实 现 扩 展 而 实 际 上 它 已 建 立 了 相 当 大 的 社 区 人 们 已 经 开 发 了 数 千 个 被 称 为 MPM 的 模 块, 这 是 他 们 的 包 管 理 器, 他 们 的 Nodes 包 管 理 器 它 其 实 在 Windows 上 运 行, 而 且 我 相 信, 如 果 我 没 有 记 错, 微 软 实 际 上 投 入 了 大 量 资 金 和 开 发 人 员 来 使 它 在 Windows 上 运 行 GLOVER: 是 的, 事 实 上, 我 觉 得 我 读 了 一 些 关 于 Azure 的 文 章, 我 想 我 的 发 音 是 正 确 的, 但 微 软 的 云 平 台 实 际 上 也 支 持 Node KUNKLE: 是 的, 可 以 在 它 上 面 运 行 Node 而 很 多 人 都 在 考 虑 使 用 这 样 的 模 型, 在 真 正 单 个 线 程 中 以 这 种 事 件 驱 动 的 模 型 作 为 扩 展 的 方 式, 因 为 它 确 实 简 化 了 并 发 性, 因 为 每 次 只 能 执 行 一 个 线 程, 不 会 发 生 任 何 死 锁, 没 有 两 个 线 程 访 问 任 何 共 享 的 状 态 所 以, 您 根 本 不 必 考 虑 怎 么 做 线 程 编 程 GLOVER: 所 以, 我 想 这 正 是 您 要 说 的, 显 然 会 有 人 接 下 来 会 讲 一 下 Node 的 优 缺 点, 对 吧? 有 些 缺 点 已 经 被 提 出 来 了, 我 觉 得 都 是 围 绕 这 个 概 念 我 记 得 有 一 个 很 好 的 博 客 被 广 泛 报 导,Node 是 肿 瘤, 是 吗? KUNKLE: 是 的 Node.js 是 肿 瘤 GLOVER: 因 此, 很 多 论 点 可 能 以 此 为 前 提, 只 有 一 个 线 程 它 如 何 扩 展, -7
对 吧? 我 的 意 思 是, 听 起 来 挺 吓 人 的 KUNKLE: 是 的 我 的 意 思 是, 如 果 真 的 打 算 扩 展 它, 您 不 会 只 运 行 一 个 节 点 至 少 我 不 会 只 运 行 一 个 节 点 所 以, 首 先 必 须 非 常 小 心, 不 要 做 CPU 密 集 型 的, 让 CPU 熄 火 的 任 何 事 情, 因 为 这 样 会 阻 止 接 受 每 一 个 未 来 的 连 接 但 Node 也 有 一 个 模 块 嗯, 其 实 有 几 个 不 同 的 方 法 来 处 理 多 进 程 的 执 行 因 此, 其 中 一 个 模 块 我 想, 我 不 知 道 是 否 应 称 它 为 模 块, 因 为 它 是 内 置 的, 但 我 们 实 际 上 用 得 相 当 多 的 一 个 功 能 是 它 的 集 群 库 集 群 库 允 许 您 做 的 事 情 是 创 建 可 以 共 享 相 同 文 件 描 述 符 的 多 个 子 进 程 这 让 您 可 以, 假 设 您 在 一 台 八 核 计 算 机 上 运 行, 就 可 以 在 8 个 应 用 程 序 的 实 际 实 例 上 开 始, 它 们 可 以 共 享 同 一 个 端 口 那 么, 对 于 节 点 内 部 的 连 接, 就 在 8 个 同 时 执 行 但 基 本 上 独 立 的 运 行 循 环 之 间 取 得 平 衡 所 以 可 以 有 多 个 实 例 这 更 像 Ruby 模 型 的 缩 放, 您 有 多 个 进 程, 而 不 是 在 一 个 进 程 中 有 多 个 线 程 GLOVER: 我 明 白 了 KUNKLE: 但 做 到 这 一 点 并 不 是 非 常 困 难 事 实 上, 一 个 集 群 模 块 使 这 些 进 程 间 的 通 信 变 得 非 常 容 易 它 们 有 一 个 内 置 的 消 息 传 递 功 能, 能 够 跨 进 程 通 信 GLOVER: 哇, 有 意 思 在 谈 到 MPM 和 这 个 集 群 库 模 块 时, 您 也 暗 示 过 有 数 千 个 MPM 和 包 就 像 有 数 千 个 JAR 和 数 千 个 GEM 一 样 KUNKLE:GEM 和 JAR 的 数 量 可 能 比 包 的 数 量 多 得 多 GLOVER: 是 的 我 的 意 思 是, 假 设 有 数 百 万 个 吧 -8
但 有 些 是 知 名 的, 对 吧? 我 是 说, 每 一 位 Java 开 发 人 员 都 知 道 Hibernate 或 Tomcat 或 类 似 的 内 容, 对 不 对? 每 一 位 Ruby 开 发 人 员 都 知 道 Rails 在 Node 世 界 中, 流 行 的 库 有 哪 些? 如 果 我 打 算 深 入 了 解 Node, 需 要 知 道 些 什 么? 现 在 应 该 从 哪 里 开 始? KUNKLE: 实 际 上, 种 类 繁 多, 而 且 要 视 具 体 情 况 而 定 人 们 用 Node 完 成 很 多 不 同 的 事 情 我 感 觉 在 我 接 触 Node 之 前, 我 完 成 了 大 量 Ruby 工 作 编 写 Ruby 程 序 时, 您 认 为 我 在 做 什 么 呢? 我 在 写 Web 应 用 程 序, 几 乎 总 是 编 写 Web 应 用 程 序 所 以 我 不 认 为 Node 也 是 如 此 人 们 肯 定 在 编 写 Web 应 用 程 序, 但 我 不 认 为 它 是 那 么 偏 重 于 Web 应 用 程 序 所 以, 会 有 多 种 流 行 的 GEM 现 在, 当 然 如 果 您 想 使 用 Web 框 架 路 线, 还 有 对 不 起, 我 将 它 们 称 为 GEM, 是 吧? GLOVER: 是 的 MPM [ 大 笑 ] KUNKLE: 是 的 对 于 Node 而 言, 我 认 为 Express 可 能 是 目 前 最 流 行 的 Web 框 架, 如 果 您 进 行 过 Ruby 开 发, 它 非 常 像 Sinatra 我 不 熟 悉, 可 能 是 Java 有 一 些 东 西 更 像 它 GLOVER: 是 的, 有 一 个 项 目 叫 Gretty Getty 算 是 基 于 Groovy Sinatra 的 还 有 另 一 个, 我 想 它 的 名 称 是 Rat Pack 的 确 是 有 一 些 Java 等 价 物 是 的 KUNKLE: 是 的, 就 是 这 样 那 么, 它 就 与 那 些 项 目 相 似 开 始 进 行 Node 开 发 时, 您 会 发 现 另 一 件 事 情, 有 很 多 回 调 要 传 递 给 I/O 操 作, 对 吧? 您 到 处 传 递 函 数, 因 为 它 们 需 要 在 之 后 I/O 返 回 时 被 回 调 您 很 快 就 会 有 一 大 堆 嵌 套 函 数, 尤 其 是 有 如 果 您 必 须 有, 好, 那 么 我 需 要 读 取 这 个 文 件, 完 成 之 后 返 回 结 果, 然 后 我 需 要 向 外 请 求 一 些 其 他 端 点 API 在 我 从 那 里 获 得 结 果 后, 我 要 做 其 他 事 情 那 么, -9
这 看 起 来 像 什 么? 您 现 在 有 三 个 嵌 套 函 数 回 调, 对 不 对? 因 此, 有 一 些 库 帮 助 您 我 想, 可 以 帮 您 处 理 这 件 事, 使 它 看 起 来 更 好 一 点 我 经 常 使 用 的 一 个 库 叫 Asynch GLOVER:Asynch, 好 KUNKLE: 很 多 人 用 过 Step 我 只 是 不 熟 悉 它 但 是, 在 您 使 用 Node 时, 这 两 者 都 非 常 有 帮 助, 可 让 您 避 免 这 个 嵌 套 函 数 的 问 题 GLOVER: 好 的 KUNKLE: 我 还 会 提 到 两 个 或 三 个 其 他 有 趣 的 库 Socket.IO 基 本 上 是 在 浏 览 器 和 服 务 器 之 间 进 行 WebSockets 的 一 个 库, 但 它 做 得 非 常 聪 明 如 果 浏 览 器 连 接 实 际 上 不 支 持 WebSockets, 它 将 回 退, 并 执 行 像 长 轮 询 这 样 的 操 作 它 将 尝 试 在 浏 览 器 和 服 务 器 之 间 保 持 这 种 持 久 连 接, 使 用 从 浏 览 器 提 供 的 任 意 最 佳 技 术 GLOVER: 实 际 上 这 是 为 那 些 不 熟 悉 WebSockets 的 听 众 简 单 介 绍 一 下 它 KUNKLE: 对 所 以,WebSockets 是, 想 象 一 下, 我 们 习 惯 了 在 创 建 Web 应 用 程 序 时, 我 们 有 请 求 / 响 应 模 式 我 们 的 浏 览 器 发 出 一 个 请 求, 它 得 到 一 个 响 应, 这 就 大 功 告 成 了 在 之 后 的 某 个 时 间 点, 我 们 发 出 另 一 个 请 求, 我 们 得 到 一 个 响 应, 同 样 就 大 功 告 成 了 但 让 它 真 的 很 难 做 的 是, 让 服 务 器 主 动 向 浏 览 器 发 送 东 西 在 WebSockets 的 世 界 中, 想 象 一 个 请 求 / 响 应 周 期 从 来 没 有 完 成 它 只 是 保 持 打 开 因 此, 在 任 何 时 间 点, 服 务 器 都 可 以 主 动 发 送 东 西 给 浏 览 器, 浏 览 器 可 以 接 收 它 它 不 必 您 不 必 每 过 一 段 时 间 就 求 助 于 浏 览 器 轮 询 来 看 看 服 务 器 是 否 有 什 么 事 要 告 诉 它 们, 因 为 它 有 一 个 实 时 连 接 -10
GLOVER: 对, 所 以 它 好 吧 它 是 浏 览 器 和 服 务 器 之 间 的 双 向 开 放 式 套 接 字 KUNKLE: 是 的 GLOVER: 一 个 推 送 模 型 您 在 前 面 提 到 了 长 轮 询 KUNKLE: 长 轮 询, 是 的, 它 的 概 念 其 实 是, 浏 览 器 会 定 期 轮 询 服 务 器 可 能 要 发 送 给 它 的 事 件, 服 务 器 仅 仅 是 不 响 应 一 段 时 间 其 概 念 是, 浏 览 器 要 等 待 一 个 响 应 但 服 务 器 将 不 响 应 一 段 时 间, 它 在 等 待, 看 看 它 是 否 有 东 西 想 发 送 给 浏 览 器 GLOVER: 明 白 WebSockets 有 趣 的 地 方 是, 它 似 乎 会 避 免, 也 许, 在 某 些 应 用 程 序 中, 如 果 您 正 确 地 使 用 它, 它 会 避 免 Ajax, 对 不 对? 您 其 实 不 需 要 Ajax KUNKLE: 是 的, 您 绝 对 可 以 不 需 要 Ajax 我 可 能 会 继 续 保 留 Ajax 调 用, 除 非 有 一 些 确 实 需 要 频 繁 更 新 的 东 西 GLOVER: 我 明 白 了 KUNKLE: 需 要 从 浏 览 器 初 始 化 它 时,Ajax 仍 然 是 非 常 好 的, 如 果 想 主 动 在 仪 表 板 中 显 示 指 标 或 者 图 表,WebSocket 真 的 很 好 使 用 类 似 WebSockets 的 技 术 将 使 服 务 器 很 容 易 发 送 出 不 断 更 新 的 指 标, 而 不 是 让 图 形 实 时 变 化 使 用 WebSockets 完 成 这 项 工 作 比 使 用 Ajax 要 好 得 多 GLOVER: 明 白 明 白 KUNKLE: 您 提 到 过 Socket.IO 是 一 个 很 好 的 Node 库, 我 想 您 会 再 告 诉 我 们 一 些 知 识 GLOVER: 是 的, 还 有 一 些 其 他 的 实 际 上, 我 在 Near Infinity 的 一 位 同 事 构 建 了 两 个 库, 我 认 为 相 当 有 意 思 一 个 叫 Persist, 有 点 像 一 个 ORM -11
框 架 在 Node 世 界 中,ORM 框 架 并 不 一 定 超 级 流 行, 但 同 样, 不 是 每 个 人 都 在 开 发 Web 应 用 程 序 但 它 真 的 是 我 见 过 的 最 好 的 框 架 另 一 个 也 相 当 有 趣, 尤 其 是 对 使 用 Java 的 人 来 说, 它 其 实 是 我 同 事 的 名 字, Joe Ferner, 他 写 了 一 个 名 为 Java 的 Node 包 您 可 以 就 叫 它 Java 您 真 正 可 以 做 的, 就 是 从 Node 内 部, 可 以 访 问 所 有 Java 运 行 时 库 和 所 需 的 任 何 其 他 JAR 基 本 上, 在 Node 内 启 动 Java 虚 拟 机, 就 可 以 调 用 各 种 方 法, 就 像 在 Java 中 调 用 它 们 一 样 这 就 是 它 有 趣 的 地 方, 您 不 仅 可 以 像 在 Java 中 一 样 调 用 它 们, 我 觉 得 Java 中 的 一 切 都 是 阻 塞, 对 吧? 您 永 远 不 会 在 Java 中 不 会 有 很 多 方 法 将 函 数 传 递 给 我 们 不 能 传 递 函 数, 您 可 以 传 递 一 个 匿 名 [ 内 部 类 ], 并 等 待 它 回 来 但 他 编 写 这 个 包 的 方 式 是, 任 何 Java 方 法 调 用 都 可 以 同 步 或 异 步 地 完 成 所 以 它 非 常 酷 所 以 如 果 想 尝 试 Node, 并 且 您 以 前 使 用 Java, 有 些 Java 库 是 您 无 法 离 开 的, 这 可 能 是 一 种 选 择, 可 以 说 弥 合 这 个 差 距, 您 可 以 利 用 Node 对 可 扩 展 性 的 承 诺, 并 且 仍 然 可 以 利 用 自 己 经 过 一 段 时 间 已 累 积 起 来 的 Java 投 资 GLOVER: 哇! 哇! 您 也 提 到 了 一 些 有 趣 的 测 试 框 架 KUNKLE: 是 的 测 试, 有 几 个 流 行 的 框 架 我 想 有 一 个 可 能 叫 Vows, 它 是 一 个 BDD 测 试 框 架, 可 能 是 最 流 行 的, 或 者 离 最 流 行 也 不 远 了 我 碰 巧 更 常 用 的 是 Mocha, 它 非 常 类 似 于 Ruby 的 [R Spec], 另 一 种 BDD 类 型 的 测 试 框 架 您 会 看 到 使 用 相 同 的 术 语 进 行 描 述, 以 及 与 其 类 似 的 东 西 Vows 更 -12
结 构 化 一 点, 它 强 迫 您 以 特 定 方 式 做 事 我 想 很 多 人 都 认 为 这 是 一 个 很 好 的 编 程 模 型 对 我 来 说, 我 刚 刚 发 现 它 的 限 制 有 点 多, 所 以 更 愿 意 走 Mocha 路 线 但 也 明 白 为 什 么 人 们 会 喜 欢 使 用 Vows 我 想, 两 者 都 值 得 一 试 试 用 它 们 并 不 需 要 很 大 工 作 量 GLOVER: 没 错 我 们 在 哪 里 可 以 获 得 Nodes 如 果 我 提 到 Node, 我 在 哪 里 可 以 找 到 它? KUNKLE:Nodejs.org GLOVER: 那 很 简 单 KUNKLE: 简 单, 因 为 可 以 Nodejs.org 有 下 载 的 内 容 有 适 用 于 Mac 和 Windows 和 Linux 的 真 实 本 机 安 装 程 序, 虽 然 该 站 点 上 没 有 什 么 适 用 于 Linux 的 东 西 可 以 下 载, 但 如 果 您 Google 一 下 的 话, 还 是 有 的 假 设 您 使 用 Ubuntu, 如 果 用 Google 搜 索 Node.debian.package, 会 发 现 可 以 添 加 Debian 等 源, 并 且 真 的 可 以 通 过 这 种 方 式 获 得 它 或 者, 通 过 源 进 行 安 装 也 真 的 不 是 太 难 这 是 我 通 常 会 做 的 事 情 它 很 方 便, 因 为 您 会 遇 到 相 当 多 的 包 是 具 有 本 地 编 译 步 骤 的, 安 装 程 序 也 如 此, 适 用 于 Mac 和 Windows 的 打 包 安 装 程 序, 它 们 不 包 括 Node 头 文 件 所 以, 那 些 本 地 模 块 不 编 译 所 以, 如 果 可 以 忍 受, 我 会 说 从 源 代 码 编 译 它 但 如 果 只 是 想 尝 试 一 下, 无 论 如 何 都 要 获 取 安 装 程 序, 这 不 是 您 只 需 花 几 分 钟 来 安 装 它, 尝 试 它 GLOVER: 从 资 源 的 角 度 来 看 又 如 何? 想 到 了 哪 些 资 源 吗, 像 教 程 视 频 方 面? KUNKLE: 有 一 个 站 点, 名 为 How To Node, 它 有 一 些 教 程 howtonode.org howtonode.org GLOVER: 明 白 KUNKLE:Nodejitsu 是 一 个 托 管 服 务 提 供 商, 但 他 们 的 博 客 上 也 有 很 多 -13
关 于 Node 的 内 容 与 Java 不 同, 它 有 DZONE 和 类 似 的 地 方, 但 没 有 大 型 站 点, 没 有 什 么 重 要 的 地 方 都 是 Node.js 内 容 的 所 以 必 须 去 不 同 的 地 方 转 转, 才 可 以 找 到 内 容 GLOVER: 是 的, 我 注 意 到 了, 我 认 为 是 O'Reilly, 并 且 我 敢 肯 定, 所 有 其 他 出 版 商 如 果 不 是 已 经 推 出 的 话, 也 都 是 准 备 推 出 测 试 类 型 的 Node 书 籍 KUNKLE: 是 的, 很 多 都 是 是 的, 就 像 您 说 的, 很 多 都 处 于 测 试 阶 段 人 们 已 经 出 版 了 一 些 书 籍, 电 子 书, 其 实 可 以 免 费 获 取 有 时 它 们 是 测 试 版 本 的 图 书, 很 可 能 出 版 商 正 在 忙 这 个 工 作, 称 为 Node Beginner Book(Node 入 门 书 ) 或 Felix 的 Node.js Guide(Node.js 指 南 ), 这 些 都 很 有 趣 GLOVER: 我 会 去 看 看 这 些 书 Felix 的 Node.js Guide 那 听 起 来 很 有 意 思 KUNKLE: 是 的, 他 有 几 个 不 同 的 指 南 有 一 个 初 学 者 指 南, 有 一 个 样 式 指 南, 建 议 了 一 些 编 码 约 定 他 甚 至 有 一 本 Convincing the Boss Guide( 说 服 老 板 的 指 南 ), 所 以, 如 果 需 要 帮 助 说 服 自 己 的 老 板 让 您 尝 试 Node, 那 么 也 许 里 面 的 内 容 会 帮 到 您 GLOVER: 很 好 Jeff, 这 真 的 很 棒 我 认 为, 从 高 层 次 来 概 述 什 么 是 Node, 它 为 什 么 会 流 行, 去 研 究 一 些 不 同 的 包, 这 已 经 非 常 有 意 思 我 要 代 表 我 们 所 有 的 听 众 对 您 表 示 感 谢, 非 常 感 谢 您 今 天 晚 上 花 时 间 告 诉 我 们 这 些 KUNKLE: 不 客 气 感 谢 邀 请 我,Andy GLOVER: 这 一 次 的 特 邀 嘉 宾 是 Jeff Kunkle, 我 是 Andy Glover, 这 里 是 developerworks Java 技 术 播 客 系 列 感 谢 大 家 的 收 听 [ 访 谈 结 束 ] -14