-
1 工具作用OBS提供跨区域复制(CRR)功能,此功能开通后,可以将同一个账号下一个桶(源桶)中的数据自动、异步地复制到不同区域的另外一个桶(目标桶)中,但启用跨区域复制功能之前上传的对象,不会被复制到目标桶。为了解决这个问题,CRR提供了历史对象CRR功能,开启此功能后,源桶中的所有数据都会自动、异步地复制到目标桶中,此功能的界面还未上线,但可以通过OBS API**送http、https请求来配置历史对象CRR功能,本文工具对API接口进行封装,使用者只需填写简单的配置信息即可启动桶历史对象CRR功能。2 效果展示源桶obs-chongchong-guangzhou中有1000个对象。使用工具启动源桶obs-chongchong-guangzhou到目的桶obs-chongchong-beijing的历史对象CRR,约10分钟后源桶中数据复制到北京region的目的桶obs-chongchong-beijing中。3 使用前准备工具使用前需要做如下准备:1) 运行工具的平台需要安装JAVA(JDK)4 工具使用详细步骤4.1 拷贝工具目录到工具运行平台将本文附录中的工具包链接(testCrrOld.zip)下载到Linux平台指定目录并解压,效果如下: 其中setBucketCrr.jar是工具jar包、application.properties是工具运行的配置文件、replicationOld-open.xml是配置历史对象CRR的XML内容。4.2 配置application.properties、replicationOld-open.xmlapplication.properties是工具运行的配置文件,需要将文件中的信息更新为实际信息。replicationOld-open.xml是配置历史对象CRR的XML内容,需要参考下表中解释将文件中的信息更新为实际信息。名称描述是否必须Agency用户创建的委托名字是ID规则的特殊辨识符否Prefix对象键值名的前缀,适配于一个或者多个对象。否Bucket规则适用的目的桶名称。是StorageClass对象的存储类型。有效值:STANDARD|WARM|COLD否注:XML中字段更详细的配置指导参考链接——https://support.huaweicloud.com/usermanual-obs/obs_03_0003.html4.3 运行工具使用命令“java –jar setBucketCrr.jar”运行工具,工具会**送OBS配置请求,同时还会返回查询配置的结果信息。5 附录工具下载链接:https://obs-tools.obs.cn-north-1.myhuaweicloud.com/crrApi/testCrrOld.zip
-
我们的应用服务器向NB设备发送命令,nbiot平台会把设备的状态发回到 我们应用服务器的回调API上。我们应用服务器上用了nginx,但是上周nginx的出现问题导致 应用服务器回调API 不能接手任何来自 NBIOT平台发送的数据。 但这两天 nginx服务器修正过来,但是NBIOT平台依然不能发送任何数据, 都是502的错误。我们直接到 NBIOT的平台上, 平台调试设备的界面上 告诉我们说 是 应用服务器回调的URL加入到黑名单上了,如下图所示请问如何能够解除这个黑名单
-
华为云命令行工具 HCloud CLI由华为云专家贵哥个人作品,欢迎大家下载使用并留言反馈意见。华为云命令行工具 CLI(Huawei Cloud CLI)是基于华为云开放 API 建立的管理工具。借助此工具,您可以通过调用华为云开放 API 来管理华为云产品。该命令行工具与华为云开放 API 一一对应,灵活性高且易于扩展。为什么命令行 CLI公有云产品作为一个平台, 主要的用户是 企业IT管理员、企业应用开发者。 Web UI 界面易用, 但操作难以复用、难以保障用户每次操作的顺序的准确性。 而 RESTful API 提供了更强大的功能, 同时门槛也提升了不少。 为了让用户使用熟悉的命令行、Shell 脚本甚至 TCL、Python 这样的动态语言来快速、方便的操作华为云, 提供 华为云命令行 CLI 工具。华为云CLI工具, 基于开放 RESTful API, 无需服务器侧做任何操作, 即可将当期的开放API提供更易用的 CLI。 同时,基于元数据和自动更新, API增加、修改等可快速无感更新 CLI 工具。参考: 华为云 CLI 在命令格式和参数上参考了 阿里云 CLI 和 Google Cloud CLI( https://cloud.google.com/sdk/gcloud/reference/ ), 并吸收华为CC08的MML等能力和架构。特性:HCloud CLI 命令行工具, 基于 GO-lang 开发, 基于元数据驱动+引擎, 采用 YAML、JSON、Handlebar 等, 具备如下特性: 单一可执行文件, 绿色安装, 随便拷贝安装 多操作系统支持, 包括 Linux、Windows、Mac 等 自动更新命令描述。 系统自动从华为主网站更新命令元数据描述每次用户启动会话更新, 压缩传输, 低于 1s 版本更新元数据为 YAML 和 JSON 文件, 安全可靠 可扩展。 您可基于该命令行工具对华为云原生 API 进行封装,扩展出您想要的功能参数校验能力, 如 enum 类型、数字的范围等多种输出格式, 支持 json、table、csv、 value 等多种可自定义的格式。用户指南华为云 CLI 安装指导华为云 CLI 支持华为云 CLI 采用 GO-lang 开发, 只有一个可执行文件, 可以支持几乎所有操作系统, 包括 Windows、Linux 和 Mac OS 等。安装指导直接从网站下载对应操作系统的可执行文件, 并放到 PATH 中合适的目录即可。 如 Linux, 请下载 hcloud , 并放入 /usr/local/bin 目录即可。命令描述文件华为云 CLI 自动从中心网站下载命令描述文件。 命令描述文件为 yaml 和 json 格式的文本文件, 并存放在用户数据目录中。Linux: ~/.hcloud 目录Windows: C:\User\Your Account\AppData\hcloud 目录华为云 CLI 命令描述文件压缩传输, 文件大约不到 100KB。 华为云 CLI 在用户当前会话过期后, 至少三天进行一次检查新版本。华为云 CLI 命令格式与参数指南典型命令格式在华为云 CLI 中, 典型的命令格式如 hcloud ecs start a44e57e8-a37c-4bcc-b388-a98ab0a51867 --verbosity=debug --format="json"。 其中主要分成如下几部分:hcloud , 华为云CLI命令ecs start, 命令组、命令指令a44e57e8-a37c-4bcc-b388-a98ab0a51867, 命令参数, 可能没有, 也可能有许多多, 采用空格分开 --verbosity=debug --format="json" , 全局辅助参数在下面分别进行详细介绍。命令组、命令指令除了几个特别的命令, help、logout 等外, 其它的命令都由两个部分组成: 命令组、命令指令。 命令组一般与服务相关, 如 ecs、vpc、cce、cse 等, 命令指令一般是动作, 如 list、create、delete、start、shutdown 等, 也有时候包含子服务和动作, 如 cluster/list, cluster/create 等。 一般来说, 命令组和命令指令都是小写单词。 详细的命令组、命令指令的列表, 请参见华为云 CLI 命令参考指南, 比较常见的如下:hcloud ecs list hcloud ecs create hcloud ecs start hcloud ecs shutdown hcloud ecs delete hcloud vpc list hcloud vpc create hcloud cce cluster/list hcloud cce cluster/delete hcloud cce cluster/create hcloud cce deployment/list命令参数###参数名称与顺序 在华为云CLI命令参数, 支持多种表达形式:按顺序的写法长名称短名称如下面的三条命令的含义相同:hcloud iam login szfugui Password mydomain hcloud iam login --username=szfugui --password=Password --domain=mydomain hcloud iam login -u=szfugui -p=password -d=mydomain采用名称(无论长名称还是短名称) 时, 参数没有顺序依赖, 可以交换顺序, 不影响命令执行。 无论单值顺序模式, 还是长短名称模式, 都必须是单一字符串。 为了确保参数的正确性, 建议参数包含在 双引号(“”)内, 如: --format="table(id)"。参数默认值部分命令参数有默认值, 请参考各命令的文档。 必填参数如果非 --body 与--source参数时, 部分参数可能是必须输入的, 如果没有输入, 则命令行会提示参数输入不完整。全局辅助参数华为云 CLI 的全局辅助参数, 没有短名称, 也没有序号, 必须采用全名的模式来书写。 如 --verbosity=debug。 与普通命令参数存在此差异。 除此外, 其它要求与普通命令参数一致。全局辅助参数主要有:自定义请求体 body 参数--body="{'id':'自定义请求体'}" 。 在 华为CLI 中, 命令创建者为了简化使用, 抽取了部分参数作为命令行参数, 可以快速实现命令。 但由于参数太多或者不常用, 部分信息采用"默认值",而无法直接修改。 --body参数可以完整控制 RESTful 的请求体。 当 --body参数出现时, 命令本身的命令参数将不再生效, 由body覆盖。自定义请求体 source 参数--source参数与 --body参数非常相似, 唯一的是从磁盘文件中读取, 而不是直接在命令行上输入。 如:hcloud ecs create --source=createvm.json当 --source参数出现时, 命令本身的命令参数将不再生效, 由body覆盖。 如果一个命令同时存在 --body和--source,则--body优先, --source不再生效。输出格式控制 format 参数通用输出格式参数 --format , 在所有的命令都支持该参数。 如未指定该参数, 则 当前共支持:raw 将命令的 RESTful 响应体完整的输出, 不进行任何的处理(只进行友好显示格式化)。json 采用命令定义的友好json输出格式。 具体输出格式通过命令的 metadata 中的 "output/json" 章节定义table 采用表格的形式进行展示。 具体的输出列由命令的 metadata 中的 output/table 章节定义csv 采用文本形式进行展示, 各列之间采用逗号(,)分隔。 第一行是标题行。具体的输出列由命令的 metadata 中的 output/table 章节定义value 只显示值, 一般在脚本/script中常用。 与 csv 相似, 只是没有标题行。具体的输出列由命令的 metadata 中的 output/table 章节定义详细内容, 见 华为云 CLI 输出格式系统输出控制 verbosity--verbosity 控制系统输出,当前支持的级别包括 debug, info, warning, error, critical, none. 比较常用的是 --verbosity=debug, 进行命令调试, 可以观察到系统内部的大量临时数据、网络传输数据等。长任务等待控制 wait--wait=true 或者 --wait=false 命令控制长事务操作的结果。 例如创建虚拟机等需要较长时间, --wait=true 将查询创建VM 的 job 是否完成, 等待完成后才返回。 不同的任务的操作时长不相同, 有部分命令很快就执行完成, 但有的命令, 如创建 CCE Cluster 则可能需要超过10分钟。helpusage: Display detailed helpparam: versionusage: Print version information and exit华为云 CLI 输出格式使用说明命令指引通用输出格式参数 --format , 在所有的命令都支持该参数。 如未指定该参数, 则 当前共支持:raw 将命令的 RESTful 响应体完整的输出, 不进行任何的处理(只进行友好显示格式化)。json 采用命令定义的友好json输出格式。 具体输出格式通过命令的 metadata 中的 "output/json" 章节定义table 采用表格的形式进行展示。 具体的输出列由命令的 metadata 中的 output/table 章节定csv 采用文本形式进行展示, 各列之间采用逗号(,)分隔。 第一行是标题行。具体的输出列由命令的 metadata 中的 output/table 章节定义value 只显示值, 一般在脚本/script中常用。 与 csv 相似, 只是没有标题行。具体的输出列由命令的 metadata 中的 output/table 章节定义原生格式 raw--format=raw, 不支持任何其它参数。 Raw 原生格式不需要任何参数与配置, 直接将 RESTful API 的输出 BODY 进行 JSON 格式化后, 进行展示。 JSON 格式--format=json, 不支持任何其它参数。 Json 格式是经过命令开发人员手工优化的输出, 其定义在命令定义文件的 output/json 章节。 采用 Handerbar 模板, 对原生的数据(包括各种内部数据、输入输出数据等)进行聚合、优化、整合等, 进行友好展示结果。TABLE表格格式--format=table, 可以不带参数, 也可以对展示列进行指定。 表格格式采用类似文本表格的模式, 对输出数据进行二维展示。 hcloud ecs list --format=table ┌─────┬────────────────┬─────────────────┬────────────────────────┬───────┐ │Index│ Id │ Name │ IP Address │Status │ ├─────┼────────────────┼─────────────────┼────────────────────────┼───────┤ │ 1│73ac0862-09f8...│crc-cluster-15536│192.168.0.10|49.4.87.246│ACTIVE │ │ 2│a44e57e8-a37c...│abchow-docker │192.168.0.128 │SHUTOFF│ └─────┴────────────────┴─────────────────┴────────────────────────┴───────┘表格中“列”的定义, 在 output/table 中进行定义。 支持指定最大宽度、Label、数据来源、对齐模式(默认左对齐,支持居中对齐、右对齐)等。根据需要, 可以只显示其中的一列或者几列, 可以指定需要显示的列, 采用 --format="table(col1,col2,col3)" 的格式进行指定, 如:hcloud ecs list --format="table(index,id,name,status)" ┌─────┬────────────────────────────────────┬─────────────────┬───────┐ │Index│ Id │ Name │Status │ ├─────┼────────────────────────────────────┼─────────────────┼───────┤ │ 1│73ac0862-09f8-4912-af76-04052ef42f74│crc-cluster-15536│ACTIVE │ │ 2│a44e57e8-a37c-4bcc-b388-a98ab0a51867│abchow-docker │SHUTOFF│ └─────┴────────────────────────────────────┴─────────────────┴───────┘有指定列的时候, 配置中指定的“最大宽度”不发生作用, 将字符串的全部数据展示出来, 以满足用户的完整需求。CSV 文本格式--format=csv, 可以不带参数--format=csv(col1,col2,col3), 也可以对展示列进行指定。 CSV文本模式时, 采用逗号(,)对标题和值进行分隔, 便于其它脚本script对输出进行处理。 命令示例如下:hcloud ecs list --format="csv(index,id,name,status)" Index,Id,Name,Status 1,73ac0862-09f8-4912-af76-04052ef42f74,crc-cluster-15536,ACTIVE 2,a44e57e8-a37c-4bcc-b388-a98ab0a51867,abchow-docker,SHUTOFFVALUE 纯值格式--format=value, 可以不带参数--format=value(col1,col2,col3), 也可以对展示列进行指定。 VALUE文本模式时,如果有多列, 采用逗号(,)对进行分隔, 便于其它脚本script对输出进行处理。 命令示例如下:hcloud ecs list --format="csv(index,id,name,status)" 1,73ac0862-09f8-4912-af76-04052ef42f74,crc-cluster-15536,ACTIVE 2,a44e57e8-a37c-4bcc-b388-a98ab0a51867,abchow-docker,SHUTOFF如果只有单列:hcloud ecs list --format="value(id)" 73ac0862-09f8-4912-af76-04052ef42f74 a44e57e8-a37c-4bcc-b388-a98ab0a51867最佳实践虚拟机域名访问全流程用户登录系统hcloud iam login 用户名 密码 { "result": "201 Created", "expires_at": "2019-02-08T15:04:19.073000Z" }如果是子账号登录hcloud iam login 子账号 密码 域名称/主账号 { "result": "201 Created", "expires_at": "2019-02-08T15:06:09.017000Z" }查询当前虚拟机情况hcloud ecs list --format=table ┌─────┬────────────────┬─────────────────┬────────────────────────┬───────┐ │Index│ Id │ Name │ IP Address │Status │ ├─────┼────────────────┼─────────────────┼────────────────────────┼───────┤ │ 1│73ac0862-09f8...│crc-cluster-15536│192.168.0.10|49.4.87.246│SHUTOFF│ │ 2│a44e57e8-a37c...│abchow-docker │192.168.0.128 │SHUTOFF│ └─────┴────────────────┴─────────────────┴────────────────────────┴───────┘当前磁盘镜像查询hcloud ims list --id=a347c189-4d3a-4096-bd72-0ad2be959470 --format=table ┌─────┬────────────────────────────────────┬─────────────────────────┬───────┬───────┬────────┬──────┐ │Index│ Id │ Name │OS Type│Min_ram│Min_disk│Status│ ├─────┼────────────────────────────────────┼─────────────────────────┼───────┼───────┼────────┼──────┤ │ 1│a347c189-4d3a-4096-bd72-0ad2be959470│Ubuntu 18.04 server 64bit│Linux │1024 │40 │active│ └─────┴────────────────────────────────────┴─────────────────────────┴───────┴───────┴────────┴──────┘获取当前存在的VPC和子网hcloud vpc list --format=table ┌────────────────────────────────────┬────────┬──────────────┬──────┐ │ Id │ Name │ Cidr │Status│ ├────────────────────────────────────┼────────┼──────────────┼──────┤ │1f30f26a-f6cd-4626-bf41-da4864529616│ │192.168.0.0/16│OK │ │2d203648-d1cd-4782-a083-0d5323f8ca72│ │192.168.0.0/16│OK │ │45825956-13e0-4e04-9364-606f94ce3011│ │192.168.0.0/16│OK │ │4a0ff926-978b-4dae-be68-37640d513a1c│ │192.168.0.0/16│OK │ │4c3de781-6762-405c-a802-05f2e8c1fdcc│vpc-paas│192.168.0.0/16│OK │ │5066abd7-5c81-4298-9772-3fad6ddd90a3│myvpc │172.20.0.0/16 │OK │ │5c4d190b-55d6-4f70-822e-fc76ac31266a│ │192.168.0.0/16│OK │ │842c2ab8-0326-48be-97ac-f5a14b809f9e│ │192.168.0.0/16│OK │ │87eeadef-2716-4e51-a81b-8e7a5d2be023│ │192.168.0.0/16│OK │ │995bd92b-e1e2-40b3-a7bd-03e97c9b0560│ │192.168.0.0/16│OK │ │99b0eec9-565f-4f41-a52a-a21263d1c235│ │192.168.0.0/16│OK │ │9d1b88bc-5f94-445d-9fc3-c5a66332d4d9│ │192.168.0.0/16│OK │ │b7b6eb7e-19e5-47d2-ab8b-0e2fb6dc33a9│ │192.168.0.0/16│OK │ │c813be70-48f2-4d89-9153-4b4832a875e0│ │192.168.0.0/16│OK │ │f8f4dc7d-4784-487c-a079-eafa3d5cfed8│ │192.168.0.0/16│OK │ │fbf6db89-32a4-415a-885b-a54e08b0384f│ │192.168.0.0/16│OK │ └────────────────────────────────────┴────────┴──────────────┴──────┘获取 VPC 下的子网hcloud vpc subnet/list --format=table ┌────────────────────────────────────┬───────────┬────────────────────────────────────┬───────────────┬────────────┬────┬──────┐ │ Id │ Name │ VPC │ Cidr │ Gateway │DHCP│Status│ ├────────────────────────────────────┼───────────┼────────────────────────────────────┼───────────────┼────────────┼────┼──────┤ │18214a77-c396-409a-b181-8d0b240f4a0b│subnet1 │1f30f26a-f6cd-4626-bf41-da4864529616│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │1dbd8f82-15ab-4f5d-8937-b1a1dc0d1b61│subnet1 │45825956-13e0-4e04-9364-606f94ce3011│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │26cfab59-10e6-4503-be50-aec829820109│subnet1 │fbf6db89-32a4-415a-885b-a54e08b0384f│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │2aa5d37e-205c-4256-920f-951f514dc522│subnet1 │995bd92b-e1e2-40b3-a7bd-03e97c9b0560│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │3cdfa0d0-c39c-4a6a-a4f8-926744e572c2│subnet1 │5c4d190b-55d6-4f70-822e-fc76ac31266a│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │423b253a-d5f3-4915-8990-2d2c302b68c6│mysubnet │5066abd7-5c81-4298-9772-3fad6ddd90a3│172.20.1.0/24 │172.20.1.1 │true│ACTIVE│ │4d62391d-e6f9-435e-8fba-8a2e3682f03c│subnet1 │87eeadef-2716-4e51-a81b-8e7a5d2be023│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │6cbfe2f6-36a1-46d7-beef-19ae0e4b3351│subnet1 │b7b6eb7e-19e5-47d2-ab8b-0e2fb6dc33a9│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │7446c808-68df-4e6d-9f80-b5b1a86d049f│subnet1 │4a0ff926-978b-4dae-be68-37640d513a1c│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │7**5d85-94ae-4f7b-8833-d31eaf62e827│subnet1 │3413fe9e-83bf-4a9b-b020-c8999adc89cb│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │889e7f27-231a-4bf6-a3cf-8339e6746ba5│subnet1 │c813be70-48f2-4d89-9153-4b4832a875e0│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │9dfcb3e7-9be9-464d-8f53-fe42787beb94│subnet1 │2d203648-d1cd-4782-a083-0d5323f8ca72│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │c9f75b54-078d-4cdc-b31f-0e9d9f30a837│subnet1 │56284d2a-518e-4800-85bb-2cd3dacad53e│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │cc00a4f0-ca72-4119-a6be-9012f6c2ac6a│subnet-paas│4c3de781-6762-405c-a802-05f2e8c1fdcc│192.168.0.0/24 │192.168.0.1 │true│ACTIVE│ │d0834208-0025-46c0-bc45-9c9345b1d065│subnet1 │f8f4dc7d-4784-487c-a079-eafa3d5cfed8│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │e2926843-60d0-4d43-ac47-a9e48fb255d7│subnet1 │9d1b88bc-5f94-445d-9fc3-c5a66332d4d9│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │e3192175-096f-4343-b4ae-e473f1c50a1b│subnet1 │99b0eec9-565f-4f41-a52a-a21263d1c235│192.168.20.0/24│192.168.20.1│true│ACTIVE│ │f8576dc0-0ef2-4603-8dcf-f0eec6e7bd65│subnet1 │842c2ab8-0326-48be-97ac-f5a14b809f9e│192.168.20.0/24│192.168.20.1│true│ACTIVE│ └────────────────────────────────────┴───────────┴────────────────────────────────────┴───────────────┴────────────┴────┴──────┘查询指定 VPC 下的子网列表hcloud vpc subnet/list 4c3de781-6762-405c-a802-05f2e8c1fdcc --format=table ┌────────────────────────────────────┬───────────┬────────────────────────────────────┬──────────────┬───────────┬────┬──────┐ │ Id │ Name │ VPC │ Cidr │ Gateway │DHCP│Status│ ├────────────────────────────────────┼───────────┼────────────────────────────────────┼──────────────┼───────────┼────┼──────┤ │cc00a4f0-ca72-4119-a6be-9012f6c2ac6a│subnet-paas│4c3de781-6762-405c-a802-05f2e8c1fdcc│192.168.0.0/24│192.168.0.1│true│ACTIVE│ └────────────────────────────────────┴───────────┴────────────────────────────────────┴──────────────┴───────────┴────┴──────┘创建一个VMhcloud ecs create myvm --image=a347c189-4d3a-4096-bd72-0ad2be959470 --vpc=4c3de781-6762-405c-a802-05f2e8c1fdcc --subnet=cc00a4f0-ca72-4119-a6be-9012f6c2ac6a { "begin_time" : "2019-02-07T21:37:10.619Z", "end_time" : "2019-02-07T21:38:15.807Z", "error_code" : null, "fail_reason" : null, "status" : "SUCCESS", "entities" : { "sub_jobs_total" : 1, "sub_jobs" : [ { "job_id" : "8aace0c6689a2a300168c9e4a26d2313", "job_type" : "createSingleServer", "begin_time" : "2019-02-07T21:37:10.765Z", "end_time" : "2019-02-07T21:38:09.710Z", "error_code" : null, "fail_reason" : null, "status" : "SUCCESS", "entities" : { "server_id" : "a8077071-1e1e-4ef2-bcf2-ec9b3adf6e09" } } ] }, "job_id" : "8aace0c6689a2a300168c9e4a1dc2310", "job_type" : "createServer" }检查VM创建情况:hcloud ecs list --format=table ┌─────┬────────────────────────────────────┬─────────────────┬────────────────────────┬───────┐ │Index│ Id │ Name │ IP Address │Status │ ├─────┼────────────────────────────────────┼─────────────────┼────────────────────────┼───────┤ │ 1│a8077071-1e1e-4ef2-bcf2-ec9b3adf6e09│myvm │192.168.0.129 │ACTIVE │ │ 2│73ac0862-09f8-4912-af76-04052ef42f74│crc-cluster-15536│192.168.0.10|49.4.87.246│ACTIVE │ │ 3│a44e57e8-a37c-4bcc-b388-a98ab0a51867│abchow-docker │192.168.0.128 │SHUTOFF│ └─────┴────────────────────────────────────┴─────────────────┴────────────────────────┴───────┘使用完成后停机并删除该VMhcloud ecs shutdown a8077071-1e1e-4ef2-bcf2-ec9b3adf6e09 hcloud ecs delete a8077071-1e1e-4ef2-bcf2-ec9b3adf6e09 hcloud ecs list --format=table ┌─────┬────────────────────────────────────┬─────────────────┬────────────────────────┬───────┐ │Index│ Id │ Name │ IP Address │Status │ ├─────┼────────────────────────────────────┼─────────────────┼────────────────────────┼───────┤ │ 1│73ac0862-09f8-4912-af76-04052ef42f74│crc-cluster-15536│192.168.0.10|49.4.87.246│ACTIVE │ │ 2│a44e57e8-a37c-4bcc-b388-a98ab0a51867│abchow-docker │192.168.0.128 │SHUTOFF│ └─────┴────────────────────────────────────┴─────────────────┴────────────────────────┴───────┘
-
使用vpc的endpoint调用“查询安全组列表”的API,提示“API not found”,请问啥原因?
-
本文将结合一个具体例子中的细节详细描述Istio调用链的原理和使用方式。并基于Istio中埋点的原理解释来说明:为了输出一个质量良好的调用链,业务程序需根据自身特点做适当的修改,即并非官方一直在说的完全无侵入的做各种治理。另外还会描述Istio当前版本中收集调用链数据可以通过Envoy和Mixer两种不同的方式。Istio一直强调其无侵入的服务治理,服务运行可观察性。即用户完全无需修改代码,就可以通过和业务容器一起部署的proxy来执行服务治理和与性能数据的收集。原文是这样描述的:Istio makes it easy to create a network of deployed services with load balancing, service-to-service authentication, monitoring, and more, without any changes in service code. You add Istio support to services by deploying a special sidecar proxy throughout your environment that intercepts all network communication between microservices, then configure and manage Istio using its control plane functionality。调用链的埋点是一个比起来记录日志,报个metric或者告警要复杂的多,根本原因是要能将在多个点上收集的关于一次调用的多个中间请求过程关联起来形成一个链。Dapper, a Large-Scale Distributed Systems Tracing Infrastructure 描述了其中的原理和一般性的机制,还是挺复杂的。也有很多实现,用的比较多的如zipkin,和已经在CNCF基金会的用的越来越多的Jaeger,满足Opentracing语义标准的就有这么多。在Istio中大段的埋点逻辑在Sidecar中已经提供,业务代码不用调用以上这些埋点方式来创建trace,维护span等这些复杂逻辑,但是为了能真正连接成一个完整的链路,业务代码还是需要做适当修改。我们来分析下细节为什么号称不用修改代码就能搞定治理、监控等高级功能的Sidecar为什么在调用链埋点的时候需要改应用代码。调用详细服务调用关系简单期间,我们以Istio最经典的Bookinfo为例来说明。Bookinfo的4个为服务的调用关系是这样: 调用链输出从前端入口gateway那个envoy上进行一次调用,到四个不同语言开发的服务间完成调用,一次调用输出的调用链是这样:简单看下bookinfo 中的代码,能看到并没有任何创建维护span这种埋点的逻辑,想也是,对于python、java、ruby、nodejs四种不同的语言采用不同的埋点的库在来实现类似的埋点逻辑也是非常头痛的一件事情。那我们看到这个调用链信息是怎么输出的?答案当然是应用边上的sidecar Envoy,Envoy对于调用链相关设计参照这里。sidecar拦截应用程序所有的进和出的网络流量,跟踪到所有的网络请求,像Service mesh的设计理念中其他的路由策略、负载均衡等治理一样,只要拦截到流量Sidecar也可以实现埋点的逻辑。埋点逻辑对于经过sidecar流入应用程序的流量,如例子中流入roductpage, details、reviews和ratings的流量,如果经过Sidecar时header中没有任何跟踪相关的信息,则会在创建一个span,Traceid就是这个spanId,然后在将请求传递给通pod的业务服务;如果请求中包含trace相关的信息,则sidecar从走回归提取trace的上下文信息并发给应用程序。对于经过sidecar流出的流量,如例子中gateway调用productpage,或者productpage调用链details和reviews的请求。如果经过sidecar时header中没有任何跟踪相关的信息,则会创建根span,并将该跟span相关上下文信息放在请求头中传递给下一个调用的服务,当然调用前会被目标服务的sidecar拦截掉执行上面流入的逻辑;当存在trace信息时,sidecar从header中提取span相关信息,并基于这个span创建子span,并将新的span信息加在请求头中传递。以上是bookinfo一个实际的调用中在proxy上生成的span主要信息。可以看到,对于每个app访问都经过Sidecar代理,inbound的流量和outbound的流量都通过Sidecar。图上为了清楚表达每个将对Sidecar的每个处理都分开表示,如productpage,接收外部请求是一个处理,给details发出请求是一个处理,给reviews发出请求是另外一个处理,因此围绕Productpage这个app有三个黑色的处理块,其实是一个Sidecar。为了不使的图上太凌乱,最终的Response都没有表示。其实图上每个请求的箭头都有一个反方向的response,在服务发起方的Sidecar会收到response时,会记录一个CR(client received)表示收到响应的时间并计算整个span的持续时间。解析下具体数据,结合实际调用中生成的数据来看下前面proxy埋点的逻辑会更清楚些。1.从gateway开始,gateway作为一个独立部署在一个pod中的envoy进程,当有请求过来时,它会将请求转给入口的微服务productpage。Gateway这个Envoy在发出请求时里面没有trace信息,会生成一个根span:spanid和traceid都是f79a31352fe7cae9,parentid为空,并记录CS时间,即Client Send;2.请求从入口gateway这个envoy进入productpage前先讲过productpage pod内的envoy,envoy处理请求头中带着trace信息,则记录SR,Server received,并将请求发送给Productpage业务容器处理,productpage在处理请求的业务方法中需要接收这些header中的trace信息,然后再调用Details和Reviews的微服务。Python写的 productpage在服务端处理请求时,先从request中提取接收到的header。然后再调用details获取details服务时,将header转发出去。app.route('/productpage') def front(): product_id = 0 # TODO: replacedefault value headers = getForwardHeaders(request) … detailsStatus, details = getProductDetails(product_id, headers) reviewsStatus, reviews = getProductReviews(product_id, headers) return…可以看到就是提取几个trace相关的header kvdef getForwardHeaders(request): headers = {} incoming_headers = [ 'x-request-id', 'x-b3-traceid', 'x-b3-spanid', 'x-b3-parentspanid', 'x-b3-sampled', 'x-b3-flags', 'x-ot-span-context' ] for ihdr in incoming_headers: val = request.headers.get(ihdr) if val is not None: headers[ihdr] = val return headers其实就是重新构造一个请求发出去,可以看到请求中包含收到的header。def getProductReviews(product_id, headers): url = reviews['name'] + "/" + reviews['endpoint'] + "/" + str(product_id) res = requests.get(url, headers=headers, timeout=3.0)3.从ProductPage出的请求去请求Reviews服务前,又一次通过同Pod的envoy,envoy埋点逻辑检查header中包含了trace相关信息,在将请求发出前会做客户端的调用链埋点,即以当前span为parent span,生成一个子span:即traceid:保持一致9a31352fe7cae9, spanid重新生成cb4c86fb667f3114,parentid就是上个span: f79a31352fe7cae9。4.请求在到达Review业务容器前,先经过Review的Envoy,从Header中解析出trace信息存在,则发送Trace信息给Reviews。Reviews处理请求的服务端代码中需要解析出这些包含trace的Header信息。reviews服务中java的rest代码如下:@GET @Path("/reviews/{productId}") public Response bookReviewsById(@PathParam("productId") int productId, @HeaderParam("end-user") String user, @HeaderParam("x-request-id") String xreq, @HeaderParam("x-b3-traceid") String xtraceid, @HeaderParam("x-b3-spanid") String xspanid, @HeaderParam("x-b3-parentspanid") String xparentspanid, @HeaderParam("x-b3-sampled") String xsampled, @HeaderParam("x-b3-flags") String xflags, @HeaderParam("x-ot-span-context") String xotspan)即在服务端接收请求的时候也同样会提取header。调用Ratings服务时再传递下去。其他的productpage调用Details,Reviews调用Ratings逻辑类似。不再复述。以一实际调用的例子了解以上调用过程的细节,可以看到Envoy在处理inbound和outbound时的埋点逻辑,更重要的是看到了在这个过程中应用程序需要配合做的事情。即需要接收trace相关的header并在请求时发送出去,这样在出流量的proxy向下一跳服务发起请求前才能判断并生成子span并和原span进行关联,进而形成一个完整的调用链。否则,如果在应用容器未处理Header中的trace,则Sidecar在处理outbound的请求时会创建根span,最终会形成若干个割裂的span,并不能被关联到一个trace上。即虽然Istio一直是讲服务治理和服务的可观察性对业务代码0侵入。但是要获得一个质量良好的调用链,应用程序还是要配合做些事情。在官方的distributed-tracing 中这部分有描述:“尽管proxy可以自动生成span,但是应用程序需要在类似HTTP Header的地方传递这些span的信息,这样这些span才能被正确的链接成一个trace。因此要求应用程序必须要收集和传递这些trace相关的header并传递出去”• x-request-id• x-b3-traceid• x-b3-spanid• x-b3-parentspanid• x-b3-sampled• x-b3-flags• x-ot-span-context调用链阶段span解析:前端gateway访问productpage的proxy的这个span大致是这样:"traceId": "f79a31352fe7cae9", "id": "f79a31352fe7cae9", "name": "productpage-route", "timestamp": 1536132571838202, "duration": 77474, "annotations": [ { "timestamp": 1536132571838202, "value": "cs", "endpoint": { "serviceName": "istio-ingressgateway", "ipv4": "172.16.0.28" } }, { "timestamp": 1536132571839226, "value": "sr", "endpoint": { "serviceName": "productpage", "ipv4": "172.16.0.33" } }, { "timestamp": 1536132571914652, "value": "ss", "endpoint": { "serviceName": "productpage", "ipv4": "172.16.0.33" } }, { "timestamp": 1536132571915676, "value": "cr", "endpoint": { "serviceName": "istio-ingressgateway", "ipv4": "172.16.0.28" } } ],gateway上报了个cs,cr, productpage的那个proxy上报了个ss,sr。分别表示gateway作为client什么时候发出请求,什么时候最终受到请求,productpage的proxy什么时候收到了客户端的请求,什么时候发出了response。Reviews的span如下:"traceId": "f79a31352fe7cae9", "id": "cb4c86fb667f3114", "name": "reviews-route", "parentId": "f79a31352fe7cae9", "timestamp": 1536132571847838, "duration": 64849, Details的span如下:"traceId": "f79a31352fe7cae9", "id": "951a4487642c0966", "name": "details-route", "parentId": "f79a31352fe7cae9", "timestamp": 1536132571842677, "duration": 2944,可以看到productpage这个微服务和detail和reviews这两个服务的调用。一个细节就是traceid就是第一个productpage span的id,所以第一个span也称为根span,而后面两个review和details的span的parentid是前一个productpage的span的id。Ratings 服务的span信息如下:可以看到traceid保持一样,parentid就是reviews的spanid。"traceId": "f79a31352fe7cae9", "id": "5aac176b61ec8d84", "name": "ratings-route", "parentId": "cb4c86fb667f3114", "timestamp": 1536132571889086, "duration": 1449,当然在Jaeger里上报会是这个样子:根据一个实际的例子理解原理后会发现,应用程序要修改代码根本原因就是调用发起方,在Isito里其实就是Sidecar在处理outbound的时生成span的逻辑,而这个埋点的代码和业务代码不在一个进程里,没法使用进程内的一些类似ThreadLocal的方式(threadlocal在golang中也已经不支持了,推荐显式的通过Context传递),只能显式的在进程间传递这些信息。这也能理解为什么Istio的官方文档中告诉我们为了能把每个阶段的调用,即span,串成一个串,即完整的调用链,你需要修你的代码来传递点东西。当然实例中只是对代码侵入最少的方式,就是只在协议头上机械的forward这几个trace相关的header,如果需要更多的控制,如在在span上加特定的tag,或者在应用代码中代码中根据需要构造一个span,可以使用opentracing的StartSpanFromContext 或者SetTag等方法。调用链数据上报Envoy上报一个完整的埋点过程,除了inject、extract这种处理span信息,创建span外,还要将span report到一个调用链的服务端,进行存储并支持检索。在Isito中这些都是在Envoy这个sidecar中处理,业务程序不用关心。在proxy自动注入到业务pod时,会自动刷这个后端地址。如: 即envoy会连接zipkin的服务端上报调用链数据,这些业务容器完全不用关心。当然这个调用链收集的后端地址配置成jaeger也是ok的,因为Jaeger在接收数据是兼容zipkin格式的。Mixers上报除了直接从Envoy上报调用链到zipkin后端外,和其他的Metric等遥测数据一样通过Mixer这个统一面板来收集也是可行的。即如tracespan中描述,创建一个tracespan的模板,来描述从mixer的一次访问中提取哪些数据,可以看到trace相关的几个ID从请求的header中提取,而访问的很多元数据有些从访问中提取,有些根据需要从pod中提取(背后去访问了kubeapiserver的pod资源)apiVersion: "config.istio.io/v1alpha2" kind: tracespan metadata: name: default namespace: istio-system spec: traceId: request.headers["x-b3-traceid"] spanId: request.headers["x-b3-spanid"] | "" parentSpanId: request.headers["x-b3-parentspanid"] | "" spanName: request.path | "/" startTime: request.time endTime: response.time clientSpan: (context.reporter.local | true) == false rewriteClientSpanId: false spanTags: http.method: request.method | "" http.status_code: response.code | 200 http.url: request.path | "" request.size: request.size | 0 response.size: response.size | 0 source.ip: source.ip | ip("0.0.0.0") source.service: source.service | "" source.user: source.user | "" source.version: source.labels["version"] | ""最后在这个文章发出前,一直在和社区沟通,督促在更明晰的位置告诉大家用Istio的调用链需要修改些代码,而不是只在一个旮旯的位置一小段描述。得到回应是1.1中社区首页第一页what-is-istio/已经修改了这部分说明,不再是1.0中说without any changes in service code,而是改为with few or no code changes in service code。提示大家在使用Isito进行调用链埋点时,应用程序需要进行适当的修改。当然了解了其中原理,做起来也不会太麻烦。参照https://thenewstack.io/distributed-tracing-istio-and-your-applications/ https://github.com/istio/old_mixer_repo/issues/797 http://www.idouba.net/opentracing-serverside-tracing/
-
近期很多厂家在讨论完方案后准备接入OC 公有云平台调测,但是不知道资源怎么获取,现在简单写下,希望对大家有帮助流程简单如下:NB-IoT方案使用IoT增强版进行调测1)申请测试资源,获取测试账号及密码申请链接,登录首页,点击开发者平台按钮,申请开通前需要先实名认证,账号密码邮箱短信通知到华为云租户账号https://www.huaweicloud.com/product/iot.html2)获取IoT平台接入信息开发者环境统一参考链接接入信息,NB-IoT使用CoAP协议栈接入https://bbs.huaweicloud.com/forum/thread-11864-1-1.html3)调测API文档说明参考线上IoT增强版API接口说明,重点看接入鉴权,订阅数据变化通知,推送数据几个API能力https://support.huaweicloud.com/api-IoT/iot_06_0003.html目前常用的两个关键场景是上报数据 命令下发 基本上测试都是围绕这两个场景展开
-
在这个帖子,我会将所有IoT平台开放给应用服务器的接口都调用一遍,并分别介绍各个接口需要注意的地方以及容易出现的问题,还会附上接口调用时的抓包。关于接口的说明,请参考https://support.huaweicloud.com/api-IoT/iot_06_0002.html1、鉴权接口的调用2、刷新Token接口的调用3、订阅接口的调用4、注册直连设备接口的调用5、设置设备信息接口的调用6、[NB-IoT]查询设备激活状态的接口调用7、删除设备的接口调用8、批量查询设备信息列表的接口调用9、查询单个设备信息接口的调用10、查询设备历史数据接口的调用11、查询设备服务能力接口的调用12、[NB-IoT]投递异步命令接口的调用13、[NB-IoT]查询异步命令接口的调用
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签