华为云用户手册

  • 指标清单 Kubelet视图使用的指标清单如下: 表2 Kubelet指标说明 指标 类型 说明 storage_operation_errors_total Counter 存储操作期间发生的错误次数 storage_operation_duration_seconds_count Counter 存储操作的操作次数 storage_operation_duration_seconds_bucket Histogram 存储操作的持续时间 kubelet_pod_start_duration_seconds_count Counter 进行过pod start的数量 kubelet_pod_start_duration_seconds_bucket Histogram pod start的耗时分布情况 kubelet_runtime_operations_duration_seconds_bucket Histogram 不同操作的累计操作耗时分布情况 kubelet_runtime_operations_errors_total Counter 不同操作的累计操作失败的数量 kubelet_node_config_error Gauge 如果节点遇到与配置相关的错误,则此指标为true(1),否则为false(0) volume_manager_total_volumes Gauge Volume Manager中的卷数 kubelet_running_containers Gauge 当前运行的Containers数 kubelet_running_pods Gauge 当前运行的pod数 kubelet_node_name Gauge 节点名称,值始终为1 kubelet_runtime_operations_total Counter 运行过程中不同的操作类型的累计操作次数 kubelet_cgroup_manager_duration_seconds_count Counter 销毁和更新的数量 kubelet_cgroup_manager_duration_seconds_bucket Histogram 销毁和更新操作的耗时分布情况 kubelet_pleg_relist_duration_seconds_count Counter PLEG relist pod不同耗时的数量 kubelet_pleg_relist_interval_seconds_bucket Histogram PLEG relist 间隔的分布情况 kubelet_pleg_relist_duration_seconds_bucket Histogram PLEG relist pod耗时的分布情况 rest_client_requests_total Counter 请求apiserver的总次数(按照返回码code和请求类型method统计) rest_client_request_duration_seconds_bucket Histogram 请求apiserver的总次数(按照返回码code和请求类型method统计)的分布情况 process_resident_memory_bytes Gauge 进程驻留内存大小(以字节为单位) process_cpu_seconds_total Counter 进程用户和系统 CPU 总时间(以秒为单位) go_goroutines Gauge 协程数量
  • 注意事项 由于HLS加密必须要通过转码操作完成,因此HLS加密将会产生转码费用,具体请参考价格详情。 无法对上传的原始视频进行HLS加密,只针对转码输出的HLS流加密,若转码的输出为MP4、DASH等其他类型,则不支持加密。 加密、解密均依照HLS规范进行,只有支持播放HLS流的播放器才能播放。 修改了获取密钥URL,需要对已加密的视频进行重新转码加密,否则新的加密密钥无法应用到视频中。 若加密后使用的播放地址是https,则秘钥管理服务的地址也需要配置为https协议,否则无法在点播控制台预览播放。
  • 注意事项 该功能为可选项,默认不启用。 Referer黑名单与Referer白名单互斥,不支持同时设置。 黑名单或白名单中的 域名 最多支持4级域名,且最多支持配置100条。 黑名单或白名单中配置的域名前不能带协议名,域名为前缀匹配。如填写“example.example01.com”,则“example.example01.com/123”和“example.example01.com.cn”也会匹配成功。
  • 配置步骤 登录 视频点播 控制台。 在左侧导航栏中,选择“域名管理”,进入域名管理界面。 单击域名右侧“配置”,选择“防盗链配置”页签。 单击“Referer防盗链”,弹出配置Referer防盗链页面。 单击“开关”。配置Referer防盗链参数,如图1 Referer防盗链配置信息所示。 当前Referer防盗链配置不支持带端口。 图1 Referer防盗链配置 防盗链配置及对应访问权限说明如表1所示。 表1 参数说明 参数 说明 类型 支持黑名单和白名单模式。 Referer黑名单:允许非名单内的域名请求访问媒资,拒绝名单中的域名请求访问。 Referer白名单:允许名单内的域名请求访问点播媒资,拒绝其它域名请求访问。 包含空Referer是指HTTP请求Header中的Referer内容为空,或者无Referer。根据选择的黑名单或白名单,勾选“包含空Referer”的效果是不同的。 黑名单模式:勾选“包含空Referer”表示若请求中的Referer为空,则拒绝该请求,否则允许。 白名单模式:勾选“包含空Referer”表示若请求中的Referer为空,则允许该请求,否则拒绝。 规则 黑名单或白名单中的域名。 支持输入域名或IP地址,以英文“;”进行分割,域名、IP地址可混合输入,支持泛域名添加。输入的域名、IP地址总数不能超过100个。 示例如下: www.example.com;*.test.com;192.168.0.0 配置完成后,单击“确定”。 大约需要3-5分钟,Referer防盗链才生效。
  • 支持审计的关键操作列表 表1 云审计 服务支持的视频点播操作列表 操作名称 资源类型 事件名称 创建媒资 meta createMeta 修改媒资信息 meta updateMeta 删除媒资 meta deleteMeta HLS秘钥查询 meta showAssetCipher 更新封面(截图) meta updateCoverByThumbnail 创建提取音频任务 meta createExtractAudioTask 取消提取音频任务 meta cancelExtractAudioTask 修改媒资属性 meta updateAssetMeta 创建媒资:OBS托管方式 meta createTakeOverTask CDN预热 meta createAssetPreheatingTask 创建媒资:OBS转存方式 meta publishAssetFromObs 媒资发布 meta publishAssets 取消发布 meta unpublishAssets 确认媒资上传 meta confirmAssetUpload 创建媒资转码任务 meta createAssetProcessTask 取消媒资转码任务 meta cancelAssetTranscodeTask 创建审核媒资任务 meta createAssetReviewTask 确认媒资上传(V1.1) meta confirmAssetUploadV11 修改媒资存储模式 meta updateStorageMode 多字幕封装 meta subtitleModify 屏蔽资源 meta shieldAsset 设置HLS秘钥获取地址 meta setEncryptConfiguration 创建转码模板 transcodeTemplate createTranscodeTemplate 修改转码模板 transcodeTemplate updateTranscodeTemplate 删除转码模板 transcodeTemplate deleteTranscodeTemplate 创建媒资分类 category createAssetCategory 更新媒资分类 category updateAssetCategory 删除媒资分类 category deleteAssetCategory 创建模板组集合 transcodeTemplate createTemplateGroupCollection 修改模板组集合 transcodeTemplate updateTemplateGroupCollection 删除模板组集合 transcodeTemplate deleteTemplateGroupCollection 创建转码模板组 transcodeTemplate createTemplateGroup 修改转码模板组 transcodeTemplate updateTemplateGroup 删除转码模板组 transcodeTemplate deleteTemplateGroup 创建URL拉取任务 pullMetaTask uploadMetaDataByUrl 删除URL拉取任务 pullMetaTask deleteUploadMetaDataByUrlTask 恢复URL拉取任务 pullMetaTask retrievalUploadMetaDataByUrlTask 取消URL拉取任务 pullMetaTask stopUploadMetaDataByUrlTask 配置消息订阅 message notifySmnTopicConfig 创建审核模板 review createReviewTemplate 修改审核模板 review updateReviewTemplate 删除审核模板 review deleteReviewTemplate 启动工作流任务 workflow startWorkflowTask 创建工作流 workflow createWorkflow 修改工作流 workflow modifyWorkflow 删除工作流 workflow deleteWorkflow 创建水印模板 watermark createWatermarkTemplate 修改水印模板 watermark updateWatermarkTemplate 删除水印模板 watermark deleteWatermarkTemplate 确认水印上传 watermark confirmImageUpload 启用水印 watermark enableWatermark 修改水印图片 watermark updateWatermarkImage 修改cdn的https配置 domain modifyDomainHttpsConfig 创建加速域名 domain creatDomain 设置加速域名URL鉴权 domain createDomainAuthInfoSetting 启用CDN域名 domain enableDomain 设置Referer防盗链 domain modifyRefererSetting 修改加速域名 domain modifyDomain 停用加速域名 domain disbleDomain 删除加速域名 domain deleteDomain 修改增量托管 hostTask modifyHostConfig 删除增量托管 hostTask deleteHostConfig 创建增量托管 hostTask createHostConfig 桶授权 bucket bucketAuthority 修改cdn计费方式 bill updateCdnBill 开通点播服务 tenant setTenantInfo
  • 开启RocketMQ消息轨迹(Go) 在客户端开启消息轨迹的方法如下: 执行以下命令,检查是否已安装Go。 go version 返回如下回显时,说明Go已经安装。 [root@ecs-test sarama]# go version go version go1.16.5 linux/amd64 如果未安装Go,请下载并安装。 进入Go脚本所在的bin目录下。 执行“touch go.mod”命令新建一个“go.mod”,并增加以下代码,添加依赖。 module rocketmq-example-go go 1.13 require ( github.com/apache/rocketmq-client-go/v2 v2.1.0 ) 生产者开启消息轨迹(以下加粗内容需要替换为实例自有信息,请根据实际情况替换)。 package main import ( "context" "fmt" "os" "time" "github.com/apache/rocketmq-client-go/v2" "github.com/apache/rocketmq-client-go/v2/primitive" "github.com/apache/rocketmq-client-go/v2/producer" ) func main() { namesrvs := []string{"192.168.0.1:8100"} traceCfg := &primitive.TraceConfig{ Access: primitive.Local, Resolver: primitive.NewPassthroughResolver(namesrvs), } p, _ := rocketmq.NewProducer( producer.WithNsResolver(primitive.NewPassthroughResolver([]string{"192.168.0.1:8100"})), producer.WithRetry(2), producer.WithTrace(traceCfg)) // 增加此行代码表示开启了消息轨迹。 err := p.Start() if err != nil { fmt.Printf("start producer error: %s", err.Error()) os.Exit(1) } res, err := p.SendSync(context.Background(), primitive.NewMessage("topic1", []byte("Hello RocketMQ Go Client!"))) if err != nil { fmt.Printf("send message error: %s\n", err) } else { fmt.Printf("send message success: result=%s\n", res.String()) } time.Sleep(10 * time.Second) err = p.Shutdown() if err != nil { fmt.Printf("shutdown producer error: %s", err.Error()) } } 消费者开启消息轨迹(以下加粗内容需要替换为实例自有信息,请根据实际情况替换)。 package main import ( "context" "fmt" "os" "time" "github.com/apache/rocketmq-client-go/v2" "github.com/apache/rocketmq-client-go/v2/consumer" "github.com/apache/rocketmq-client-go/v2/primitive" ) func main() { namesrvs := []string{"192.168.0.1:8100"} traceCfg := &primitive.TraceConfig{ Access: primitive.Local, Resolver: primitive.NewPassthroughResolver(namesrvs), } c, _ := rocketmq.NewPushConsumer( consumer.WithGroupName("testGroup"), consumer.WithNsResolver(primitive.NewPassthroughResolver([]string{"192.168.0.1:8100"})), consumer.WithTrace(traceCfg), // 增加此行代码表示开启了消息轨迹。 ) err := c.Subscribe("TopicTest", consumer.MessageSelector{}, func(ctx context.Context, msgs ...*primitive.MessageExt) (consumer.ConsumeResult, error) { fmt.Printf("subscribe callback: %v \n", msgs) return consumer.ConsumeSuccess, nil }) if err != nil { fmt.Println(err.Error()) } // Note: start after subscribe err = c.Start() if err != nil { fmt.Println(err.Error()) os.Exit(-1) } time.Sleep(time.Hour) err = c.Shutdown() if err != nil { fmt.Printf("shutdown Consumer error: %s", err.Error()) } }
  • 开启RocketMQ消息轨迹(Java) 在客户端开启消息轨迹的方法如下: 生产者开启消息轨迹(除事务消息以外的消息类型) 构造函数的“enableMsgTrace”参数传入“true”,例如: DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName", true); 生产者开启消息轨迹(事务消息) 构造函数的“enableMsgTrace”参数传入“true”,例如: TransactionMQProducer producer = new TransactionMQProducer(null, "ProducerGroupName", null, true, null); 消费者开启消息轨迹 构造函数的“enableMsgTrace”参数传入“true”,例如: DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroupName", true);
  • 基础版和专业版的差异 分布式消息服务RocketMQ版5.x支持两种实例类型:基础版、专业版,它们的差异如表2所示。 表2 基础版和专业版的差异 维度 基础版 专业版 目标用户 入门级、对于成本敏感的用户。 对于可靠性、性能等要求高的进阶型、企业级用户。 产品定位 兼容开源的RocketMQ,提供基础的RocketMQ能力。 除了提供基础版能力外,还提供业务高可用、数据安全、信道加密等企业级特性。 产品功能 支持基础的消息收发能力 支持常见的消息类型(如普通消息、顺序消息、事务消息、定时消息) 不支持消息轨迹 支持SSL 支持ACL 支持基础的消息收发能力 支持常见的消息类型(如普通消息、顺序消息、事务消息、定时消息) 支持消息轨迹 支持SSL 支持ACL 弹性TPS 可用性 多可用区 多可用区 资源部署方式 资源共享 底层物理资源采用共享型部署方式,在大部分情况下规格可以达到对应的TPS,极端负载情况下可能出现TPS不稳定。 资源独享 底层物理资源采用独享型专有资源部署,保障性能的稳定,具备更好的可靠性和可服务性。
  • 单机实例和集群实例的差异 表3 单机实例和集群实例的差异 维度 单机 集群 使用场景 开发测试场景,对性能和可靠性无要求。 生产环境,无法容忍单点故障,有高可用诉求。 部署架构 采用单节点部署,高可用能力依赖于E CS 的HA能力,节点故障期间无法提供服务。 采用多节点集群部署,具有分布式高可用能力,无单点故障问题,出现故障服务自动切换。 SLA 无 参考SLA 功能限制 支持存储空间变更,不支持实例规格变更 不支持跨版本变更 支持存储空间和实例规格变更 不支持跨版本变更
  • 5.x版本的优势 与4.8.0版本相比,5.x版本具有如下优势: 架构更先进 5.x版本提供无状态的Proxy接入,解决无法通过代理访问的问题。5.x提供了Pop消费模式,降低消费堆积发生的概率。 开发门槛更低 支持开源gRPC协议SDK,提供更多种语言的SDK,API更加简洁友好。 成本更弹性 支持更小的规格,灵活弹性扩容,节约成本。专业版支持弹性TPS,弹性TPS能力适用于业务侧偶尔出现少量突发流量的场景。 兼容性好 完全兼容RocketMQ 4.8.0 SDK的接入方式,可以无缝升级到5.x。
  • APM 支持的GO类型 APM支持GO类应用,目前已支持多种主流框架、web服务器、通讯协议、数据库等,可实现应用轻松接入。 表1 自研探针GO组件和框架 探针类型 组件 版本 skywalking探针 gin 1.7.0~1.9.0 skywalking探针 http Server 1.17~1.2.0 skywalking探针 go-restfulv3 3.7.1~3.10.2 skywalking探针 mux 1.7.0~1.8.0 skywalking探针 http Client 1.17~1.2.0 skywalking探针 dubbo 3.0.1~3.0.5 skywalking探针 kratosv2 2.3.1~2.6.2 skywalking探针 microv4 4.6.0~4.10.2 skywalking探针 grpc 1.55.0~1.57.0 skywalking探针 gorm 1.22.0~1.25.1 skywalking探针 mongo 1.11.1~1.11.7 skywalking探针 Native SQL 1.17~1.20 skywalking探针 MySQL Driver 1.4.0~1.7.1 skywalking探针 go-redisv9 9.0.3~9.0.5 skywalking探针 runtimemetrics 1.17~1.20 skywalking探针 logrus 1.8.2~1.9.3 skywalking探针 zap 1.17.0~1.24.0 表2 Opentelemetry探针GO组件信息 探针类型 组件 指标 调用链 Opentelemetry探针 aws-sdk-go-v2 - ✓ Opentelemetry探针 go-restful - ✓ Opentelemetry探针 gin - ✓ Opentelemetry探针 mux - ✓ Opentelemetry探针 echo - ✓ Opentelemetry探针 mongo-driver - ✓ Opentelemetry探针 grpc ✓ ✓ Opentelemetry探针 macaron.v1 - ✓ Opentelemetry探针 host ✓ - Opentelemetry探针 http ✓ ✓ Opentelemetry探针 httptrace - ✓ Opentelemetry探针 runtime ✓ - Opentelemetry探针GO组件,其他支持自动埋点的依赖库和框架请参考社区提供的完整列表。
  • 计费项 按需购买的实例支持关机不计费,但增购的会话数正常计费,关机后的计费规则: 实例本身(vCPU,内存,镜像)不计费,其它所挂载的资源如云硬盘,公网IP或带宽则正常计费。 按需计费云应用服务器支持关机不计费,即关机期间,在保留云应用服务器的前提下,系统将自动回收计算资源(vCPU、内存)。此时,将不再收取计算资源相关费用,仅收取存储资源(系统盘)费用,可以降低您的使用成本,再次启动时会重新申请vCPU和内存,在资源不足时会有启动失败的风险,您可以通过稍后启动的方式来恢复。 根据您 购买云服务器 增购的会话数正常计费。 公网/ 私网NAT网关 根据您选择的公网NAT网关规格和使用时长计费。详细的价格说明请参考NAT网关价格计算器。 Windows操作系统为市场镜像,该服务由第三方提供。为方便用户选择,在公共镜像中提供入口。具体收费以镜像供应商提供的信息为准。 私有镜像会收取一定的存储费用,删除创建的镜像后将不再计费。详细计费标准可参考 镜像服务 计费标准。 NAS存储根据您选择的SFS3.0容量型文件系统进行计费,详情参考弹性文件服务SFS的计费说明。 应用仓库中文件使用OBS存储时进行计费,详情参考 对象存储服务 OBS的计费说明。
  • 操作场景 管理员发布应用后,云应用默认在VPC子网内,此时云应用无法访问互联网。管理员需要配置NAT网关共享弹性公网IP,使用户通过互联网接入地址接入云应用后,可正常使用应用程序。云应用存在多个业务子网时,需要为每个业务子网开通互联网功能。 云应用与 云桌面 的网络共用。如果同项目下的同一子网内已有云桌面,且管理员已为云桌面开通互联网访问,则终端用户可直接访问应用程序。如果当前项目子网只存在云应用,则管理员需参考本章节进入NAT、EIP页面购买对应服务开通互联网。
  • 前提条件 已获得需要访问互联网的云应用所在区域、项目、使用的VPC和子网信息。 管理员已具有NAT服务和EIP服务的操作权限。 自主注册的华为云帐号默认拥有华为云所有服务的操作权限,如果您使用的是此类帐号,无需再进行确认。 华为云帐号下新建的 IAM 帐号,需要加入“admin”内置用户组,或者拥有NAT服务和EIP服务操作权限的用户组,才可使用NAT服务和EIP服务。可进入“ 统一身份认证 服务”中查看是否属于“admin”内置用户组。若非“admin”内置用户组,请参见NAT服务授权、EIP服务授权赋予IAM帐号使用NAT服务和EIP服务的权限。
  • 相关概念 IAM是华为云提供权限管理的基础服务,无需付费即可使用,您只需要为您帐号中的资源进行付费。关于IAM的详细介绍,请参见《IAM产品介绍》。 帐号 当您首次使用华为云时注册的帐号,该帐号是您的华为云资源归属、资源使用计费的主体,对其所拥有的资源及云服务具有完全的访问权限,可以重置用户密码、分配用户权限等。帐号统一接收所有IAM用户进行资源操作时产生的费用账单。 帐号不能在IAM中修改和删除,您可以在帐号中心修改帐号信息,如果您需要删除帐号,可以在帐号中心进行注销。 IAM用户 由帐号在IAM中创建的用户,是云服务的使用人员,具有独立的身份凭证(密码和访问密钥),根据帐号授予的权限使用资源。IAM用户不进行独立的计费,由所属账户统一付费。 用户组 用户组是用户的集合,IAM通过用户组功能实现用户的授权。您创建的IAM用户,需要加入特定用户组后,才具备对应的权限,否则IAM用户无法访问您帐号中的任何资源或者云服务。当某个用户加入多个用户组时,此用户同时拥多个用户组的权限,即多个用户组权限的全集。 “admin”为系统缺省提供的用户组,具有所有云服务资源的操作权限。将IAM用户加入该用户组后,IAM用户可以操作并使用所有云资源,包括但不仅限于创建用户组及用户、修改用户组权限、管理资源等。 企业项目权限说明 关于企业项目权限的详细介绍,请参见《EPS产品介绍》。
  • 云应用服务管理员权限 权限根据授权的精细程度,分为策略和角色。云应用服务使用角色授予IAM用户管理员权限。云应用与云桌面使用同一个项目,则共用同一份用户名单,当给云应用的用户组授权时,云桌面同样会有对应的权限。 默认情况下,新建的IAM用户没有任何权限,您需要将其加入用户组,并给用户组授予云应用管理员权限,才能使得用户组中的用户获得对应权限,这一过程称为授权。授权后,IAM用户可以在对应拥有权限的项目中对云应用资源进行操作。 如表1所示,包括了云应用的所有系统权限。表2包括了云应用所需的额外权限,其中“依赖关系”表示云应用的系统权限对其它角色的依赖。由于华为云各服务之间存在业务交互关系,云应用的角色依赖其他服务的角色实现功能。因此给用户组授予云应用的权限时,请勿取消已勾选的其他依赖权限,否则云应用的权限将无法生效。
  • 准备软件 制作Windows操作系统私有镜像需准备的软件如表1所示。 表1 所需软件包 软件包名称 软件包说明 获取方式 Workspace_HDP_WindowsDesktop_Installer_x.x.x.iso Windows镜像制作工具。 点此获取镜像制作工具 点此获取镜像工具校验文件 操作系统ISO文件 Windows Server 2016数据中心版本 64位(中文、英文) Windows Server 2019数据中心版本 64位(中文、英文) 请根据用户需求类型从微软或者其他合法渠道获取正规操作系统ISO镜像文件。 须知: 操作系统的ISO镜像文件需为从正规渠道获取的官方纯净镜像。非官方镜像或私有定制镜像,对操作系统做了很多未知的修改,可能导致模板制作失败,或者与HDP不兼容导致无法使用,请勿使用此类镜像。 AnyBurn 光驱制作工具。 点此获取 virtio驱动包 virtio驱动 点此获取virtio驱动 点此获取virtio驱动其他版本 参考镜像服务安装virtio驱动章节安装virtio驱动。 应用程序 请用户根据个人需求准备应用软件(如办公、实时通讯等软件)。 自备 7z1900-x64.exe 7-Zip压缩软件,用于压缩/解压缩的软件包。 点此获取 CloudbaseInitSetup_xxx.msi 在使用镜像创建云服务器时,可自定义设定云服务器的hostname、hosts文件以及用户名密码。 根据Windows操作系统的不同位数,您需要下载不同版本的Cloudbase-Init工具安装包。 Cloudbase-Init分为稳定版本和Beta版本两种。 稳定版本获取路径: 64位:点此获取 32位:点此获取 Beta版本获取路径: 64位:点此获取 32位:点此获取 CloudResetPwdAgent.zip 云服务器的密码重置插件。 点此获取 GPU驱动 仅在制作GPU镜像时需要。 云应用支持RTX5000型号的直通卡。 RTX5000请参考如下方式获取驱动: 使用Web浏览器,登录英伟达官网,在驱动程序下载页面,根据操作系统(包括Windows驱动程序类型、语言)及GPU卡类型,配置参数,选择最新版本驱动进行下载。 例如,需要Windows Server 2019数据中心版的中文操作系统的桌面、使用RTX 5000显卡,则信息配置如下: 产品类型:NVIDIA RTX / Quadro 产品系列:Quadro RTX Series 产品家族:Quadro RTX 5000 操作系统:Windows Server 2019 语言:Chinese (Simplified) 外设驱动程序 请用户根据个人需求准备外设驱动程序。 自备 HW.SysAgent.Installer_64.msi HW.SysPrep.Installer_64.msi 云应用服务器发放和HDA升级时使用。 安装方式:双击安装。 点此获取HW.SysAgent 点此获取HW.SysAgent校验文件 点此获取HW.SysPrep 点此获取HW.SysPrep校验文件 WKSAppDhcpd_windows-amd64.msi 创建云应用服务器分配虚拟IP时使用。 安装方式:双击安装。 点此获取 点此获取校验文件 WKSRStorageAgent_windows-amd64.msi 使用 云存储 功能时使用。 安装方式:双击安装。 点此获取 点此获取校验文件 Sandboxie 通过Sandboxie软件,可以使应用以沙箱的方式运行,如需安装请参考如何安装沙箱软件?章节。 点此获取 父主题: 制作Windows私有镜像(基础镜像)
  • 开始使用 详细的SDK介绍,使用异步客户端,配置日志请参见 SDK中心 、Python SDK使用指导、Python SDK使用视频。 导入依赖模块 from huaweicloudsdkcore.auth.credentials import BasicCredentials from huaweicloudsdkcore.exceptions import exceptions # 导入v2版本sdk from huaweicloudsdkfrs.v2.region.frs_region import FrsRegion from huaweicloudsdkfrs.v2 import * import os 配置认证信息 配置AK、SK信息。华为云通过AK识别用户的身份,通过SK对请求数据进行签名验证,用于确保请求的机密性、完整性和请求者身份的正确性。AK、SK获取方法请参见准备工作。 def GetCredential(ak, sk): return BasicCredentials(ak, sk) 初始化认证信息: ak = os.environ.get("HUAWEICLOUD_SDK_AK") sk = os.environ.get("HUAWEICLOUD_SDK_SK") credentials = GetCredential(ak, sk) 认证用的 ak 和sk 硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 本示例以 ak 和 sk 保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 图3 Windows环境新建环境变量 初始化客户端 指定region方式 # 初始化 人脸识别服务 的客户端,并选择服务部署区域 def GetClient(): client = FrsClient.new_builder(FrsClient) \ .with_credentials(credentials) \ .with_region(FrsRegion.value_of("cn-north-4")) \ .build() return client 服务部署区域请参见终端节点。 发送请求并查看响应 # 以调用人脸检测 DetectFaceByBase64 接口为例 request = DetectFaceByBase64Request() request.body = FaceDetectBase64Req( image_base64="/9j/4AAQSkZJRgABAQAAAQABAAD..." ) response = client.detect_face_by_base64(request) print(response) 使用人脸比对SDK时,image1、image2参数需为相同类型,即同为url、base64或file。 异常处理 表1 异常处理 一级分类 一级分类说明 二级分类 二级分类说明 ConnectionException 连接类异常 HostUnreachableException 网络不可达、被拒绝。 SslHandShakeException SSL认证异常。 RequestTimeoutException 响应超时异常 CallTimeoutException 单次请求,服务器处理超时未返回。 RetryOutageException 在重试策略消耗完成后,仍无有效的响应。 ServiceResponseException 服务器响应异常 ServerResponseException 服务端内部错误,Http响应码:[500,]。 ClientRequestException 请求参数不合法,Http响应码:[400, 500) // 捕获和处理不同类型的异常 try: request = DetectFaceByBase64Request() request.body = FaceDetectBase64Req( image_base64="/9j/4AAQSkZJRgABAQAAAQABAAD..." ) response = client.detect_face_by_base64(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg)
  • SDK代码解析 人脸检测 # detect face by base64 def detectFaceByBase64(): try: request = DetectFaceByBase64Request() request.body = FaceDetectBase64Req( image_base64="/9j/4AAQSkZJRgABAQAAAQABAAD...", attributes="2,4" ) response = client.detect_face_by_base64(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) # detect face by file def detectFaceByFile(): try: request = DetectFaceByFileRequest() with open("/root/picture.jpg", "rb") as f: request.body = DetectFaceByFileRequestBody(image_file=FormFile(f)) response = client.detect_face_by_file(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) 人脸比对 # compare face by base64 def compareFaceByBase64(): try: request = CompareFaceByBase64Request() request.body = FaceCompareBase64Req( image1_base64="/9j/4AAQSkZJRgABAQAAAQABAAD...", image2_base64="/9j/4AAQSkZJRgABAQAAAQABAAD..." ) response = client.compare_face_by_base64(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) # compare face by file def compareFaceByFile(): try: request = CompareFaceByFileRequest() with open("/root/picture1.jpg", "rb") as f1: with open("/root/picture2.jpg", "rb") as f2: request.body = CompareFaceByFileRequestBody(image1_file=FormFile(f1), image2_file=FormFile(f2)) response = client.compare_face_by_file(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) 人脸搜索 # search face by base64 def searchFaceByBase64(): try: request = SearchFaceByBase64Request() request.face_set_name = "face_set_name" listFaceSearchBase64ReqReturnFieldsbody = [ "timestamp" ] request.body = FaceSearchBase64Req( return_fields=listFaceSearchBase64ReqReturnFieldsbody, image_base64="/9j/4AAQSkZJRgABAQAAAQABAAD..." ) response = client.search_face_by_base64(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) # search face by file def searchFaceByFile(): try: request = SearchFaceByFileRequest() request.face_set_name = "face_set_name" with open("/root/picture.jpg", "rb") as f: request.body = SearchFaceByFileRequestBody( return_fields="[\"timestamp\"]", filter="timestamp:10", top_n=10, image_file=FormFile(f) ) response = client.search_face_by_file(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) 创建人脸库 def createFaceSet(): try: request = CreateFaceSetRequest() request.body = CreateFaceSetReq( face_set_name="face_set_name", external_fields={"timestamp": {"type": "long"}} ) response = client.create_face_set(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) 查询人脸库 def showFaceSet(): try: request = ShowFaceSetRequest() request.face_set_name = "face_set_name" response = client.show_face_set(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) 查询所有人脸库 def showAllFaceSet(): try: request = ShowAllFaceSetsRequest() response = client.show_all_face_sets(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) 删除人脸库 def deleteFaceSet(): try: request = DeleteFaceSetRequest() request.face_set_name = "face_set_name" response = client.delete_face_set(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) 添加人脸 # add face by base64 def addFacesByBase64(): try: request = AddFacesByBase64Request() request.face_set_name = "face_set_name" request.body = AddFacesBase64Req( external_fields="{\"timestamp\":12}", image_base64="/9j/4AAQSkZJRgABAQAAAQABAAD..." ) response = client.add_faces_by_base64(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) # add face by file def addFacesByFile(): try: request = AddFacesByFileRequest() request.face_set_name = "face_set_name" with open("/root/picture.jpg", "rb") as f: request.body = AddFacesByFileRequestBody( external_fields="{\"timestamp\":12}", image_file=FormFile(f) ) response = client.add_faces_by_file(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) 删除人脸 def deleteFace(): # Delete Face By FaceId try: request = DeleteFaceByFaceIdRequest() request.face_set_name = "face_set_name" request.face_id = "LkPJblq6" response = client.delete_face_by_face_id(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) # Delete Face By ExternalImageId try: request = DeleteFaceByExternalImageIdRequest() request.face_set_name = "face_set_name" request.external_image_id = "external_image_id" response = client.delete_face_by_external_image_id(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) 批量删除人脸 def batchDeleteFaces(): try: request = BatchDeleteFacesRequest() request.face_set_name = "face_set_name" request.body = DeleteFacesBatchReq( filter="age:[20 TO 30]" ) response = client.batch_delete_faces(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) 更新人脸 def updateFace(): try: request = UpdateFaceRequest() request.face_set_name = "face_set_name" request.body = UpdateFaceReq(face_id="LkPJblq6") response = client.update_face(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) 查询人脸 def showFaces(): # Show Faces By FaceId try: request = ShowFacesByFaceIdRequest() request.face_set_name = "face_set_name" request.face_id = "LkPJblq6" response = client.show_faces_by_face_id(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) # Show Faces By Limit try: request = ShowFacesByLimitRequest() request.face_set_name = "face_set_name" request.offset = 0 request.limit = 10 response = client.show_faces_by_limit(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) 动作活体检测 # detect live by base64 def detectLiveByBase64(): try: request = DetectLiveByBase64Request() request.body = LiveDetectBase64Req( actions="1,2,3,4", video_base64="/9j/4AAQSkZJRgABAQAAAQABAAD..." ) response = client.detect_live_by_base64(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) # detect live by file def detectLiveByFile(): try: request = DetectLiveByFileRequest() with open("/root/video.mp4", "rb") as f: request.body = DetectLiveByFileRequestBody( video_file=FormFile(f), actions="1,2,3,4" ) response = client.detect_live_by_file(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) 静默活体检测 # detect live face by base64 def detectLiveFaceByBase64(): try: request = DetectLiveFaceByBase64Request() request.body = LiveDetectFaceBase64Req( image_base64="/9j/4AAQSkZJRgABAQAAAQABAAD..." ) response = client.detect_live_face_by_base64(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) # detect live face by file def detectLiveFaceByFile(): try: request = DetectLiveFaceByFileRequest() with open("/root/picture.jpg", "rb") as f: request.body = DetectLiveFaceByFileRequestBody( image_file=FormFile(f) ) response = client.detect_live_face_by_file(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg)
  • 开始使用 详细的SDK介绍,使用异步客户端,配置日志请参见SDK中心、Java SDK使用指导、Java SDK使用视频。 导入依赖模块 import com.huaweicloud.sdk.core.auth.ICredential; import com.huaweicloud.sdk.core.auth.BasicCredentials; import com.huaweicloud.sdk.core.exception.ConnectionException; import com.huaweicloud.sdk.core.exception.RequestTimeoutException; import com.huaweicloud.sdk.core.exception.ServiceResponseException; //导入v2版本sdk import com.huaweicloud.sdk.frs.v2.region.FrsRegion; import com.huaweicloud.sdk.frs.v2.*; import com.huaweicloud.sdk.frs.v2.model.*; 配置认证信息 配置AK、SK信息。华为云通过AK识别用户的身份,通过SK对请求数据进行签名验证,用于确保请求的机密性、完整性和请求者身份的正确性。AK、SK获取方法请参见准备工作。 public static ICredential getCredential(String ak, String sk) { return new BasicCredentials() .withAk(ak) .withSk(sk); } 初始化认证信息: String ak = System.getenv("HUAWEICLOUD_SDK_AK"); String sk = System.getenv("HUAWEICLOUD_SDK_SK"); ICredential credential = getCredential(ak, sk); 认证用的 ak 和sk 硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 本示例以 ak 和 sk 保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 图3 Windows环境新建环境变量 初始化客户端 指定region方式 public static FrsClient getClient(Region region, ICredential auth) { // 初始化 人脸识别 服务的客户端 FrsClient client = FrsClient.newBuilder() .withCredential(auth) .withRegion(FrsRegion.valueOf("cn-north-4")) // 选择服务所在区域 FrsRegion.valueOf("cn-north-4") .build(); return client; } 服务部署区域请参见终端节点。 发送请求并查看响应 // 以调用人脸检测 DetectFaceByBase64 接口为例 DetectFaceByBase64Request request = new DetectFaceByBase64Request(); FaceDetectBase64Req body = new FaceDetectBase64Req(); body.withImageBase64("/9j/4AAQSkZJRgABAQAAAQABAAD..."); request.withBody(body); DetectFaceByBase64Response response = client.detectFaceByBase64(request); System.out.println(response.toString()); 使用人脸比对SDK时,image1、image2参数需为相同类型,即同为url、base64或file。 异常处理 表1 异常处理 一级分类 一级分类说明 二级分类 二级分类说明 ConnectionException 连接类异常 HostUnreachableException 网络不可达、被拒绝。 SslHandShakeException SSL认证异常。 RequestTimeoutException 响应超时异常 CallTimeoutException 单次请求,服务器处理超时未返回。 RetryOutageException 在重试策略消耗完成后,仍无有效的响应。 ServiceResponseException 服务器响应异常 ServerResponseException 服务端内部错误,Http响应码:[500,]。 ClientRequestException 请求参数不合法,Http响应码:[400, 500) // 捕获和处理不同类型的异常 DetectFaceByBase64Request request = new DetectFaceByBase64Request(); try { DetectFaceByBase64Response response = client.detectFaceByBase64(request); System.out.println(response.toString()); } catch (ConnectionException e) { e.printStackTrace(); } catch (RequestTimeoutException e) { e.printStackTrace(); } catch (ServiceResponseException e) { e.printStackTrace(); System.out.println(e.getHttpStatusCode()); System.out.println(e.getErrorCode()); System.out.println(e.getErrorMsg()); }
  • 安装SDK 推荐使用 Composer 安装 SDK 。 Composer 是 php 的依赖管理工具,允许您在项目中声明依赖关系并安装这些依赖: // 安装 Composer curl -sS https://getcomposer.org/installer | php // 安装 PHP SDK composer require huaweicloud/huaweicloud-sdk-php 安装完毕后,你需要引入 Composer 的自动加载文件: require 'path/to/vendor/autoload.php';
  • 安装SDK 使用SDK前,需要安装“HuaweiCloud.SDK.Core”和“HuaweiCloud.SDK.Frs”,有两种安装方式,分别如下。 使用 .NET CLI 工具 dotnet add package HuaweiCloud.SDK.Core dotnet add package HuaweiCloud.SDK.Frs 使用 Package Manager Install-Package HuaweiCloud.SDK.Core Install-Package HuaweiCloud.SDK.Frs
  • SDK demo代码解析 人脸检测 var req = new DetectFaceByBase64Request { }; req.Body = new FaceDetectBase64Req() { ImageBase64 = "图片的base64编码" }; try { var resp = client.DetectFaceByBase64(req); var respStatusCode = resp.HttpStatusCode; Console.WriteLine(respStatusCode); } catch (RequestTimeoutException requestTimeoutException) { Console.WriteLine(requestTimeoutException.ErrorMessage); } catch (ServiceResponseException clientRequestException) { Console.WriteLine(clientRequestException.HttpStatusCode); Console.WriteLine(clientRequestException.ErrorCode); Console.WriteLine(clientRequestException.ErrorMsg); } catch (ConnectionException connectionException) { Console.WriteLine(connectionException.ErrorMessage); } 人脸比对 var req = new CompareFaceByBase64Request { }; req.Body = new FaceCompareBase64Req() { Image1Base64 = "图片1的base64编码", Image2Base64 = "图片2的base64编码" }; try { var resp = client.CompareFaceByBase64(req); var respStatusCode = resp.HttpStatusCode; Console.WriteLine(respStatusCode); } catch (RequestTimeoutException requestTimeoutException) { Console.WriteLine(requestTimeoutException.ErrorMessage); } catch (ServiceResponseException clientRequestException) { Console.WriteLine(clientRequestException.HttpStatusCode); Console.WriteLine(clientRequestException.ErrorCode); Console.WriteLine(clientRequestException.ErrorMsg); } catch (ConnectionException connectionException) { Console.WriteLine(connectionException.ErrorMessage); } 人脸搜索 var req = new SearchFaceByBase64Request { }; req.Body = new FaceSearchBase64Req() { ImageBase64 = "图片的base64编码" }; try { var resp = client.SearchFaceByBase64(req); var respStatusCode = resp.HttpStatusCode; Console.WriteLine(respStatusCode); } catch (RequestTimeoutException requestTimeoutException) { Console.WriteLine(requestTimeoutException.ErrorMessage); } catch (ServiceResponseException clientRequestException) { Console.WriteLine(clientRequestException.HttpStatusCode); Console.WriteLine(clientRequestException.ErrorCode); Console.WriteLine(clientRequestException.ErrorMsg); } catch (ConnectionException connectionException) { Console.WriteLine(connectionException.ErrorMessage); } 创建人脸库 var req = new CreateFaceSetRequest { }; req.Body = new CreateFaceSetReq() { FaceSetName = "人脸库名称" }; try { var resp = client.CreateFaceSet(req); var respStatusCode = resp.HttpStatusCode; Console.WriteLine(respStatusCode); } catch (RequestTimeoutException requestTimeoutException) { Console.WriteLine(requestTimeoutException.ErrorMessage); } catch (ServiceResponseException clientRequestException) { Console.WriteLine(clientRequestException.HttpStatusCode); Console.WriteLine(clientRequestException.ErrorCode); Console.WriteLine(clientRequestException.ErrorMsg); } catch (ConnectionException connectionException) { Console.WriteLine(connectionException.ErrorMessage); } 查询人脸库 var req = new ShowFaceSetRequest { FaceSetName = "人脸库名称" }; try { var resp = client.ShowFaceSet(req); var respStatusCode = resp.HttpStatusCode; Console.WriteLine(respStatusCode); } catch (RequestTimeoutException requestTimeoutException) { Console.WriteLine(requestTimeoutException.ErrorMessage); } catch (ServiceResponseException clientRequestException) { Console.WriteLine(clientRequestException.HttpStatusCode); Console.WriteLine(clientRequestException.ErrorCode); Console.WriteLine(clientRequestException.ErrorMsg); } catch (ConnectionException connectionException) { Console.WriteLine(connectionException.ErrorMessage); } 查询所有人脸库 var req = new ShowAllFaceSetsRequest { }; try { var resp = client.ShowAllFaceSets(req); var respStatusCode = resp.HttpStatusCode; Console.WriteLine(respStatusCode); } catch (RequestTimeoutException requestTimeoutException) { Console.WriteLine(requestTimeoutException.ErrorMessage); } catch (ServiceResponseException clientRequestException) { Console.WriteLine(clientRequestException.HttpStatusCode); Console.WriteLine(clientRequestException.ErrorCode); Console.WriteLine(clientRequestException.ErrorMsg); } catch (ConnectionException connectionException) { Console.WriteLine(connectionException.ErrorMessage); } 删除人脸库 var req = new DeleteFaceSetRequest { FaceSetName = "人脸库名称" }; try { var resp = client.DeleteFaceSet(req); var respStatusCode = resp.HttpStatusCode; Console.WriteLine(respStatusCode); } catch (RequestTimeoutException requestTimeoutException) { Console.WriteLine(requestTimeoutException.ErrorMessage); } catch (ServiceResponseException clientRequestException) { Console.WriteLine(clientRequestException.HttpStatusCode); Console.WriteLine(clientRequestException.ErrorCode); Console.WriteLine(clientRequestException.ErrorMsg); } catch (ConnectionException connectionException) { Console.WriteLine(connectionException.ErrorMessage); } 添加人脸 var req = new AddFacesByBase64Request { }; req.Body = new AddFacesBase64Req() { ImageBase64 = "图片的base64编码" }; try { var resp = client.AddFacesByBase64(req); var respStatusCode = resp.HttpStatusCode; Console.WriteLine(respStatusCode); } catch (RequestTimeoutException requestTimeoutException) { Console.WriteLine(requestTimeoutException.ErrorMessage); } catch (ServiceResponseException clientRequestException) { Console.WriteLine(clientRequestException.HttpStatusCode); Console.WriteLine(clientRequestException.ErrorCode); Console.WriteLine(clientRequestException.ErrorMsg); } catch (ConnectionException connectionException) { Console.WriteLine(connectionException.ErrorMessage); } 删除人脸 var req = new DeleteFaceByFaceIdRequest { FaceSetName = "人脸库名称", FaceId = "人脸ID" }; try { var resp = client.DeleteFaceByFaceId(req); var respStatusCode = resp.HttpStatusCode; Console.WriteLine(respStatusCode); } catch (RequestTimeoutException requestTimeoutException) { Console.WriteLine(requestTimeoutException.ErrorMessage); } catch (ServiceResponseException clientRequestException) { Console.WriteLine(clientRequestException.HttpStatusCode); Console.WriteLine(clientRequestException.ErrorCode); Console.WriteLine(clientRequestException.ErrorMsg); } catch (ConnectionException connectionException) { Console.WriteLine(connectionException.ErrorMessage); } 批量删除人脸 var req = new BatchDeleteFacesRequest { }; req.Body = new DeleteFacesBatchReq() { Filter = "过滤条件" }; try { var resp = client.BatchDeleteFaces(req); var respStatusCode = resp.HttpStatusCode; Console.WriteLine(respStatusCode); } catch (RequestTimeoutException requestTimeoutException) { Console.WriteLine(requestTimeoutException.ErrorMessage); } catch (ServiceResponseException clientRequestException) { Console.WriteLine(clientRequestException.HttpStatusCode); Console.WriteLine(clientRequestException.ErrorCode); Console.WriteLine(clientRequestException.ErrorMsg); } catch (ConnectionException connectionException) { Console.WriteLine(connectionException.ErrorMessage); } 更新人脸 var req = new UpdateFaceRequest { }; req.Body = new UpdateFaceReq() { FaceId = "人脸库ID" }; try { var resp = client.UpdateFace(req); var respStatusCode = resp.HttpStatusCode; Console.WriteLine(respStatusCode); } catch (RequestTimeoutException requestTimeoutException) { Console.WriteLine(requestTimeoutException.ErrorMessage); } catch (ServiceResponseException clientRequestException) { Console.WriteLine(clientRequestException.HttpStatusCode); Console.WriteLine(clientRequestException.ErrorCode); Console.WriteLine(clientRequestException.ErrorMsg); } catch (ConnectionException connectionException) { Console.WriteLine(connectionException.ErrorMessage); } } 查询人脸 var req = new ShowFacesByFaceIdRequest { FaceSetName = "人脸库名称", FaceId = "人脸ID" }; try { var resp = client.ShowFacesByFaceId(req); var respStatusCode = resp.HttpStatusCode; Console.WriteLine(respStatusCode); } catch (RequestTimeoutException requestTimeoutException) { Console.WriteLine(requestTimeoutException.ErrorMessage); } catch (ServiceResponseException clientRequestException) { Console.WriteLine(clientRequestException.HttpStatusCode); Console.WriteLine(clientRequestException.ErrorCode); Console.WriteLine(clientRequestException.ErrorMsg); } catch (ConnectionException connectionException) { Console.WriteLine(connectionException.ErrorMessage); } 动作活体检测 var req = new DetectLiveByBase64Request { }; req.Body = new LiveDetectBase64Req() { Actions = "动作代码顺序列表", VideoBase64 = "视频数据的base64编码" }; try { var resp = client.DetectLiveByBase64(req); var respStatusCode = resp.HttpStatusCode; Console.WriteLine(respStatusCode); } catch (RequestTimeoutException requestTimeoutException) { Console.WriteLine(requestTimeoutException.ErrorMessage); } catch (ServiceResponseException clientRequestException) { Console.WriteLine(clientRequestException.HttpStatusCode); Console.WriteLine(clientRequestException.ErrorCode); Console.WriteLine(clientRequestException.ErrorMsg); } catch (ConnectionException connectionException) { Console.WriteLine(connectionException.ErrorMessage); } 静默活体检测 var req = new DetectLiveFaceByBase64Request { }; req.Body = new LiveDetectFaceBase64Req() { ImageBase64 = "图片的base64编码" }; try { var resp = client.DetectLiveFaceByBase64(req); var respStatusCode = resp.HttpStatusCode; Console.WriteLine(respStatusCode); } catch (RequestTimeoutException requestTimeoutException) { Console.WriteLine(requestTimeoutException.ErrorMessage); } catch (ServiceResponseException clientRequestException) { Console.WriteLine(clientRequestException.HttpStatusCode); Console.WriteLine(clientRequestException.ErrorCode); Console.WriteLine(clientRequestException.ErrorMsg); } catch (ConnectionException connectionException) { Console.WriteLine(connectionException.ErrorMessage); }
  • 开始使用 详细的SDK介绍,使用异步客户端,配置日志请参见SDK中心、.NET SDK使用指导、.NET SDK视频指导。 导入依赖模块 using System; using System.Collections.Generic; using HuaweiCloud.SDK.Core; using HuaweiCloud.SDK.Core.Auth; using HuaweiCloud.SDK.Frs; using HuaweiCloud.SDK.Frs.V2; using HuaweiCloud.SDK.Frs.V2.Model; 配置客户端连接参数 默认配置 // 使用默认配置 var config = HttpConfig.GetDefaultConfig(); 网络代理(可选) // 根据需要配置网络代理 config.ProxyHost = "proxy.huaweicloud.com"; config.ProxyPort = 8080; config.ProxyUsername = "test"; config.ProxyPassword = "test"; 超时配置(可选) // 默认超时时间为120秒,可根据需要调整 config.Timeout = 120; SSL配置(可选) // 根据需要配置是否跳过SSL证书验证 config.IgnoreSslVerification = true; 配置认证信息 配置AK、SK信息。华为云通过AK识别用户的身份,通过SK对请求数据进行签名验证,用于确保请求的机密性、完整性和请求者身份的正确性。AK、SK获取方法请参见准备工作。 const string ak = Environment.GetEnvironmentVariable("HUAWEICLOUD_SDK_AK"); const string sk = Environment.GetEnvironmentVariable("HUAWEICLOUD_SDK_SK"); var auth = new BasicCredentials(ak, sk); 认证用的 ak 和sk 硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 本示例以 ak 和 sk 保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 图3 Windows环境新建环境变量 初始化客户端 指定云服务region方式(推荐) // 初始化指定云服务的客户端 {Service}Client ,以初始化FRS服务的 FrsClient 为例 var client = FrsClient.NewBuilder() .WithCredential(auth) .WithRegion(FrsRegion.ValueOf("cn-north-4")) .WithHttpConfig(config) .Build(); 指定云服务endpoint方式 // 指定终端节点,以FRS服务北京四的 endpoint 为例 String endpoint = "https://face.cn-north-4.myhuaweicloud.com"; // 初始化客户端认证信息,需要填写相应 projectId,以初始化 BasicCredentials 为例 var auth = new BasicCredentials(ak, sk, projectId); // 初始化指定云服务的客户端 {Service}Client,以初始化FRS服务的 FrsClient 为例 var client = FrsClient.NewBuilder() .WithCredential(auth) .WithEndPoint(endpoint) .WithHttpConfig(config) .Build(); endpoint是华为云各服务应用区域和各服务的终端节点,详情请查看 地区和终端节点 。 发送请求并查看响应 // 以调用人脸检测接口 DetectFaceByBase64 为例 var req = new DetectFaceByBase64Request { }; req.Body = new FaceDetectBase64Req() { ImageBase64 = "图片的base64编码" }; try { var resp = client.DetectFaceByBase64(req); var respStatusCode = resp.HttpStatusCode; Console.WriteLine(respStatusCode); } 使用人脸比对SDK时,image1、image2参数需为相同类型,即同为url、base64或file。 异常处理 表1 异常处理 一级分类 一级分类说明 二级分类 二级分类说明 ConnectionException 连接类异常 HostUnreachableException 网络不可达、被拒绝。 SslHandShakeException SSL认证异常。 RequestTimeoutException 响应超时异常 CallTimeoutException 单次请求,服务器处理超时未返回。 RetryOutageException 在重试策略消耗完成后,仍无有效的响应。 ServiceResponseException 服务器响应异常 ServerResponseException 服务端内部错误,Http响应码:[500,]。 ClientRequestException 请求参数不合法,Http响应码:[400, 500) // 捕获和处理不同类型的异常 try { var resp = client.DetectFaceByBase64(req); var respStatusCode = resp.HttpStatusCode; Console.WriteLine(respStatusCode); } catch (RequestTimeoutException requestTimeoutException) { Console.WriteLine(requestTimeoutException.ErrorMessage); } catch (ServiceResponseException clientRequestException) { Console.WriteLine(clientRequestException.HttpStatusCode); Console.WriteLine(clientRequestException.ErrorCode); Console.WriteLine(clientRequestException.ErrorMsg); } catch (ConnectionException connectionException) { Console.WriteLine(connectionException.ErrorMessage); }
  • 开始使用 详细的SDK介绍请参见SDK中心、Go SDK使用指导、Go SDK使用视频。 导入依赖模块 import ( "fmt" "os" "github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/basic" // 导入v2版本sdk frs "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/frs/v2" "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/frs/v2/model" region "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/frs/v2/region" ) 配置认证信息 配置AK、SK信息。华为云通过AK识别用户的身份,通过SK对请求数据进行签名验证,用于确保请求的机密性、完整性和请求者身份的正确性。AK、SK获取方法请参见准备工作。 func GetCredential(ak, sk string) basic.Credentials { // Init Auth Info return basic.NewCredentialsBuilder(). WithAk(ak). WithSk(sk). Build() } 初始化认证信息: ak := os.Getenv("HUAWEICLOUD_SDK_AK") sk := os.Getenv("HUAWEICLOUD_SDK_SK") client := GetCredential(ak, sk) 认证用的 ak 和sk 硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 本示例以 ak 和 sk 保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 图3 Windows环境新建环境变量 初始化客户端 指定region方式 // # 初始化人脸识别服务的客户端,并选择服务部署区域 func GetClient(auth basic.Credentials) *frs.FrsClient { client := frs.NewFrsClient( frs.FrsClientBuilder(). WithRegion(region.ValueOf('cn-north-4')). WithCredential(auth). Build()) return client } 服务部署区域请参见终端节点。 发送请求并查看下响应 request := &model.DetectFaceByBase64Request{} request.Body = &model.FaceDetectBase64Req{ ImageBase64: "/9j/4AAQSkZJRgABAQAAAQABAAD...", } response, err := client.DetectFaceByBase64(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) } 使用人脸比对SDK时,image1、image2参数需为相同类型,即同为url、base64或file。 异常处理 表1 异常处理 一级分类 一级分类说明 ServiceResponseError 服务响应异常 url.Error url异常 // 捕获和处理不同类型的异常 response, err := client.DetectFaceByBase64(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) }
  • SDK demo代码解析 人脸检测 // detect face by base64 request := &model.DetectFaceByBase64Request{} attributesFaceDetectBase64Req := "2" request.Body = &model.FaceDetectBase64Req{ Attributes: &attributesFaceDetectBase64Req, ImageBase64: "/9j/4AAQSkZJRgABAQAAAQABAAD...", } response, err := client.DetectFaceByBase64(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) } // detect face by file file, err := os.Open("/root/picture.jpg") if err != nil { fmt.Println(err) } defer file.Close() request := &model.DetectFaceByFileRequest{} request.Body = &model.DetectFaceByFileRequestBody{ Attributes: def.NewMultiPart(attributes), ImageFile: def.NewFilePart(file), } response, err := client.DetectFaceByFile(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) } 人脸比对 // compare face by base64 request := &model.CompareFaceByBase64Request{} request.Body = &model.FaceCompareBase64Req{ Image1Base64: "/9j/4AAQSkZJRgABAQAAAQABAAD...", Image2Base64: "/9j/4AAQSkZJRgABAQAAAQABAAD...", } response, err := client.CompareFaceByBase64(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) } // compare face by file file1, err := os.Open("/root/picture1.jpg") if err != nil { fmt.Println(err) } defer file1.Close() file2, err := os.Open("/root/picture2.jpg") if err != nil { fmt.Println(err) } defer file2.Close() request := &model.CompareFaceByFileRequest{} request.Body = &model.CompareFaceByFileRequestBody{ Image1File: def.NewFilePart(file1), Image2File: def.NewFilePart(file2), } response, err := client.CompareFaceByFile(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) } 人脸搜索 // face search by base64 request := &model.SearchFaceByBase64Request{} request.FaceSetName = "face_set_name" var listReturnFieldsbody = []string{ "timestamp", "id", } request.Body = &model.FaceSearchBase64Req{ ReturnFields: &listReturnFieldsbody, ImageBase64: "/9j/4AAQSkZJRgABAQAAAQABAAD...", } response, err := client.SearchFaceByBase64(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) } // face search by file file, err := os.Open("/root/picture.jpg") if err != nil { fmt.Println(err) } defer file.Close() request := &model.SearchFaceByFileRequest{} request.FaceSetName = "face_set_name" request.Body = &model.SearchFaceByFileRequestBody{ ReturnFields: def.NewMultiPart("[\"timestamp\"]"), Filter: def.NewMultiPart("timestamp:10"), ImageFile: def.NewFilePart(file), } response, err := client.SearchFaceByFile(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) } 创建人脸库 request := &model.CreateFaceSetRequest{} request.Body = &model.CreateFaceSetReq{ FaceSetName: "face_set_name", } response, err := client.CreateFaceSet(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) } 查询人脸库 request := &model.ShowFaceSetRequest{} request.FaceSetName = "face_set_name" response, err := client.ShowFaceSet(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) } 查询所有人脸库 request := &model.ShowAllFaceSetsRequest{} response, err := client.ShowAllFaceSets(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) } 删除人脸库 request := &model.DeleteFaceSetRequest{} request.FaceSetName = "face_set_name" response, err := client.DeleteFaceSet(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) } 添加人脸 // add face by base64 request := &model.AddFacesByBase64Request{} request.FaceSetName = "face_set_name" var externalFieldsAddFacesBase64Req interface{} = "{\"timestamp\":12}" request.Body = &model.AddFacesBase64Req{ ExternalFields: &externalFieldsAddFacesBase64Req, ImageBase64: "/9j/4AAQSkZJRgABAQAAAQABAAD...", } response, err := client.AddFacesByBase64(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) } // add face by file file, err := os.Open("/root/picture.jpg") if err != nil { fmt.Println(err) } defer file.Close() request := &model.AddFacesByFileRequest{} request.FaceSetName = "face_set_name" request.Body = &model.AddFacesByFileRequestBody{ ExternalFields: def.NewMultiPart("{\"timestamp\":100}"), ImageFile: def.NewFilePart(file), } response, err := client.AddFacesByFile(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) } 删除人脸 request := &model.DeleteFaceByExternalImageIdRequest{} request.FaceSetName = "face_set_name" request.ExternalImageId = "external_image_id" response, err := client.DeleteFaceByExternalImageId(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) } 批量删除人脸 request := &model.BatchDeleteFacesRequest{} request.FaceSetName = "face_set_name" request.Body = &model.DeleteFacesBatchReq{ Filter: "age:[20 TO 30]", } response, err := client.BatchDeleteFaces(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) } 更新人脸 request := &model.UpdateFaceRequest{} request.FaceSetName = "face_set_name" externalImageIdUpdateFaceReq:= "external_image_id" var externalFieldsUpdateFaceReq interface{} = "{\"timestamp\":12}" request.Body = &model.UpdateFaceReq{ FaceId: "LkPJblq6", ExternalImageId: &externalImageIdUpdateFaceReq, ExternalFields: &externalFieldsUpdateFaceReq, } response, err := client.UpdateFace(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) } 查询人脸 //Show Faces By FaceId request := &model.ShowFacesByFaceIdRequest{} request.FaceSetName = "face_set_name" request.FaceId = "LkPJblq6" response, err := client.ShowFacesByFaceId(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) } 动作活体检测 //detect live by base64 request := &model.DetectLiveByBase64Request{} request.Body = &model.LiveDetectBase64Req{ Actions: "1,2,3,4", VideoBase64: "/9j/4AAQSkZJRgABAQAAAQABAAD...", } response, err := client.DetectLiveByBase64(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) } //detect live by file file, err := os.Open("/root/video.mp4") if err != nil { fmt.Println(err) } defer file.Close() request := &model.DetectLiveByFileRequest{} request.Body = &model.DetectLiveByFileRequestBody{ Actions: def.NewMultiPart(action), VideoFile: def.NewFilePart(file), } response, err := client.DetectLiveByFile(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) } 静默活体检测 //detect live face by base64 request := &model.DetectLiveFaceByBase64Request{} request.Body = &model.LiveDetectFaceBase64Req{ ImageBase64: "/9j/4AAQSkZJRgABAQAAAQABAAD...", } response, err := client.DetectLiveFaceByBase64(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) } //detect live face by file file, err := os.Open("/root/picture.jpg") if err != nil { fmt.Println(err) } defer file.Close() request := &model.DetectLiveFaceByFileRequest{} request.Body = &model.DetectLiveFaceByFileRequestBody{ ImageFile: def.NewFilePart(file), } response, err := client.DetectLiveFaceByFile(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) }
  • 操作步骤 进入公网域名列表页面。 在公网域名列表中,勾选待修改记录集的域名。 在公网域名列表上方,选择“批量操作 > 批量修改记录集”。 在批量修改记录集页面,根据提示配置相关参数。 域名:默认展示已勾选的域名信息,也支持手动输入。每行输入一个域名,最多可输入10000个域名。 主机记录等于:输入待修改记录集的主机记录。每输入一个主机记录后单击回车,最多可输入5个主机记录。 主机记录改为:输入待修改记录集的新主机记录,选择此项时无需配置新记录值。 记录值改为:输入待修改记录集的新记录值,每行输入一个IP地址,最多可输入50个不重复地址。选择此项时无需配置新主机记录。 图1 批量修改记录集示例 单击“提交”,完成批量修改记录集操作。 您可以在每个域名对应的记录集列表中查看修改的记录集。当记录集的状态显示为“正常”时,表示记录集修改成功。 操作完成后,您可以在“批量操作记录”页面查看操作名称、操作结果、操作时间和状态信息,还可以下载失败操作记录。
  • DCS支持哪些实例类型变更? 表1 DCS实例类型变更明细 实例版本 支持的实例变更类型 变更须知及影响 Redis 3.0 单机实例变更为主备实例 连接会有秒级中断,大约1分钟左右的只读。 主备实例变更为Proxy集群实例 如果Redis 3.0主备实例数据存储在多DB上,或数据存储在非DB0上,不支持变更为Proxy集群;数据必须是只存储在DB0上的主备实例才支持变更为Proxy集群。 连接会中断,5~30分钟只读。 Memcached 单机实例变更为主备实例 会有秒级业务中断、大约1分钟只读。 Redis 4.0/5.0 主备实例或读写分离实例变更为Proxy集群实例 变更为proxy集群时,需要评估proxy集群的多DB使用限制和命令使用限制对业务的影响。具体请参考proxy集群使用多DB限制,实例受限使用命令。 变更前实例的已用内存必须小于变更后最大内存的70%,否则将不允许变更。 如果变更前实例的已用内存超过总内存的90%,变更的过程中可能会导致部分key逐出。 变更完成后需要对实例重新创建告警规则。 如果原实例是主备实例,请确保应用中没有直接引用只读IP或只读域名。 请确保您的客户端应用具备重连机制和处理异常的能力,否则在变更规格后有可能需要重启客户端应用。 变更规格过程中会有秒级业务中断、大约1分钟只读,建议在业务低峰时进行变更。 Proxy集群实例变更为主备实例或读写分离实例 实例类型变更后支持的命令,请参考对应的开源命令兼容性。 除了上表中提到的实例外,其他实例类型目前不支持实例类型的变更,若您想实现跨实例类型的规格变更,可参考使用迁移任务在线迁移Redis实例进行操作。 实例类型是否支持变更,以控制台实例的“变更规格”操作界面为准。 图1 支持变更的实例类型 父主题: 扩容缩容与实例升级
  • 主备实例的只读地址是连接到主节点还是备节点? Redis 4.0、Redis 5.0、和Redis 6.0的基础版主备实例的连接信息中,有“连接地址”和“只读地址”。其中,连接地址是连接主备实例的主节点,只读地址是连接主备实例的备节点。 详情可以参考Redis 4.0/5.0/6.0基础版主备实例架构设计。 图1 连接信息 默认情况下,客户端通过主备实例的主节点读、写数据,备节点用于同步数据。如需使用“只读地址”实现读写分离,需要在客户端增加用户读写请求判断,如果是写请求,将请求发送给读写域名,如果是读请求,将请求发送给只读域名。 父主题: 客户端和网络连接
  • 查看微服务运行指标 登录微服务引擎控制台。 在左侧导航栏选择“ServiceComb引擎专享版”。 单击待操作的引擎。 单击“仪表盘”。 未开启安全认证的ServiceComb引擎,请执行6。 开启安全认证的ServiceComb引擎,请执行5。 在弹出的“安全认证”对话框输入账号名及其密码,单击“确定”。 首次连接ServiceComb引擎,请输入root账号名及创建ServiceComb引擎时输入的密码。 创建账号请参考新增账号。 在“仪表盘”页面,在下拉列表框选择需要查看的应用,在搜索框输入微服务名称,查询微服务,页面将展示筛选出的微服务的运行指标。 单击“查看示例图”,可以查看运行指标参数含义。 选择排序方式,筛选出的微服务会按照指定方式进行排序。
共100000条