间接服务调用

Created By RV, and licensed with Creative Commons "CC BY-NC-ND 4.0"

目的与场景

在这一章,讲解两个无法直连的节点,如何通过中心节点(Hub)进行间接服务调用。

一. 概念

1. 星型拓扑(Hub-Leaf)

在星型拓扑中,所有外围节点(Leaf)只与中心节点(Hub)直连,外围节点之间无法直连。

消息流向:Leaf → Hub → Leaf

2. 间接调用

当两个Leaf节点无法直连时,可以通过Hub节点转发消息,实现间接服务调用。

Kree4X内置了消息转发机制,只需在Hub节点开启proxyMode,即可自动转发消息。

二. 星型拓扑间接调用

在下边的示例中,我们将:

  • 创建一个Hub节点,开启转发模式
  • 创建两个Leaf节点,都连接到Hub
  • Leaf1注册greet服务
  • Leaf2调用greet服务,经Hub转发到Leaf1
import Kree4n from '@kree4js/kree4n'

// Hub节点:开启转发模式,监听端口
const hub = Kree4n.create('hub', 'CentralHub', { transport: { proxyMode: true } })
hub.listen('tcp://127.0.0.1:8010')

// Leaf1:注册服务,连接到Hub
const leafNode1 = Kree4n.create('leaf-1')
leafNode1.register('greet', {
  hello (name) { return `Hello, ${name}! (from leaf-1)` }
})
leafNode1.attach('tcp://127.0.0.1:8010')

// Leaf2:连接到Hub,调用服务
const leafNode2 = Kree4n.create('leaf-2')
leafNode2.attach('tcp://127.0.0.1:8010')

await hub.start()
await leafNode1.start()
await leafNode2.start()

// Leaf2调用Leaf1的greet服务,经Hub转发
const greet = leafNode2.service('greet')
const result = await greet.hello('World')
// result: "Hello, World! (from leaf-1)"

三. 须强调的细节

1. 关于拓扑结构

拓扑结构,一点都不重要。

示例中,使用的是星型拓扑,实际只要两个节点间存在可达链路就行。

链式连接,也能工作。

间接连接节点间,通信协议不同,也能工作。

所以,我们把传输层叫作Grid,通信网格,而不是通信网络。

详情,参考:通信网格:Net Grid

2. proxyMode

在Hub节点创建时设置 transport: { proxyMode: true },开启消息转发模式。

开启后,Hub会自动将收到的消息转发给目标节点。

数据转发,术语”数据帧中继“,默认是关闭的。原因,”默认配置即风险“。

默认配置,是一个巨大的惯性陷阱。如果,默认启用帧中继的话,绝大部分用户,一定会无意间将内部的服务节点暴露于外部用户之前,从而导致非预期的行为。

详情,参考:数据帧中继:DataFrame Forwarding

3. 转发策略(ForwardPolicy)

系统提供了API,允许定制数据转发策略。

这是中高级特性,后续章节会展开详细讲解。

此处,只需记住:默认的转发策略是”AllowAll模式“,允许转发所有消息

四. 涉及到的API:

1. 创建带转发模式的节点

/**
 * 创建一个启用proxyMode的KreeX实例。
 * @param {string} name - 节点名称。
 * @param {string} [description] - 节点描述。
 * @param {{ transport?: { proxyMode?: boolean } }} [options] - 传输层选项。
 */
Kree4n.create(name: string, description?: string, options?: { transport?: { proxyMode?: boolean } }): KreeX

五. 可运行代码

完整示例代码,参见:07-indirect-call.mjs

results matching ""

    No results matching ""