# @equinor/fusion-framework-module-service-discovery 中文文档

规范地址：https://npmcn.com/package/%40equinor/fusion-framework-module-service-discovery/

版本：10\.3\.0
npm 元数据更新时间：2026-11-12T09:55:31.477Z
中文译文更新时间：2026-11-13T20:15:54.132Z
软件包许可：ISC

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40equinor/fusion-framework-module-service-discovery
原文对照：https://npmcn.com/package/%40equinor/fusion-framework-module-service-discovery/?lang=original
源码仓库：https://github.com/equinor/fusion-framework

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：459 kB，64 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- 运行依赖：7 个
- 首次发布：2022-01-17T06:55:02.543Z
- 最新版本发布：2026-11-12T09:55:31.097Z
- 近 30 天下载量：12622（2026-10-14 至 2026-11-12，npm 官方下载统计）
- 已发布版本数：228（近 12 个月 20 个）

## 中文简介

暂无中文简介

## 安装

```sh
npm install @equinor/fusion-framework-module-service-discovery
```

也可以使用：`pnpm add @equinor/fusion-framework-module-service-discovery`、`yarn add @equinor/fusion-framework-module-service-discovery`、`bun add @equinor/fusion-framework-module-service-discovery`

## README

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

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

## 何时使用

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

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

## 先决条件

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

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

## 快速启动

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

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

```typescript
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\. 启用服务发现

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

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

### 3\. 在运行时解析服务

```typescript
// 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');
```

## 文档

| 指南 | 封面 |
| --- | --- |
| [配置](https://npmcn.com/package/%40equinor/fusion-framework-module-service-discovery/docs/configuration.md) | 自定义 HTTP 客户端密钥、 自定义客户端, 并替换发现客户端 |
| [测试](https://npmcn.com/package/%40equinor/fusion-framework-module-service-discovery/docs/testing.md) | 这个 `/mock` 进入点:内存登记册、当地模拟服务器和间谍 |
| [会话覆盖](https://npmcn.com/package/%40equinor/fusion-framework-module-service-discovery/docs/session-overrides.md) | 开发期间将服务重定向到本地或中转 URL |
| [API 参考](https://npmcn.com/package/%40equinor/fusion-framework-module-service-discovery/docs/api-reference.md) | 出口和出口 `Service` 形状 |

## 测试

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

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

enableServiceDiscoveryMock(configurator);
```

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

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

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

见 [测试](https://npmcn.com/package/%40equinor/fusion-framework-module-service-discovery/docs/testing.md) 用于完整的构建器 API、本地服务器设置和跑道导引,或 [`@equinor/fusion-framework/mock`](https://npmcn.com/package/framework/docs/testing.md) 以同时嘲笑每个框架边界.

## 操作遥测

当遥测模块可用时, 提供者在初始化后连接到它 记录 `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` 时间要求恢复.

```typescript
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？

在项目目录运行 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 和提交记录判断。

