1.0.23 • Published 9 months ago

@iocore/micro-ws-registry v1.0.23

Weekly downloads
-
License
-
Repository
-
Last release
9 months ago

@iocore/micro-ws-registry

npm version

IoCore 微服务 WebSocket 注册中心。

基于 @iocore/micro-ws,提供了一个中心化的服务发现机制。各个微服务(Agent)启动时向注册中心报告自己的地址和命名空间,其他服务可以通过注册中心查询特定命名空间对应的服务地址。

安装

npm install @iocore/micro-ws-registry @iocore/boot @iocore/micro-ws @iocore/component --save
# or
yarn add @iocore/micro-ws-registry @iocore/boot @iocore/micro-ws @iocore/component

依赖

  • @iocore/boot
  • @iocore/micro-ws
  • @iocore/component

配置

通过环境变量 IOCORE_MICRO_WEBSOCKET_REGISTRY_PORT 配置注册中心监听的端口,默认为 8427

示例 .env 文件:

IOCORE_MICRO_WEBSOCKET_REGISTRY_PORT=8427

使用

通常,注册中心会作为一个独立的 IoCore 应用启动。

import { Application } from '@iocore/component';
import MicroWsRegistry from '@iocore/micro-ws-registry';

@Application.Inject(MicroWsRegistry)
class RegistryApp extends Application {
  // 可以注入 MicroWsRegistry 实例来访问其方法
  @Application.Inject(MicroWsRegistry)
  private registry: MicroWsRegistry;

  public async main() {
    console.log('Registry is running...');
    // 例如,可以获取当前注册的命名空间列表
    console.log('Registered namespaces:', this.registry.namespaceToArray());
  }
}

// 启动注册中心应用
Application.start(RegistryApp);

内部机制

注册中心启动后,会监听指定的端口,并处理来自 Agent 的连接和消息:

  • 连接/断开: 记录 Agent 的连接 (+ host) 和断开 (- host) 事件。如果 Agent 断开连接,会自动从注册信息中移除。
  • online 事件: Agent 连接后,会发送 online 事件,并携带其服务的命名空间 (namespace)。注册中心收到后,将 namespace 与 Agent 的 host (地址) 关联起来。
    // Agent 端发送 online (由 @iocore/micro-ws-agent 自动处理)
    // channel.emit('ws', 'online', 'my-service-namespace');
  • where 事件: 其他服务可以向注册中心发送 where 事件,查询特定 namespace 对应的 host
    // 查询 'my-service-namespace' 对应的地址
    // const host = await registryChannel.fetch('ws', 'where', ['my-service-namespace']);

MicroWsRegistry 类 (继承自 @iocore/boot)

  • constructor(): 初始化 WebSocket 服务器,设置端口,并监听连接/断开事件。
  • initialize(): void: 绑定 onlinewhere 事件处理器。IoCore 会自动调用。
  • terminate(): void: 关闭 WebSocket 服务器。IoCore 会自动调用。
  • namespaceToArray(): { name: string, host: string }[]: 返回当前所有已注册的命名空间及其对应的 host 列表。
  • createFetcher<R = any>(protocol: string, url: string, props: any[] = [], timeout?: number): Promise<R>: 这是注册中心作为服务调用代理的核心方法。

    • 它接收一个目标服务的 URL (格式如 ws://my-service-namespace/path/to/api)。
    • 从 URL 中解析出 namespace
    • 在内部 namespaces 映射中查找该 namespace 对应的 host
    • 如果找到 host,则通过 @iocore/micro-ws 连接到目标 Agent。
    • 向目标 Agent 发起 fetch 请求 (调用 channel.fetch),并将 protocol, router (URL 路径), props (参数) 和 timeout 传递过去。
    • 返回目标 Agent 的响应。
    • 如果找不到 namespace,则抛出 404 异常。

    使用场景: 一个服务 (如 API Gateway) 可以注入 MicroWsRegistry,然后使用 createFetcher 来调用其他微服务,而无需知道这些微服务的具体地址,只需知道它们的命名空间即可。

    // 假设在 API Gateway 服务中
    @Application.Inject(MicroWsRegistry)
    private registry: MicroWsRegistry;
    
    async getUserData(userId: string): Promise<UserData> {
      // 调用 "user-service" 命名空间下的 /users API
      const userData = await this.registry.createFetcher<UserData>(
        'ws',
        'user-service/users',
        [userId] // 传递给目标 Agent 的参数
      );
      return userData;
    }

贡献

欢迎提交 Pull Request。对于重大更改,请先开一个 Issue 来讨论您想要更改的内容。

许可证

MIT

1.0.23

9 months ago

1.0.22

9 months ago

1.0.21

9 months ago

1.0.20

9 months ago

1.0.19

9 months ago

1.0.18

9 months ago

1.0.17

10 months ago

1.0.16

10 months ago

1.0.15

10 months ago

1.0.14

10 months ago

1.0.13

10 months ago

1.0.12

10 months ago

1.0.11

10 months ago

1.0.10

10 months ago

1.0.9

10 months ago

1.0.8

10 months ago

1.0.7

10 months ago

1.0.6

10 months ago

1.0.5

10 months ago

1.0.4

10 months ago

1.0.3

10 months ago

1.0.2

10 months ago

1.0.1

10 months ago

1.0.0

10 months ago