@equinor/fusion-framework-module-service-discovery

中文文档
10.3.0发布于 2026/11/12ISCTypeScriptES Module近 30 天下载 1.3万
中文使用文档
文档目录13 节
  1. 何时使用
  2. 先决条件
  3. 快速启动
  4. 1. 为服务发现注册一个HTTP客户端 API
  5. 2. 启用服务发现
  6. 3. 在运行时解析服务
  7. 文档
  8. 测试
  9. 操作遥测
  10. 关键概念
  11. 继承
  12. 缓存
  13. 处理失败

@ equinor/ 聚变框架- 模块- 服务- 发现

从中央服务发现API中解析服务端点URI和认证范围,这样应用程序代码就可以请求命名服务而无需硬编码URL.

何时使用

当应用程序需要时使用此模块:

  • 运行时查看后端服务基底, 而不是将其烘焙成配置
  • 自动获取 OAuth 范围
  • 为已发现的服务创建预配置的 HTTP 客户端

先决条件

模块取决于 @equinor/fusion-framework-module-http 用于HTTP运输. HTTP 客户端指向服务发现后端必须注册 在此之前 服务发现启用.

[尖叫声] HTTP模块必须在运行时启用(如Portal). 如果您正在构建一个子模块, 如应用程序, 门户通常会继承此配置 .

快速启动

1. 为服务发现注册一个HTTP客户端 API

如果运行时间已经提供 HTTP 客户端按键, 请跳过此步骤 "service_discovery"。 。 。 .

import { configureHttpClient } from '@equinor/fusion-framework-module-http';
import type { ModulesConfigurator } from '@equinor/fusion-framework-module';

const configurator = new ModulesConfigurator();
configurator.addConfig(
  configureHttpClient('service_discovery', {
    baseUri: 'https://discovery.example.com',
    defaultScopes: ['https://discovery.example.com/.default'],
  }),
);

2. 启用服务发现

import { enableServiceDiscovery } from '@equinor/fusion-framework-module-service-discovery';

// Auto-detects the 'service_discovery' HTTP client
enableServiceDiscovery(configurator);

3. 在运行时解析服务

// Resolve a single service
const contextService = await modules.serviceDiscovery.resolveService('context');
console.log(contextService.uri); // 'https://api.example.com/context'

// Create a ready-to-use HTTP client for a discovered service
const client = await modules.serviceDiscovery.createClient('people');
const data = await client.fetchAsync('/persons?search=Jane');

文档

指南封面
配置自定义 HTTP 客户端密钥、 自定义客户端, 并替换发现客户端
测试这个 /mock 进入点:内存登记册、当地模拟服务器和间谍
会话覆盖开发期间将服务重定向到本地或中转 URL
API 参考出口和出口 Service 形状

测试

从 @equinor/fusion-framework-module-service-discovery/mock 解决来自内存登记处而不是服务登记处的服务。 真正的配置器、提供者和验证仍在运行——只有与登记册联系的边界被替换.

import { enableServiceDiscoveryMock } from '@equinor/fusion-framework-module-service-discovery/mock';

enableServiceDiscoveryMock(configurator);

基线服务apps, (中文(简体) ), people, (中文(简体) ), context, (中文(简体) ), bookmarks, (中文(简体) ), notification)解出框外. 配置器拥有注册, 所以将每个服务指向本地运行的模拟服务器不需要客户端 :

enableServiceDiscoveryMock(configurator, (builder) => {
  builder.setBaseUri('http://localhost:6669');
  builder.addService({ key: 'my-api' });
});

切入点有 没有测试运行者的依赖性并且船上没有嘲弄API自己——监视呼叫是你们试跑者的工作.

见 测试 用于完整的构建器 API、本地服务器设置和跑道导引,或 @equinor/fusion-framework/mock 以同时嘲笑每个框架边界.

操作遥测

当遥测模块可用时, 提供者在初始化后连接到它 记录 fusion.service-discovery.resolve.duration 每个网络,倒置或 冷却分辨率, 有消毒 .failure 解析投出时除外. 通知解释了清单的来源: fusion.service-discovery.fallback (最近一次发言) 已知的好名单已经送达,而不是失败)和 fusion.service-discovery.cooldown (失败) 后退时快速,没有网络尝试). fusion.service-discovery.unknown-service 标记未注册的密钥。 密钥,URI,瞄准镜和错误从未被记录.

