Closed wangshijun closed 3 years ago
这是个讨论的帖子,问题来源:https://github.com/blocklet/blocklet-specification/pull/1 以及 https://github.com/ArcBlock/abt-node/issues/1252
Blocklet 如何通过 blocklet.yml 告诉 ABT Node 对外暴露哪些服务、界面等等。典型的场景,比如:
约束条件:需要允许 blocklet 暴露任何他想要暴露的接口、服务出去。
或者换句话说,我们需要把当前 meta spec 中下列字段整合:
在 blocklet meta 中定义 interfaces 字段,把 interface 分为 UI、API、Service 三类
interfaces: # define UI interfaces - type: UI name: public_url path: / port: 'BLOCKLET_PORT' - type: UI name: admin_url path: /admin port: 'BLOCKLET_PORT' # define API interface - type: API name: graphql path: /api/gql port: 'BLOCKLET_PORT' - type: API name: websocket path: /api/socket port: 'BLOCKLET_PORT' - type: API name: graphql path: /api/forge port: 'BLOCKLET_PORT' # define services - type: SERVICE protocol: udp name: dns port: internal: 'BLOCKLET_DNS_PORT' external: 53 - type: SERVICE name: p2p port: internal: 'BLOCKLET_P2P_PORT' external: 26535
interfaces 是个列表,每个条目包含如下字段:
type
WEB|SERVICE
name
path
/
prefix
*
type=service
port
string
BLOCKLET_PORT
object
port.internal
port.external
protocol
tcp/udp
通常 Blocklet 只需要在 Meta File 里面申明自己的 interface 列表,ABT Node 根据 Meta 分配必要的端口,然后通过环境变量传给 Blocklet。
而如果 Blocklet 在启动之后需要分配更多的端口,需要 ABT Node 动态提供,需要 ABT Node 暴露出去一个接口,并且该接口只能被安全的调用(可以在阶段 II 实现)。
Routing Engine 默认各 interface 用的是 80/443 端口,除非 interface 里面单独申明了 protocol。
https://github.com/ArcBlock/abt-node/issues/1575
We should also consider gRPC. Forge have it, and also future blocklet likely will need it.
https://github.com/ArcBlock/abt-node/issues/1777
https://github.com/ArcBlock/abt-node/issues/1252
这是个讨论的帖子,问题来源:https://github.com/blocklet/blocklet-specification/pull/1 以及 https://github.com/ArcBlock/abt-node/issues/1252
问题描述
Blocklet 如何通过 blocklet.yml 告诉 ABT Node 对外暴露哪些服务、界面等等。典型的场景,比如:
约束条件:需要允许 blocklet 暴露任何他想要暴露的接口、服务出去。
或者换句话说,我们需要把当前 meta spec 中下列字段整合:
解决方案
在 blocklet meta 中定义 interfaces 字段,把 interface 分为 UI、API、Service 三类
interfaces 是个列表,每个条目包含如下字段:
type
: 必须,可取值为WEB|SERVICE
name
: 必须,语义化的名字,会显示在 ABT Node 里面的 Blocklet 详情页path
: 可选,当前 interface 在 blocklet 上的 url,默认值为/
prefix
: 可选,默认值为*
,可取值为,对于type=service
的可忽略*
支持 serve 在任何 url 下面,安装之后可以自动生成,也可以配置path
能 serve 在某个特定的 path 下面,安装之后可以自动给他生成,不用也不可配置port
: 必须,为了保障简洁和灵活性,可取值为下面两种类型string
:比如BLOCKLET_PORT
,表示需要 Node 分配一个端口号,并且用这个名字传给 Blockletobject
:通常用于 Blocklet 对外暴露多个 Interfaceport.internal
,作用等同于字符串类型的port
,即 Blocklet 内部监听的端口port.external
,告诉 router 希望这个 interface 通过 router 的哪个端口对外暴露,比如 dns 的 53protocol
:可选,默认值为空,可以指定为tcp/udp
ABT Node 的行为
通常 Blocklet 只需要在 Meta File 里面申明自己的 interface 列表,ABT Node 根据 Meta 分配必要的端口,然后通过环境变量传给 Blocklet。
而如果 Blocklet 在启动之后需要分配更多的端口,需要 ABT Node 动态提供,需要 ABT Node 暴露出去一个接口,并且该接口只能被安全的调用(可以在阶段 II 实现)。
Routing Engine 默认各 interface 用的是 80/443 端口,除非 interface 里面单独申明了
protocol
。