@ 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
}
}