华为云用户手册

  • 响应参数 状态码: 400 表4 响应Body参数 参数 参数类型 描述 error_code String 错误码 error_description String 请求参数错误。 状态码: 401 表5 响应Body参数 参数 参数类型 描述 error_code String 错误码 error_description String 校验TOKEN失败。 状态码: 403 表6 响应Body参数 参数 参数类型 描述 error_code String 错误码 error_description String 租户无权限操作。 状态码: 404 表7 响应Body参数 参数 参数类型 描述 error_code String 错误码 error_description String 没有找到CBH资源。
  • 响应参数 状态码: 200 表3 响应Body参数 参数 参数类型 描述 tags Array of Tags objects 标签列表。 表4 Tags 参数 参数类型 描述 key String 键。 说明: 说明: key不能为空,长度1~128个字符(中文也可以输入128个字符) 可用 UTF-8 格式表示的字母(包含中文)、数字和空格,以及以下字符: _ . : = + - @ _sys_开头属于系统标签,租户不能输入 建议正则:^((?!sys)[\p{L}\p{Z}\p{N}_.:=+\-@]*)$ values Array of strings 值列表。 说明: 说明: 长度0~255个字符(中文也可以输入255个字符) 可用 UTF-8 格式表示的字母(包含中文)、数字和空格,以及以下字符: _ . : / = + - @ 建议正则:^([\p{L}\p{Z}\p{N}_.:/=+-@]*)$ 资源标签值可以为空(empty or null) 预定义标签值不可以为空 状态码: 400 表5 响应Body参数 参数 参数类型 描述 error_code String 错误码 error_description String 请求参数错误。 状态码: 401 表6 响应Body参数 参数 参数类型 描述 error_code String 错误码 error_description String 校验TOKEN失败。 状态码: 403 表7 响应Body参数 参数 参数类型 描述 error_code String 错误码 error_description String 租户无权限操作。 状态码: 404 表8 响应Body参数 参数 参数类型 描述 error_code String 错误码 error_description String 没有找到CBH资源。
  • 采样结果 如下图1和图2所示,对于某个逻辑场景进行拉丁超立方和蒙特卡洛采样,参数都是符合随机特性,但采样得到的值不相同。 对于同样的采样点数,拉丁超立方采样的结果会更加分散,并且边界值会更多。 图4 蒙特卡洛采样结果 图5 拉丁超立方采样结果 对于离散型参数,联合概率分布采样会根据给定的取值列表进行随机采样。 图6 离散型参数-联合概率分布采样结果 对于连续型参数,联合概率分布采样会根据参数分布和相关系数进行采样。 图7 连续型参数-联合概率分布采样结果 对于重要性采样,联合概率分布采样会在边界附近进行采样。 图8 重要性采样结果
  • 性能相关 规范 业务程序禁止执行全表扫描的查询。 执行查询时,只选择需要返回的字段,不需要的字段不要返回。从而减少网络和进程处理的负载,修改数据时,只修改变化需要修改的字段,不要整个对象直接存储全部修改。 避免使用$not。DDS并不会对缺失的数据进行索引,因此$not的查询条件将会要求在一个结果集中扫描所有记录。如果$not是唯一的查询条件,会对集合执行全表扫描。 用$and时把匹配最少结果的条件放在最前面,用$or时把匹配最多结果的条件放在最前面。 单个实例中,数据库的总的个数不要超过200个,总的集合个数不要超过500个。集合数量过多会导致内存压力变高,并且集合数量多会导致重启以及主备倒换性能变差,影响紧急情况下的高可用性能。 业务上线前,一定要对数据库进行性能压测,评估业务峰值场景下,对数据库的负载情况。 禁止同时执行大量并发事务,且长时间不提交。 业务正式上线前, 所有的查询类别,都应该先执行查询计划检查查询性能。 建议 每个连接在后台都是由一个单独线程处理,每个线程会分配1MB的栈内存。所以连接数不宜过多,否则会占用过多的内存。 使用连接池,避免频繁的建立连接和断开连接,否则会导致CPU过高。 减少磁盘读写:避免使用不必要的upsert命令,避免查询不必要的数据。 优化数据分布:对数据进行分片,同时分散热点数据,均衡地使用实例资源。如何进行数据分片,请参见设置数据分片。 减少锁冲突:避免对同一个Key过于频繁地操作。 减少锁等待:避免前台创建索引。 注意 开发过程中对集合的每一个操作都要通过执行explain()检查其执行计划,如: db.T_DeviceData.find({"deviceId":"ae4b5769-896f"}).explain(); db.T_DeviceData.find({"deviceId":"77557c2-31b4"}).explain("executionStats"); 对于查询而言,因为覆盖查询不需要读取文档,而是直接从索引中返回结果,这样的查询性能好,所以尽可能使用索引覆盖查询。如果explain()的输出显示indexOnly字段为真,则说明这个查询就被一个索引覆盖。 执行计划解析: 看执行时间:executionStats.executionStages.executionTimeMillisEstimate和executionStats.executionStages.inputStage. executionTimeMillisEstimate时间越短越好。 executionStats.executionTimeMillis表示执行计划选择和执行的所有时间。 executionStats.executionStages.executionTimeMillisEstimate表示执行计划的执行完成时间。 executionStats.executionStages.inputStage. executionTimeMillisEstimate表示执行计划下的子阶段执行完成时间。 看扫描条数:三个条目数相同为最佳。 executionStats. nReturned表示匹配查询条件的文档数。 executionStats .totalKeysExamined表示索引扫描条目数。 executionStats .totalDocsExamined表示文档扫描条目数。 看Stage状态,性能较好的Stage状态组合如下。 Fetch+IDHACK Fetch+ixscan Limit+(Fetch+ixscan) PROJECTION+ixscan 表1 状态说明 状态名称 描述 COLLSCAN 全表扫描 SORT 内存中进行排序 IDHACK 根据_id进行查询 TEXT 全文索引 COUNTSCAN 未用索引计数 FETCH 索引扫描 LIMIT 使用Limit限制返回数 SUBPLA 未用索引的$or查询阶段 PROJECTION 限定返回字段时stage的返回 COUNT_SCAN 使用索引计数
  • 数据库连接 使用DDS时,可能会遇到因为Mongod/dds mongos的连接数满了,导致客户端无法连接的问题。在Mongod/dds mongos的服务端,收到一个新的连接由一个单独的线程来处理,每个线程配置了1MB的栈空间,当网络连接数太多时,过多的线程会导致上下文切换开销变大,同时内存开销也会上涨。 客户端连接数据库的时候,要计算业务一共有多少个客户端,每个客户端配置的连接池大小是多少,总的连接数不要超过当前实例能承受的最大连接数的80%。 客户端与数据库的连接应尽量保持相对稳定的状态,每秒新增连接数建议保持在10以下。 建议客户端的连接超时时间至少设置为最大业务执行时长的3倍。 对于副本集实例,客户端需要同时配置主备节点的IP地址;对于集群实例,至少配置两个dds mongos的IP地址。 DDS默认提供rwuser用户,使用rwuser用户登录时认证库必须是admin。
  • 索引分类 索引分类 说明 默认索引 在创建集合期间,DDS在_id字段上创建唯一索引。该索引可防止客户端插入两个具有相同值的文档。你不能将_id字段上的index删除。 在分片群集中,如果您不使用_id字段作为分片键,应用程序需要确保_id字段中值的唯一性以防止错误。这通常是通过使用标准的自动生成的ObjectId来完成的。 单字段索引 除DDS定义的_id索引外,DDS还支持在文档的单个字段上创建用户定义的升序/降序索引。 对于单字段索引和排序操作,索引键的排序顺序(升序或降序)并不重要,因为DDS可以从任何方向遍历索引。 复合索引 DDS还支持多个字段上的用户定义索引,即复合索引。 复合索引中列出的字段的顺序具有重要意义。例如,如果一个复合索引由{userid: 1, score: -1}组成,索引首先按userid排序,然后在每个userid值内按score排序。 对于复合索引和排序操作,索引键的排序顺序(升序或降序)可以决定索引是否支持排序操作。 多键索引 DDS使用多键索引来索引存储在数组中的内容。如果索引包含数组值的字段,DDS为数组的每个元素创建单独的索引项。这些多键索引允许查询通过匹配数组的一个或多个元素来选择包含数组的文档。DDS自动决定是否创建一个多键索引,如果索引字段包含数组值,您不需要显式地指定多键类型。
  • 创建索引 DDS使用如下命令创建索引: db.collection.createIndex(keys, options) key 值为你要创建的索引字段,1 为指定按升序创建索引,-1代表降序创建索引。 options接收可选参数,常用可选参数列表如下: Parameter Type Description background Boolean 默认值为false。 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引。 unique Boolean 默认值为false。 建立的索引是否唯一。指定为true创建唯一索引。 name string 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。 expireAfterSeconds integer 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。 创建索引。 单字段索引(Single Field Index) db.user.createIndex({"name": 1}) 上述语句针对name创建了单字段索引,其能加速对name字段的各种查询请求,是最常见的索引形式,DDS默认创建的id索引也是这种类型,{"name": 1} 代表升序索引,也可以通过{"name": -1}来指定降序索引,对于单字段索引,升序/降序效果是一样的。 复合索引(Compound Index) 复合索引是单子索引的升级版本,它针对多个字段联合创建索引,先按第一个字段排序,第一个字段相同的文档按第二个字段排序,依次类推。 db.user.createIndex({"name": 1, "age": 1} ) 多键索引 当索引的字段为数组时,创建出的索引称为多键索引。 多键索引会为数组的每个元素建立一条索引。 如果为user集合加入一个habit字段(数组)用于描述兴趣爱好,需要查询有相同兴趣爱好的人就可以利用habit字段的多键索引。 {“name” : “jack”, “age” : 19, habit: [“football, runnning”]} //这是person表的一条用户信息。 db.user.createIndex( {"habit": 1} ) //自动创建多key索引 db.user.find( {"habit": "football"} ) //查询有相同兴趣爱好的人 查看集合索引。 db.user.getIndexes() 删除集合所有索引。 db.user.dropIndexes() 删除集合指定索引。如下方式删除user集合中"name"索引。 db.user.dropIndex({"name": 1})
  • 注意事项 DDS除了支持多种不同类型的索引,还能对索引定制一些特殊的属性。 唯一索引(unique index):保证索引对应的字段不会出现相同的值,比如_id索引就是唯一索引。 TTL索引:可以针对某个时间字段,指定文档的过期时间(经过指定时间后过期 或 在某个时间点过期)。 部分索引(partial index): 只针对符合某个特定条件的文档建立索引。 稀疏索引(sparse index): 只针对存在索引字段的文档建立索引,可看做是部分索引的一种特殊情况。
  • 准备依赖资源 Kafka实例所需资源的具体要求和创建指导如表1所示。 表1 Kafka实例依赖资源 准备资源 要求 创建指导 VPC和子网 Kafka实例可以使用当前账号下已创建的VPC和子网,也可以使用新创建的VPC和子网,还可以使用共享VPC和子网,请根据实际需要进行配置。 共享VPC是基于 资源访问管理 (Resource Access Manager,简称 RAM )服务的机制,VPC的所有者可以将VPC内的子网共享给一个或者多个账号使用。通过共享VPC功能,可以简化网络配置,帮助您统一配置和运维多个账号下的资源,有助于提升资源的管控效率,降低运维成本。有关VPC子网共享的更多信息,请参见共享VPC。 在创建VPC和子网时应注意如下要求: 创建的VPC与Kafka实例在相同的区域。 创建VPC和子网时,配置参数建议使用默认配置。 创建VPC和子网的操作指导请参考创建虚拟私有云和子网,若需要在已有VPC上创建和使用新的子网,请参考为虚拟私有云创建新的子网。 安全组 不同的Kafka实例可以重复使用相同的安全组,也可以使用不同的安全组,请根据实际需要进行配置。 使用Kafka实例前,添加表2所示安全组规则,其他规则请根据实际需要添加。 说明: 创建安全组后,系统默认添加入方向“允许安全组内的弹性云服务器彼此通信”规则和出方向“放通全部流量”规则,此时使用内网通过同一个VPC访问Kafka实例,无需添加表2的规则。 创建安全组的操作指导请参考创建安全组,为安全组添加规则的操作指导请参考添加安全组规则。 弹性IP地址 在创建弹性IP地址时,应注意如下要求: 创建的弹性IP地址与Kafka实例在相同的区域。 弹性IP地址的数量必须与Kafka实例的代理个数相同。 Kafka控制台无法识别开启IPv6转换功能的弹性IP地址。 创建弹性IP地址的操作指导请参考申请弹性公网IP。 表2 安全组规则 方向 协议 端口 源地址 说明 入方向 TCP 9094 0.0.0.0/0 通过公网访问Kafka实例(关闭SSL加密)。 入方向 TCP 9092 0.0.0.0/0 使用内网通过同一个VPC访问Kafka实例(关闭SSL加密)。 使用对等连接跨VPC访问Kafka实例(关闭SSL加密)。 入方向 TCP 9095 0.0.0.0/0 通过公网访问Kafka实例(开启SSL加密)。 入方向 TCP 9093 0.0.0.0/0 使用内网通过同一个VPC访问Kafka实例(开启SSL加密)。 使用对等连接跨VPC访问Kafka实例(开启SSL加密)。 入方向 TCP 9011 198.19.128.0/17 通过 VPC终端节点 实现跨VPC访问Kafka实例(开启SSL加密和关闭SSL加密都适用)。 入方向 TCP 9011 0.0.0.0/0 使用DNAT访问Kafka实例(开启SSL加密和关闭SSL加密都适用)。
  • 部署服务相关权限说明 部署服务各维度的操作权限说明如下表所示。 应用默认权限说明 角色/动作 默认权限 创建 查看 修改 删除 执行 复制 禁用 新建环境 权限管理 应用创建者 - 有权限且不可修改 有权限且不可修改 有权限且不可修改 有权限且不可修改 有权限且不可修改 有权限且不可修改 有权限且不可修改 有权限且不可修改 项目管理员 有权限且不可修改 有权限且不可修改 有权限且不可修改 有权限且不可修改 有权限且不可修改 有权限且不可修改 有权限且不可修改 有权限且不可修改 有权限且不可修改 项目经理 有权限 有权限 有权限 有权限 有权限 有权限 有权限 有权限 有权限 产品经理 有权限 有权限 无权限 无权限 无权限 无权限 无权限 无权限 无权限 测试经理 无权限 有权限 无权限 无权限 无权限 无权限 无权限 无权限 无权限 运维经理 无权限 有权限 无权限 无权限 无权限 无权限 无权限 有权限 无权限 系统工程师 有权限 有权限 有权限 有权限 有权限 有权限 有权限 无权限 无权限 Committer 有权限 有权限 有权限 有权限 有权限 有权限 无权限 无权限 无权限 开发人员 有权限 有权限 有权限 有权限 有权限 有权限 无权限 无权限 无权限 测试人员 无权限 有权限 无权限 无权限 无权限 无权限 无权限 无权限 无权限 参与者 无权限 有权限 无权限 无权限 无权限 无权限 无权限 无权限 无权限 浏览者 无权限 有权限 无权限 无权限 无权限 无权限 无权限 无权限 无权限 主机集群默认权限说明 角色/权限 查看 编辑 删除 添加主机 复制主机 权限管理 主机集群创建者 有权限且不可修改 有权限且不可修改 有权限且不可修改 有权限且不可修改 有权限且不可修改 有权限且不可修改 项目创建者 有权限且不可修改 有权限且不可修改 有权限且不可修改 有权限且不可修改 有权限且不可修改 有权限且不可修改 项目经理 有权限 有权限 有权限 有权限 有权限 有权限 产品经理 有权限 无权限 无权限 无权限 无权限 无权限 测试经理 有权限 无权限 无权限 无权限 有权限 无权限 运维经理 有权限 无权限 无权限 无权限 有权限 无权限 系统工程师 有权限 无权限 无权限 无权限 无权限 无权限 Committer 有权限 无权限 无权限 无权限 无权限 无权限 开发人员 有权限 有权限 有权限 有权限 有权限 无权限 测试人员 有权限 无权限 无权限 无权限 有权限 无权限 参与者 有权限 无权限 无权限 无权限 有权限 无权限 浏览者 有权限 无权限 无权限 无权限 有权限 无权限 部署模板 操作 权限设定 系统模板 自定义模板 查看 所有用户 同租户下用户创建的 创建 所有用户都没权限 项目创建者、项目经理、开发人员 修改 所有用户都没权限 模板创建者、租户管理员 删除 所有用户都没权限 模板创建者、租户管理员
  • 通用型实例测试列表 表1 CPU:内存=1:2 CPU(Core) 内存(GB) TPS QPS IOPS 1 2 178.71 3574.29 请参见关于IOPS 2 4 372.52 7450.35 4 8 848.15 16963.08 8 16 1505.10 30101.94 表2 CPU:内存=1:4 CPU(Core) 内存(GB) TPS QPS IOPS 2 8 425.26 8505.16 请参见关于IOPS 4 16 879.52 17590.53 8 32 1764.29 35285.91
  • 通用型实例测试列表 表1 CPU:内存=1:2 CPU(Core) 内存(GB) TPS QPS IOPS 1 2 176.26 3525.27 请参见关于IOPS 2 4 385.70 7713.97 4 8 784.54 15690.82 8 16 1560.41 31208.18 表2 CPU:内存=1:4 CPU(Core) 内存(GB) TPS QPS IOPS 2 8 429.02 8580.42 请参见关于IOPS 4 16 999.26 19985.14 8 32 1788.29 35765.97
  • 通用型实例测试列表 表1 CPU:内存=1:2 CPU(Core) 内存(GB) TPS QPS IOPS 1 2 172.88 3457.69 请参见关于IOPS 2 4 387.63 7752.63 4 8 823.89 16477.76 8 16 1538.08 30761.58 表2 CPU:内存=1:4 CPU(Core) 内存(GB) TPS QPS IOPS 2 8 461.22 9224.35 请参见关于IOPS 4 16 843.00 16860.02 8 32 1786.72 35734.52
  • 独享型实例测试列表 表1 CPU:内存=1:2 CPU(Core) 内存(GB) TPS QPS IOPS 2 4 373.53 7470.64 请参见关于IOPS 4 8 748.80 14976.09 8 16 1563.35 31266.94 16 32 1873.68 37473.69 表2 CPU:内存=1:4 CPU(Core) 内存(GB) TPS QPS IOPS 2 8 472.01 9440.15 请参见关于IOPS 4 16 994.46 19889.28 8 32 1806.45 36129.18 16 64 2551.62 51032.43 表3 CPU:内存=1:8 CPU(Core) 内存(GB) TPS QPS IOPS 2 16 463.48 9269.67 请参见关于IOPS 4 32 1103.30 22065.92 8 64 1996.53 39930.74 16 128 3778.67 75573.89
  • 独享型实例测试列表 表1 CPU:内存=1:4 CPU(Core) 内存(GB) TPS QPS IOPS 2 8 437.45 8748.99 请参见关于IOPS 4 16 896.84 17936.72 8 32 1819.93 36398.77 16 64 2600.93 52018.73 32 128 5428.06 108572.08 64 256 12102.77 242079.30 表2 CPU:内存=1:8 CPU(Core) 内存(GB) TPS QPS IOPS 2 16 528.85 10577.07 请参见关于IOPS 4 32 1002.06 20041.23 8 64 1904.04 38080.91 16 128 3928.59 78572.08 64 512 7485.78 149732.20
  • 独享型实例测试列表 表1 CPU:内存=1:2 CPU(Core) 内存(GB) TPS QPS IOPS 2 4 378.99 7579.83 请参见关于IOPS 4 8 838.37 16767.38 8 16 1577.04 31540.74 16 32 1850.72 37014.46 表2 CPU:内存=1:4 CPU(Core) 内存(GB) TPS QPS IOPS 2 8 465.93 9318.54 请参见关于IOPS 4 16 994.98 19899.65 8 32 1825.27 36505.56 16 64 2582.68 51653.81 表3 CPU:内存=1:8 CPU(Core) 内存(GB) TPS QPS IOPS 2 16 495.95 9919.00 请参见关于IOPS 4 32 1096.84 21936.72 8 64 1924.42 38488.57 16 128 3943.78 78875.96
  • 通用型实例测试列表 表1 CPU:内存=1:2 CPU(Core) 内存(GB) TPS QPS IOPS 1 2 185.21 3704.27 请参见关于IOPS 2 4 371.97 7439.43 4 8 821.00 16420.05 8 16 1517.95 30358.98 表2 CPU:内存=1:4 CPU(Core) 内存(GB) TPS QPS IOPS 2 8 431.72 8634.30 请参见关于IOPS 4 16 926.94 18538.85 8 32 1827.36 36547.27
  • 授权项 表1 资源访问管理授权项 权限 对应API接口 授权项(Action) IAM 项目(Project) 企业项目(Enterprise Project) 检索共享资源权限列表 GET /v1/permissions ram:permissions:list × × 检索共享资源权限内容 GET /v1/permissions/{permission_id} ram:permissions:get × × 获取权限的所有版本 GET /v1/permissions/{permission_id}/versions ram:permissions:listVersions × × 创建资源共享实例 POST /v1/resource-shares ram:resourceShares:create × × 检索资源共享实例 POST /v1/resource-shares/search ram:resourceShares:search × × 更新资源共享实例 PATCH /v1/resource-shares/{resource_share_id} ram:resourceShares:update × × 删除资源共享实例 DELETE /v1/resource-shares/{resource_share_id} ram:resourceShares:delete × × 绑定资源使用者和共享资源 POST /v1/resource-shares/{resource_share_id}/associate ram:resourceShares:associate × × 移除资源使用者和共享资源 POST /v1/resource-shares/{resource_share_id}/disassociate ram:resourceShares:disassociate × × 检索绑定的资源使用者和共享资源 POST /v1/resource-share-associations/search ram:resourceShares:searchResourceShareAssociations × × 绑定或替换共享资源权限 POST /v1/resource-shares/{resource_share_id}/associate-permission ram:resourceShares:associatePermission × × 移除共享资源权限 POST /v1/resource-shares/{resource_share_id}/disassociate-permission ram:resourceShares:disassociatePermission × × 检索绑定的共享资源权限 GET /v1/resource-shares/{resource_share_id}/associated-permissions ram:resourceShares:listAssociatedPermissions × × 查询已使用的标签列表 GET /v1/resource-shares/tags ram:resourceShares:listTags × × 根据标签信息查询实例列表 POST /v1/resource-shares/resource-instances/filter ram:resourceShares:listResourceSharesByTag × × 根据标签信息查询实例数量 POST /v1/resource-shares/resource-instances/count ram:resourceShares:searchResourceShareCountByTag × × 资源共享实例增加标签 POST /v1/resource-shares/{resource_share_id}/tags/create ram:resourceShares:tag × × 删除资源共享实例的标签 POST /v1/resource-shares/{resource_share_id}/tags/delete ram:resourceShares:untag × × 检索共享的资源 POST /v1/shared-resources/search ram:sharedResources:search × × 检索资源使用者 POST /v1/shared-principals/search ram:sharedPrincipals:search × × 接受共享邀请 POST /v1/resource-share-invitations/{resource_share_invitation_id}/accept ram:resourceShareinvitations:accept × × 拒绝共享邀请 POST /v1/resource-share-invitations/{resource_share_invitation_id}/reject ram:resourceShareinvitations:reject × × 检索共享邀请 POST /v1/resource-share-invitations/search ram:resourceShareinvitations:search × × 启用与组织共享 POST /v1/resource-shares/enable-sharing-with-organization ram:resourceShares:enableSharingWithOrganization × × 关闭与组织共享 POST /v1/resource-shares/disable-sharing-with-organization ram:resourceShares:disableSharingWithOrganization × × 检索是否启用与组织共享 POST /v1/resource-shares/search-enabled-sharing-with-organization ram:resourceShares:searchEnableSharingWithOrganization × × 查询RAM配额 GET /v1/resource-shares/quotas ram:resourceShares:listQuota × × 检索云服务资源类型 GET /v1/resource-types ram:resourceTypes:list × × 父主题: 权限和授权项
  • 步骤3:计算签名 将APP secret和创建的待签字符串作为加密哈希函数的输入,计算签名,将二进制值转换为十六进制表示形式。 伪代码如下: signature = HexEncode(HMAC(APP secret, string to sign)) 其中HMAC指密钥相关的哈希运算,HexEncode指转十六进制。伪代码中参数说明如表1所示。 表1 参数说明 参数名称 参数解释 APP secret 签名密钥,认证用的ak和sk编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 string to sign 创建的待签字符串 假设APP secret为12345678-1234-1234-1234-123456781234,则计算得到的signature为: cb978df7c06ac242bab1d1b39d697ef7df4806664a6e09d5f5308a6b25043ea2
  • 步骤2:创建待签字符串 对HTTP请求进行规范并取得请求的哈希值后,将其与签名算法、签名时间一起组成待签名字符串。 StringToSign = Algorithm + \n + RequestDateTime + \n + HashedCanonicalRequest 伪代码中参数说明如下。 Algorithm 签名算法。对于SHA 256,算法为SDK-HMAC-SHA256。 RequestDateTime 请求时间戳。与请求消息头X-Sdk-Date的值相同,格式为YYYYMMDDTHHMMSSZ。 HashedCanonicalRequest 经过哈希处理的规范请求。 上述例子得到的待签字符串为: SDK-HMAC-SHA256 20180330T123600Z 4bd8e1afe76738a332ecff075321623fb90ebb181fe79ec3e23dcb081ef15906
  • 步骤4:添加签名信息到请求头 在计算签名后,将它添加到Authorization的HTTP消息头。Authorization消息头未包含在已签名消息头中,主要用于身份验证。 伪代码如下: Authorization header创建伪码: Authorization: algorithm Access=APP key, SignedHeaders=SignedHeaders, Signature=signature 需要注意的是算法与Access之前没有逗号,但是SignedHeaders与Signature之前需要使用逗号隔开。 得到的签名消息头为: Authorization: SDK-HMAC-SHA256 Access=071fe245-9cf6-4d75-822d-c29945a1e06a, SignedHeaders=host;x-sdk-date, Signature=cb978df7c06ac242bab1d1b39d697ef7df4806664a6e09d5f5308a6b25043ea2 得到签名消息头后,将其分别以Authorization和x-Authorization参数增加到原始HTTP请求头内容中,请求将被发送给API网关,由API网关完成身份认证。身份认证通过后,该请求才会发送给后端服务进行业务处理。
  • 步骤1:构造规范请求 使用APP方式进行签名与认证,首先需要规范请求内容,然后再进行签名。客户端与API网关使用相同的请求规范,可以确保同一个HTTP请求的前后端得到相同的签名结果,从而完成身份校验。 HTTP请求规范伪代码如下: CanonicalRequest = HTTPRequestMethod + '\n' + CanonicalURI + '\n' + CanonicalQueryString + '\n' + CanonicalHeaders + '\n' + SignedHeaders + '\n' + HexEncode(Hash(RequestPayload)) 可以通过以下示例来说明规范请求的构造步骤。 假设原始请求如下: GET https://c967a237-cd6c-470e-906f-a8655461897e.apigw.cn-north-1.huaweicloud.com/app1?b=2&a=1 HTTP/1.1 Host: c967a237-cd6c-470e-906f-a8655461897e.apigw.cn-north-1.huaweicloud.com X-Sdk-Date: 20180330T123600Z 构造HTTP请求方法(HTTPRequestMethod),以换行符结束。 HTTP请求方法,如GET、PUT、POST等。请求方法示例: GET 添加规范URI参数(CanonicalURI),以换行符结束。 释义: 规范URI,即请求资源路径,是URI的绝对路径部分的URI编码。 格式: 根据RFC 3986标准化URI路径,移除冗余和相对路径部分,路径中每个部分必须为URI编码。如果URI路径不以“/”结尾,则在尾部添加“/”。 举例: 示例中的URI:/app1,此时规范的URI编码为: GET /app1/ 计算签名时,URI必须以“/”结尾。发送请求时,可以不以“/”结尾。 添加规范查询字符串(CanonicalQueryString),以换行符结束。 释义: 查询字符串,即查询参数。如果没有查询参数,则为空字符串,即规范后的请求为空行。 格式: 规范查询字符串需要满足以下要求: 根据以下规则对每个参数名和值进行URI编码: 请勿对RFC 3986定义的任何非预留字符进行URI编码,这些字符包括:A-Z、a-z、0-9、-、_、.和~。 使用%XY对所有非预留字符进行百分比编码,其中X和Y为十六进制字符(0-9和A-F)。例如,空格字符必须编码为%20,扩展UTF-8字符必须采用“%XY%ZA%BC”格式。 对于每个参数,追加“URI编码的参数名称=URI编码的参数值”。如果没有参数值,则以空字符串代替,但不能省略“=”。 例如以下含有两个参数,其中第二个参数parm2的值为空。 parm1=value1&parm2= 按照字符代码以升序顺序对参数名进行排序。例如,以大写字母F开头的参数名排在以小写字母b开头的参数名之前。 以排序后的第一个参数名开始,构造规范查询字符串。 举例: 示例中包含两个可选参数:a、b GET /app1/ a=1&b=2 添加规范消息头(CanonicalHeaders),以换行符结束。 释义: 规范消息头,即请求消息头列表。包括签名请求中的所有HTTP消息头列表。消息头必须包含X-Sdk-Date,用于校验签名时间,格式为ISO8601标准的UTC时间格式:YYYYMMDDTHHMMSSZ。如果API发布到非RELEASE环境时,需要增加自定义的环境名称。 格式: CanonicalHeaders由多个请求消息头共同组成,CanonicalHeadersEntry0 + CanonicalHeadersEntry1 + ...,其中每个请求消息头(CanonicalHeadersEntry)的格式为Lowercase(HeaderName) + ':' + Trimall(HeaderValue) + '\n' Lowercase表示将所有字符转换为小写字母的函数。 Trimall表示删除值前后的多余空格的函数。 最后一个请求消息头也会携带一个换行符。叠加规范中CanonicalHeaders自身携带的换行符,因此会出现一个空行。 举例: GET /app1/ a=1&b=2 host:c967a237-cd6c-470e-906f-a8655461897e.apigw.cn-north-1.huaweicloud.com x-sdk-date:20180330T123600Z 规范消息头需要满足以下要求: 将消息头名称转换为小写形式,并删除前导空格和尾随空格。 按照字符代码对消息头名称进行升序排序。 例如原始消息头为: Host: c967a237-cd6c-470e-906f-a8655461897e.apigw.cn-north-1.huaweicloud.com\n Content-Type: application/json;charset=utf8\n My-header1: a b c \n X-Sdk-Date:20180330T123600Z\n My-Header2: "a b c" \n 规范消息头为: content-type:application/json;charset=utf8\n host:c967a237-cd6c-470e-906f-a8655461897e.apigw.cn-north-1.huaweicloud.com\n my-header1:a b c\n my-header2:"a b c"\n x-sdk-date:20180330T123600Z\n 添加用于签名的消息头声明(SignedHeaders),以换行符结束。 释义: 用于签名的请求消息头列表。通过添加此消息头,向API网关告知请求中哪些消息头是签名过程的一部分,以及在验证请求时API网关可以忽略哪些消息头。X-Sdk-date必须作为已签名的消息头。 格式: SignedHeaders = Lowercase(HeaderName0) + ';' + Lowercase(HeaderName1) + ";" + ... 已签名的消息头需要满足以下要求:将已签名的消息头名称转换为小写形式,按照字符代码对消息头进行排序,并使用“;”来分隔多个消息头。 Lowercase表示将所有字符转换为小写字母。 举例: 以下表示有两个消息头参与签名:host、x-sdk-date GET /app1/ a=1&b=2 host:c967a237-cd6c-470e-906f-a8655461897e.apigw.cn-north-1.huaweicloud.com x-sdk-date:20180330T123600Z host;x-sdk-date 使用SHA 256哈希函数以基于HTTP或HTTPS请求正文中的body体(RequestPayload),创建哈希值。 释义: 请求消息体。消息体需要做两层转换:HexEncode(Hash(RequestPayload)),其中Hash表示生成消息摘要的函数,当前支持SHA-256算法。HexEncode表示以小写字母形式返回摘要的Base-16编码的函数。例如,HexEncode("m") 返回值为“6d”而不是“6D”。输入的每一个字节都表示为两个十六进制字符。 计算RequestPayload的哈希值时,对于“RequestPayload==null”的场景,直接使用空字符串""来计算。 举例: 本示例为GET方法,body体为空。经过哈希处理的body(空字符串)如下: GET /app1/ a=1&b=2 host:c967a237-cd6c-470e-906f-a8655461897e.apigw.cn-north-1.huaweicloud.com x-sdk-date:20180330T123600Z host;x-sdk-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 对构造好的规范请求进行哈希处理,算法与对RequestPayload哈希处理的算法相同。经过哈希处理的规范请求必须以小写十六进制字符串形式表示。 算法伪代码:Lowercase(HexEncode(Hash.SHA256(CanonicalRequest))) 经过哈希处理的规范请求示例: 4bd8e1afe76738a332ecff075321623fb90ebb181fe79ec3e23dcb081ef15906
  • APP认证工作原理 构造规范请求。 将待发送的请求内容按照与API网关后台约定的规则组装,确保客户端签名、API网关后台认证时使用的请求内容一致。 使用规范请求和其他信息创建待签字符串。 使用AK/SK和待签字符串计算签名。 将生成的签名信息作为请求消息头添加到HTTP请求中,或者作为查询字符串参数添加到HTTP请求中。 API网关收到请求后,执行1~3,计算签名。 将3中的生成的签名与5中生成的签名进行比较,如果签名匹配,则处理请求,否则将拒绝请求。 APP签名仅支持Body体12M及以下的请求签名。
  • 认证前准备 通过SDK调用API前,需要获取如下认证信息: 访问服务前,首先需要得到API的ID、请求URL和请求方法 在数据服务的“API目录”页面,单击API名称,在“完整信息”页面查看API的ID、请求URL和请求方法。 图1 API基础定义 对于APP认证的API,您必须提供有效的AppKey、AppSecret才能够生成认证签名。 在“应用管理”中生成一个APP,并将APP绑定到API,就可以使用APP对应的AppKey和AppSecret访问该API。可在应用详细信息中查看AppKey和AppSecret。 图2 查看AppKey和AppSecret AppKey:APP访问密钥ID。与私有访问密钥关联的唯一标识符;访问密钥ID和私有访问密钥一起使用,对请求进行加密签名。 AppSecret:与访问密钥ID结合使用的密钥,对请求进行加密签名,可标识发送方,并防止请求被修改。 发送API请求时,需要将当前时间置于HTTP的X-Sdk-Date头,将签名信息置于Authorization头。签名只在一个有限的时间内是有效的,超时即无效。 父主题: 使用APP认证调用API
  • 请求消息 请求参数 无。 请求示例 GET https://bss.myhuaweicloud.com/v3/accounts/partner-accounts/adjust-records?indirect_partner_id=051a8a834180d3fb0f25c006b1998800&offset=0&limit=10&operation_type=SOURCE_OPERATION_BEADJUST&customer_id=051a8a834180d3fb0f25c006b1998801&operation_time_begin=2016-03-28T14:45:38Z&operation_time_end=2016-03-28T14:45:38Z&trans_id=AD2020061504210203c128 HTTP/1.1 Content-Type: application/json X-Auth-Token:MIIPAgYJKoZIhvcNAQcCo...ggg1BBIINPXsidG9rZ
  • 状态码 状态码4xx:由于明显的客户端错误(例如,格式错误的请求语法、参数错误等),华为云会返回4xx错误码,请及时检查请求消息的正确性,重新发起请求。 状态码5xx:由于华为云系统原因,导致无法完成明显有效请求的处理,可及时联系华为云客服处理。 HTTP状态码 错误码 描述 400 CBC.0100 参数错误。 400 CBC.99000037 您没有操作该云经销商的权限。 403 CBC.0151 访问拒绝。 500 CBC.0999 其他错误。
  • URI GET /v3/accounts/partner-accounts/adjust-records 表1 查询参数 参数 是否必选 参数类型 取值范围 描述 customer_id 否 String 最大长度:64 客户账号ID。您可以调用查询客户列表接口获取customer_id。 为空表示查询所有的调账记录。 不为空表示仅查询与该客户相关的调账记录。 此参数不携带或携带值为空时,默认查询所有客户的调账记录。 说明: 此处的客户包含伙伴的子客户,以及华为云总经销商关联的云经销商(二级经销商)。 operation_type 否 String 最大长度:64 操作类型。 SOURCE_OPERATION_BEADJUST:拨款 SOURCE_OPERATION_BERETRIEVE:回收 SOURCE_OPERATION_BEUNBIND:解绑回收 此参数不携带或携带值为空时,默认查询所有类型。 operation_time_begin 否 String 最大长度:20 调账起始时间。 UTC时间,格式为:2016-03-28T14:45:38Z。 此参数不携带或携带值为空时,不作为筛选条件。 operation_time_end 否 String 最大长度:20 调账截止时间。 UTC时间,格式为:2016-03-28T14:45:38Z。 此参数不携带或携带值为空时,不作为筛选条件。 trans_id 否 String 最大长度:128 事务ID。 此参数不携带或携带值为空时,不作为筛选条件。 offset 否 Integer [0-最大整数] 偏移量,从0开始。默认值为0。 说明: offset用于分页处理,如不涉及分页,请使用默认值0。offset表示相对于满足条件的第一个数据的偏移量。如offset = 1,则返回满足条件的第二个数据至最后一个数据。 示例1,满足查询条件的结果共10条数据,limit取值为10,offset取值为1,则返回的数据为2~10,第一条数据不返回。 示例2,查询总数20条,期望每页返回10条数据,则获取第一页数据,入参offset填写0,limit填写10;获取第二页数据,入参offset填写10,limit填写10。 limit 否 Integer [1-100] 每页的显示条数。默认值为10。 indirect_partner_id 否 String 最大长度:64 云经销商ID。获取方法请参见查询云经销商列表。 华为云总经销商(一级经销商)查询云经销商(二级经销商)的子客户调账记录时,需携带此参数;除此之外,此参数不做处理。否则只能查询自己的子客户调账记录。
  • URI GET /v2/accounts/partner-accounts/balances 参数说明请参见下表。 表1 查询参数 参数 是否必选 参数类型 取值范围 描述 indirect_partner_id 否 String 最大长度:64 云经销商ID。 获取方法请参见查询云经销商列表。 华为云总经销商(一级经销商)查询云经销商(二级经销商)余额时,需要携带该参数;除此之外,此参数不做处理。否则只能查询自己的账户余额。
  • 请求消息 请求参数 无。 请求示例 GET https://bss.myhuaweicloud.com/v2/accounts/partner-accounts/balances?indirect_partner_id=0977ffa9f20010790f0fc003f6900520 HTTP/1.1 Content-Type: application/json X-Auth-Token:MIIPAgYJKoZIhvcNAQcCo...ggg1BBIINPXsidG9rZ
  • 状态码 状态码4xx:由于明显的客户端错误(例如,格式错误的请求语法、参数错误等),华为云会返回4xx错误码,请及时检查请求消息的正确性,重新发起请求。 状态码5xx:由于华为云系统原因,导致无法完成明显有效请求的处理,可及时联系华为云客服处理。 HTTP状态码 错误码 描述 200 CBC.5001 非合作伙伴。 400 CBC.99000037 您没有操作该云经销商的权限。 403 CBC.0151 访问拒绝。 500 CBC.0999 其他错误。
共100000条