要选择
命名空间
、
组件为其中每个元素指定一个 use
声明
清单。然而,由于
功能路由涉及一系列组件
即使某个组件use
了某项功能,也不一定表示它始终是
可用。可能无法使用数据的原因有很多,例如,如果其中一个
链中的组件未路由功能,或者如果其中一个组件
组件无法解析。
当组件 use
或路由某项 capability 时,它可能有各种预期
相应功能是否必须可用在某些情况下
对组件运行至关重要:如果有人创建了拓扑,
未能将功能传送到组件,理想情况下应该检测
及早排除故障,以免出现错误不过,在其他情况下
组件可以容忍缺少该功能,
预计不会出现在某些配置中。为了适应
cml 提供 availability
选项,用于
use
、offer
和expose
组件可以使用它来声明对功能可用性的预期。
选项
对于 availability
,该框架支持以下选项:
必填
最常用的 availability
选项是 required
,
组件始终期望功能可用,因此无法
在不存在的情况下正常运行。这是默认选项
如果未指定任何库存状况,则自动设置。
可选
optional
表示某些功能可能不存在于
配置。如果某个组件 use
是可选功能
不可用,那么即使没有此属性,组件也能正常工作,例如
停用所有需要该功能的功能。
不过,如果某项 optional
功能在某些配置中不可用,则
根据框架,该拓扑仍包含
终止于 void
的功能。这样,产品
所有者需明确做出选择:
可用(其路由在某个提供程序组件处终止)或不可用(其
路线在 void
终止)。如果路线不完整
工具和诊断会将其报告为
错误。
过渡风格
transitional
类似于 optional
的弱版本。与 optional
类似,如果
组件使用了 transitional
功能,应能容忍缺少该功能
功能。不过,与 optional
不同的是,transitional
路由不会
需要在 void
后终止
工具和诊断不会报告任何错误,
transitional
路线不完整或无效。
“过渡性”这一名称表示此选项适用于
过渡效果。例如,假设您有一个 Echo
协议,
替换为EchoV2
。在过渡的早期阶段,您可以更改
客户端 use
具有 transitional
可用性的新协议。之后,
端到端路由后,您就可以将可用性升级到
required
或 optional
。如果您曾尝试改用 optional
,
工具和诊断工具会抱怨
客户端组件的父级缺少 Echo2
的功能路由,而
transitional
将会禁止此类警告。
与目标相同
same_as_target
会充当直通:
继承自路由的目标组件设置的任何可用性。
这对于传递很多功能的中间组件非常有用
这样一来,当路线的 availability
在目标中发生变化时,
来源中需要进行更改。
由于对 capability 执行 use
操作的组件是其最终目的地,
“same_as_target
”不是“use
”的有效选项。
库存状况比较
“强度”具有相对顺序可用性选项
按照从高到低的顺序排列为:required > optional > transient
。
same_as_target
不在此范围内,因为它是直通式:
same_as_target
功能路由实际上等于
从目标继承的可用性。
在许多情况下,可将可用性降级
发送到目标。例如,如果组件 X
公开了 required
功能 Y
,Y
可以选择 use
功能作为 optional
,或者
offer
将 capability 作为 optional
传递给另一个子项。但它是一条
发生错误,无法升级来源的可用性。如果发生这种情况
尝试使用或路由该功能将会失败,其方式与失败一样
如果路由链不完整,则会发生此错误。这是一个错误,因为这意味着
尝试建立比来源网站更强大的可用性保证,
有保证例如,让组件 use
并无意义。
如果其父项 offer
将 capability 设为 optional
,则该 capability 为 required
;
因为这意味着父级已声明相应功能可能不可用。
工具和诊断
设置可用性的主要作用是控制托管工具和
会报告路由错误。简而言之,这意味着
availability
,则设置越严格。详细规范如下:
- 如果
required
功能路由不完整、无效或以void
结尾: <ph type="x-smartling-placeholder">- </ph>
- 审查功能会将这种情况报告为路由错误。这将 如果构建配置要求传递此条目,则会导致构建错误。
component_manager
将在使用WARNING
组件的作用域来描述路由错误。
- 如果
optional
功能路由不完整或无效: <ph type="x-smartling-placeholder">- </ph>
- 审查功能会将这种情况报告为路由错误。这将 如果构建配置要求传递此条目,则会导致构建错误。
component_manager
会在 using 组件的INFO
范围,用于描述路由错误。
- 如果
optional
功能路由以void
结尾: <ph type="x-smartling-placeholder">- </ph>
- 审查功能不会报告错误。
component_manager
可能会记录INFO
消息,但不会记录错误。
- 如果
transitional
功能路由不完整、无效或以void
: <ph type="x-smartling-placeholder">- </ph>
- 系统不会记录任何错误或其他信息。
对于常规运行时行为,availability
没有任何影响。例如,假设
组件尝试在路由已中断的命名空间中对协议执行 use
操作。
如果协议以 required
或
optional
:
- 该协议将显示在组件的命名空间中。
- 连接到该 capability 的初始调用将成功(假设 标准单向 API 使用 Rust 中的 connect_to_protocol)。
component_manager
将尝试传送该功能。最后, 路由失败,相应通道将关闭并显示NOT_FOUND
墓碑。
source_availability:未知
cml 具有一项附加功能,可用于自动生成
required
或 optional void
offer
,具体取决于
包含的 cml shard(具有针对
来源。如需详细了解此功能,请访问
构建文档。
示例
以下示例说明了本文档中描述的概念。
本例中有三个组成部分:
echo_client
:它会尝试使用echo_server
echo_server
,它提供了一些协议echo_realm
,echo_client
和echo_server
(将两者关联)的父级 一起
我们来看一下它们的 cml 文件:
// echo_client.cml
{
...
use: [
{ protocol: "fuchsia.example.Echo" },
{
protocol: "fuchsia.example.EchoV2",
availability: "transitional",
},
{
protocol: "fuchsia.example.Stats",
availability: "optional",
},
],
}
// echo_server.cml
{
...
capabilities: [
{ protocol: "fuchsia.example.Echo" },
],
expose: [
{
protocol: "fuchsia.example.Echo",
from: "self",
},
],
}
// echo_realm.cml
{
offer: [
{
protocol: "fuchsia.example.Echo",
from: "#echo_server",
to: "#echo_client",
availability: "required",
},
{
protocol: "fuchsia.example.Stats",
from: "void",
to: "#echo_client",
availability: "optional",
},
],
children: [
{
name: "echo_server",
url: "echo_server#meta/echo_server.cm",
},
{
name: "echo_client",
url: "echo_client#meta/echo_client.cm",
},
],
}
回想一下,如果省略 availability
,则默认为 required
。这个
拓扑,行为如下:
echo_client
将能够成功连接到fuchsia.example.Echo
。echo_client
将无法连接到fuchsia.example.EchoV2
或fuchsia.example.Stats
。- 工具和诊断信息不会记录错误。
fuchsia.example.Stats
没有错误,因为它是optional
和路由 发送至void
。fuchsia.example.Stats
没有错误,因为它是transient
。
现在,我们来看看不同版本会发生怎样的变化:
// echo_client.cml
{
...
use: [
{ protocol: "fuchsia.example.Echo" },
{
protocol: "fuchsia.example.EchoV2",
availability: "transitional",
},
{
protocol: "fuchsia.example.Stats",
availability: "optional",
},
],
}
// echo_server.cml
{
...
capabilities: [
{
protocol: [
"fuchsia.example.Echo",
"fuchsia.example.EchoV2",
"fuchsia.example.Stats",
],
},
],
expose: [
{
protocol: [
"fuchsia.example.Echo",
"fuchsia.example.EchoV2",
],
from: "self",
},
{
protocol: "fuchsia.example.Stats",
from: "self",
availability: "optional",
},
],
}
// echo_realm.cml
{
offer: [
{
protocol: [
"fuchsia.example.Echo",
"fuchsia.example.EchoV2",
],
from: "#echo_server",
to: "#echo_client",
availability: "same_as_target",
},
{
protocol: "fuchsia.example.Stats",
from: "#echo_server",
to: "#echo_client",
availability: "optional",
},
],
children: [
{
name: "echo_server",
url: "echo_server#meta/echo_server.cm",
},
{
name: "echo_client",
url: "echo_client#meta/echo_client.cm",
},
],
}
现在:
echo_client
将能够成功连接到fuchsia.example.Echo
、fuchsia.example.EchoV2
和fuchsia.example.Stats
。- 每条路线虽然具有不同的
availability
,但都是完整且 以实际组件终止。 - 对于每条路由,来源和目标之间的可用性都会传递 比较检查
- 每条路线虽然具有不同的
- 工具和诊断不会记录错误,因为所有路线都已完成。