缓存分辨率是浏览的大部分, 因此只记录一个调试级别 fusion.service-discovery.cache-hit 事件,没有期限。 导出适应器 因此,以上信息对他们没有任何帮助.

网络分辨率背后的HTTP尝试由HTTP遥测报告,不重复 在这里。 一个重用父母委托人的孩子主机 向父母报告,所以每个 分辨率记录一次。 自定义客户端通过曝光选择加入 diagnostic$,可观察到 ServiceDiscoveryDiagnostic。 。 。 .

关键概念

继承

当在子模块(如应用程序)内使用时,服务发现模块默认继承了母模块的发现客户端. 这意味着:

  • 孩子分享父母的缓存, 避免重复的 API 呼叫
  • 小孩看到同一个会话会超过
  • 打破父母客户端的变化可能影响孩子

缓存

内置 ServiceDiscoveryClient 缓存结果 5分钟 通过 @equinor/fusion-query编辑 allow_cache 参数 resolveService 编号 : resolveServices 控制是否返回第一个缓存快照( q)true)或等待最新回复(false,默认值).

处理失败

失败的请求永远不会被缓存 @equinor/fusion-query,所以如果没有保护,每一次重试,页面再加载,或重新发报,都会再次调用服务发现API. 内置客户端使这个硬化:

  • 失败后退 ——在请求失败后,发出请求暂停1分,再暂停2分,4分,最多30分. 共享一个失败请求的同步呼叫者计为单个失败 。 暂停重排下一个成功响应 .
  • 倒计时 ——当刷新失败,或在暂停期间接到电话时,如果超过24小时,最后一份成功的服务清单会被退回,所以应用程序会继续工作到短暂的停用.
  • 失败快 ——没有可用的倒计时,失败的请求会重排其原始错误(例如 HttpJsonResponseError 有状态 401),在暂停抛出时呼唤 ServiceDiscoveryUnavailableError 不接触网络。 内容 cause 持有原始错误 retryAt 时间要求恢复.
import { ServiceDiscoveryUnavailableError } from '@equinor/fusion-framework-module-service-discovery';

try {
  await serviceDiscovery.resolveService('people');
} catch (error) {
  if (error instanceof ServiceDiscoveryUnavailableError) {
    // service discovery is down; error.cause is the original failure
  }
}

版本与发布记录

@equinor/fusion-framework-module-service-discovery 共发布 228 个版本,首次发布于 2022/01/17;过去 12 个月发布了 20 个版本。

版本发布日期距今
10.3.0latest2026/11/121 天前
10.3.0-next.2next2026/11/112 天前
10.3.0-next.12026/10/2915 天前
10.3.0-next.02026/10/2816 天前
10.2.1-trusted-publishing-20261015-9dfe7602cd2a49a8a9df00d62c26e7304a82a85atrusted-publishing-202610152026/10/1629 天前
10.2.02026/10/1529 天前

其他发布通道:apploader → 8.0.15-apploader-be21a6b60eb13eee8bf869e75002d8634e9c50a9,cli-search-index → 9.0.5-cli-search-index.0,msal-v5 → 9.0.6-msal-v5.1,trusted-publishing-20261015 → 10.2.1-trusted-publishing-20261015-9dfe7602cd2a49a8a9df00d62c26e7304a82a85a,next → 10.3.0-next.2。

关于 @equinor/fusion-framework-module-service-discovery 的常见问题

如何安装 @equinor/fusion-framework-module-service-discovery?

在项目目录运行 npm install @equinor/fusion-framework-module-service-discovery,或使用 pnpm add / yarn add / bun add。

@equinor/fusion-framework-module-service-discovery 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@equinor/fusion-framework-module-service-discovery 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@equinor/fusion-framework-module-service-discovery 可以商用吗?

@equinor/fusion-framework-module-service-discovery 使用 ISC 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@equinor/fusion-framework-module-service-discovery 的下载量有多少?

根据 npm 官方下载统计,@equinor/fusion-framework-module-service-discovery 在 2026/10/14 – 2026/11/12 这 30 天内被下载 12,622 次,日均约 421 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@equinor/fusion-framework-module-service-discovery 还在维护吗?

最新版本 10.3.0 发布于 2026/11/12(1 天前);至今共发布 228 个版本,其中过去 12 个月发布了 20 个;首次发布于 2022/01/17。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。