华为云用户手册

  • 算子参数配置示例 Inputs参数 Input结构体参数说明参见创建工作流API。 regex参数设置的正则表达式请使用regexploit工具校验。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [ { //算子所在工作流输入列表 "parameter_name": "bucket", "parameter_value": "", "value_type": "", "default": "", "type": "string", "label": "Body", "constraints": { "regex": ".*"//正则表达式请使用regexploit工具校验 }, "invisible": false, "description": "doc destination bucket name" } ] 动态参数 1 2 3 4 5 { "bucket": { "get_input": "$.inputs.bucket"//该值需要跟inputs参数中的parameter_name取值保持一致 } } 权限版本 obs授权参见对象相关授权项和桶相关授权。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [ { //1.1版本支持细粒度授权,可以精确到具体服务的操作、资源以及请求条件等 "version": "1.1", "statement": [ { //对IAM用户组授予OBS指定资源的指定操作权限 "action": [ "obs:bucket:HeadBucket", "obs:bucket:ListBucketMultipartUploads", "obs:object:AbortMultipartUpload", "obs:object:PutObject", "obs:bucket:GetBucketAcl", "obs:object:GetObject" ] } ] } ]
  • 前提条件 算子已开发完成,开发规范参考自定义函数开发规范,建议使用Go、Python开发(算子的冷启动效果更好)。 算子已在华为云云市场上架,上架指导参考发布API类商品操作指导。 开发的新算子如果要支持同步工作流,需要保证同步工作流最后一个算子返回方式为以下的一种: 返回方式1:字符串数据 { "execution_name":"84a3dd2bd67f43aa9b98cdd74604ca68", //工作流实例名称 "graph_name":"test_workflow", //工作流名称 "Records":[ // 处理对象 ], "dynamic_source": {//执行算子的输出结果 "tasks": [ {body}, // 直接返回body字符串 ] } } 返回方式2:文件流数据 { "execution_name":"84a3dd2bd67f43aa9b98cdd74604ca68", //工作流实例名称 "graph_name":"test_workflow", //工作流名称 "Records":[ // 处理对象 ], "dynamic_source":{ //执行算子的输出结果 "tasks":[ { "output":{ // 同步返回的输出文件地址:桶名、对象名、区域 "bucket":"bucketname", "object":"objectname", "location":"cn-north-4" } } ] } }
  • DWR自定义策略样例 示例1:授权用户创建、删除、执行工作流 1 2 3 4 5 6 7 8 9 10 11 12 13 { "Version": "1.1", "Statement": [{ "Effect": "Allow", "Action": [ "dwr:workflow:get*", "dwr:workflow:list*", "dwr:workflow:createWorkflow", "dwr:workflow:deleteWorkflow", "dwr:workflow:executeAsync", ], }] } 示例2:授权用户查询、创建、删除、禁用第三方算子 1 2 3 4 5 6 7 8 9 10 11 12 13 14 { "Version": "1.1", "Statement": [{ "Effect": "Allow", "Action": [ "dwr:workflow:get*", "dwr:workflow:list*", "dwr:workflow:createMyActionTemplate", "dwr:workflow:deleteMyActionTemplate", "dwr:workflow:forbidMyActionTemplate", ], }] }
  • 对接转码函数示例(GO语言) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 package main import ( "encoding/json" "errors" "go-runtime/go-api/context" ) func DemoTranscodeHandler(jsonData []byte, ctx context.RuntimeContext) (interface{}, error) { var eventMsg Payload err := json.Unmarshal(jsonData, &eventMsg) if err != nil { return nil, errors.New("not correct format") } // 存储输入桶和对象值 record := eventMsg.Records[0] // 定义输出 resp := struct { OBSMessages Inputs map[string]interface{} `json:"inputs"` ExecutionName string `json:"execution_name"` GraphName string `json:"graph_name"` DynamicSource struct { *CreateTranscodeDynamicSourceBody } `json:"dynamic_source"` }{} // 配置截图参数,为下游截图任务提供参数配置 resp.DynamicSource.CreateTranscodeDynamicSourceBody = &CreateTranscodeDynamicSourceBody{ Transcodes: []*CreateTranscodeTaskBody{ &CreateTranscodeTaskBody{ //源文件地址。 Input: &FileAddr{ Location: "cn-north-4", BucketName: record.Obs.Bucket.Name, Object: record.Obs.Object.Key, }, //输出地址。 Output: &FileAddr{ Location: "cn-north-4", BucketName: record.Obs.Bucket.Name, Object: "transcode_out", }, TransTemplateID: []int{7000523, 7000524, 7000526, 7000528, 7000530, 7000538}, OutputFilenames: []string{"out_file1", "out_file2", "out_file3", "out_file4", "out_file5", "out_file6"}, }, }, } // 以下参数需要继承传递,方便工作流下游函数获取对应参数值 resp.Inputs = eventMsg.Inputs resp.Records = eventMsg.Records resp.GraphName = eventMsg.GraphName resp.ExecutionName = eventMsg.ExecutionName return resp, nil }
  • 结构体示例(GO语言) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 package main type CreateTranscodeDynamicSourceBody struct { Transcodes []*CreateTranscodeTaskBody `json:"transcodes"` } type CreateTranscodeTaskBody struct { //源文件存储地址。 Input *FileAddr `json:"input,omitempty"` //转码后的视频文件存储地址。 Output *FileAddr `json:"output"` //转码模板ID,数组 TransTemplateID []int `json:"trans_template_id,omitempty"` //支持图片水印和文字水印,最多支持20个。 Watermarks []*Watermark `json:"watermarks,omitempty"` //任务优先级。 Priority string `json:"priority,omitempty"` //输出文件名称,每一路转码输出对应一个名称,需要与转码模板ID数组的顺序对应。 OutputFilenames []string `json:"output_filenames,omitempty"` } type Watermark struct { Input *FileAddr `json:"input,omitempty"` TemplateID int `json:"template_id,omitempty"` TextContext string `json:"text_context,omitempty"` ImageWatermark *ImageWatermark `json:"image_watermark,omitempty"` TextWatermark *TextWatermark `json:"text_watermark,omitempty"` } type TextWatermark struct { Dx string `json:"dx,omitempty"` Dy string `json:"dy,omitempty"` ReferPos string `json:"referpos,omitempty"` TimelineStart string `json:"timeline_start,omitempty"` TimelineDuration string `json:"timeline_duration,omitempty"` FontName string `json:"font_name,omitempty"` FontSize string `json:"font_size,omitempty"` FontColor string `json:"font_color,omitempty"` Base string `json:"base,omitempty"` } type ImageWatermark struct { Dx string `json:"dx,omitempty"` Dy string `json:"dy,omitempty"` ReferPos string `json:"referpos,omitempty"` TimelineStart string `json:"timeline_start,omitempty"` TimelineDuration string `json:"timeline_duration,omitempty"` ImageProcess string `json:"image_process,omitempty"` Width string `json:"width,omitempty"` Height string `json:"height,omitempty"` Base string `json:"base,omitempty"` } type CreateThumbnailDynamicSourceBody struct { Thumbnails []*ThumbnailCreateTaskBody `json:"thumbnails"` } //FileAddr 文件路径结构定义 type FileAddr struct { Location string `json:"location"` BucketName string `json:"bucket"` Object string `json:"object"` } type ThumbnailCreateTaskBody struct { //源文件地址。 Input *FileAddr `json:"input"` //输出地址。 Output *FileAddr `json:"output"` //是否压缩抽帧图片生成tar包。 Tar int `json:"tar,omitempty"` //是否同步处理,同步处理是指不下载全部文件,快速定位到截图位置进行截图。 Mode int `json:"sync,omitempty"` //截图参数 ThumbnailParam *ThumbnailParam `json:"thumbnail_para"` } type ThumbnailParam struct { Type string `json:"type"` Time int64 `json:"time,omitempty"` StartTime int64 `json:"start_time,omitempty"` Duration int64 `json:"duration,omitempty"` Dots []int64 `json:"dots,omitempty"` Format int64 `json:"format,omitempty"` AspectRatio int64 `json:"aspect_ratio,omitempty"` Width int64 `json:"width,omitempty"` Height int64 `json:"height,omitempty"` MaxLength int64 `json:"max_length,omitempty"` OutputFileName string `json:"output_filename,omitempty"` } type OBSMessages struct { Records []OBSRecord `json:"Records"` } // OBSRecord OBS消息格式 type OBSRecord struct { EventVersion string `json:"eventVersion"` EventSource string `json:"eventSource"` EventRegion string `json:"eventRegion"` EventTime string `json:"eventTime"` EventName string `json:"eventName"` UserIdentity UserIdentity `json:"userIdentity"` RequestParameters RequestParameters `json:"requestParameters"` ResponseElements ResponseElements `json:"responseElements"` Obs *OBSInfo `json:"obs"` } // UserIdentity 用户id type UserIdentity struct { ID string `json:"ID,omitempty"` } //RequestParameters 原始请求参数 type RequestParameters struct { SourceIPAddress string `json:"sourceIPAddress,omitempty"` } //ResponseElements 响应参数 type ResponseElements struct { OBSRequestID string `json:"x-obs-request-id"` OBSID2 string `json:"x-obs-id-2"` } //OBSInfo OBS信息 type OBSInfo struct { Version string `json:"Version"` ConfigurationID string `json:"configurationId"` Bucket BucketInfo `json:"bucket"` Object ObjectInfo `json:"object"` } //BucketInfo 桶信息 type BucketInfo struct { Name string `json:"name"` OwnerIdentity UserIdentity `json:"ownerIdentity"` Bucket string `json:"bucket"` } //ObjectInfo 对象信息 type ObjectInfo struct { Key string `json:"key"` Tag string `json:"eTag"` Size uint64 `json:"size"` VersionID string `json:"versionId"` Sequencer string `json:"sequencer"` } type Payload struct { ExecutionName string `json:"execution_name"` GraphName string `json:"graph_name"` OBSMessages DynamicSource interface{} `json:"dynamic_source"` Inputs map[string]interface{} `json:"inputs"` }
  • 函数输出参数 函数输出参数的JSON格式的结构体定义如下: 表3 函数输出的JSON格式体 名称 是否必选 参数类型 说明 约束 execution_name 是 String 工作流实例名称。 继承函数输入参数的execution_name。 graph_name 是 String 工作流名称。 继承函数输入参数的graph_name。 Records 是 Array 工作流触发的事件源事件消息。 如果没有变化,则继承函数输入参数的records。 inputs 否 Map[String]String 用户可修改参数列表。 如果没有新增,则继承函数输入参数的inputs。 dynamic_source 否 Map 函数的输出参数,可用于传递给下一个执行的函数。 - operation_name 否 String 函数操作名。 系统内置的工作流函数操作名有: 视频解析:MPC.Metadata 视频截图:MPC.Thumbnail 视频转码:MPC.Transcode SMN消息通知:SMN.Publish
  • 函数输入参数 工作流执行自定义函数时,函数输入参数的JSON格式的结构体和环境变量的定义如下: 表1 函数输入的JSON格式体 名称 是否必选 参数类型 说明 execution_name 是 String 工作流实例名称。 graph_name 是 String 工作流名称。 Records 是 Array 工作流触发的事件源事件消息。 inputs 否 Map[String]String 用户可修改参数列表,可以为空。 dynamic_source 否 Map 函数执行必须的参数,可用于传入调用的服务。 表2 函数的环境变量 名称 是否必选 参数类型 说明 region 否 String 当前区域名称。 函数输入的JSON示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 { "execution_name": "84a3dd2bd67f43aa9b98cdd74604ca68",//工作流实例名称 "graph_name": "test_workflow",//工作流名称 "Records": [ { "eventName": "ObjectCreated:Put",//触发事件通知的事件名 "eventRegion": "cn-north-4",//事件所在的region "eventSource": "OBS",//消息源,固定为"OBS" "eventTime": "2021-12-23T14:50:22.957Z",//事件时间,格式为ISO-8601,示例:2020-07-10T09:24:11.418Z "eventVersion": "3.0",//版本号,目前为"3.0" "obs": { "Version": "1.0", "bucket": { "bucket": "examplebucket",//桶名 "name": "examplebucket",//桶名 "ownerIdentity": { "ID": "08b4efe0fc00d3ce0f17c01b948f6e80"//桶拥有者的账号ID } }, "configurationId":"test-trigger",//此事件匹配的OBS中事件触发器的名称 "object": { "eTag": "fc85a07cff68977bf5b2108e7436ca2d",//对象的etag "key": "exampleobject.docx",//对象名 "oldpsxpth": "",//文件在并行文件系统中rename前的路径 "sequencer": "1",//确定某个特定对象事件顺序的标识 "size": "524298",//对象的大小 "versionId": "G001017DE60E176D0000401106696610null"//对象的版本ID } }, "requestParameters": { "sourceIPAddress": "x.x.x.x"//请求的源IP }, "responseElements": { "x-obs-id-2": "",//帮助定位问题的特殊符号 "x-obs-request-id": "84a3dd2bd67f43aa9b98cdd74604ca68"//请求对应的requestid }, "userIdentity": { "ID": "08b4efe0fc00d3ce0f17c01b948f6e80"//触发事件的用户对应的计费ID } } ], "inputs": { //执行工作流的输入参数 "parametername": "parametervalue", "parametername": "parametervalue" }, "dynamic_source": { //执行自定义函数的输入参数 "parametername": "parametervalue", "parametername": "parametervalue" } }
  • 对接截图函数示例(GO语言) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 package main import ( "encoding/json" "errors" "go-runtime/go-api/context" ) func DemoHandler(jsonData []byte, ctx context.RuntimeContext) (interface{}, error) { var eventMsg Payload err := json.Unmarshal(jsonData, &eventMsg) if err != nil { return nil, errors.New("not correct format") } // 存储输入桶和对象值 record := eventMsg.Records[0] // 定义输出 resp := struct { OBSMessages Inputs map[string]interface{} `json:"inputs"` ExecutionName string `json:"execution_name"` GraphName string `json:"graph_name"` DynamicSource struct { *CreateThumbnailDynamicSourceBody } `json:"dynamic_source"` }{} // 配置截图参数,为下游截图任务提供参数配置 resp.DynamicSource.CreateThumbnailDynamicSourceBody = &CreateThumbnailDynamicSourceBody{ Thumbnails: []*ThumbnailCreateTaskBody{ &ThumbnailCreateTaskBody{ //源文件地址。 Input: &FileAddr{ Location: "cn-north-1", BucketName: record.Obs.Bucket.Name, Object: record.Obs.Object.Key, }, //输出地址。 Output: &FileAddr{ Location: "cn-north-1", BucketName: record.Obs.Bucket.Name, Object: "thumb_out", }, //是否压缩抽帧图片生成tar包。 Tar: 0, //是否同步处理,同步处理是指不下载全部文件,快速定位到截图位置进行截图。 Mode: 0, //截图参数 ThumbnailParam: &ThumbnailParam{ Type: "DOTS", MaxLength: 0, Dots: []int64{2, 10, 14}, // 截图的位置(s) OutputFileName: "default_cover.jpg", }, }, }, } // 以下参数需要继承传递,方便工作流下游函数获取对应参数值 resp.Inputs = eventMsg.Inputs resp.Records = eventMsg.Records resp.GraphName = eventMsg.GraphName resp.ExecutionName = eventMsg.ExecutionName return resp, nil }
  • 示例流程 图1 给用户授予DWR权限流程 创建用户组并授权 在IAM控制台创建用户组,并授予数据工坊只读权限“DWR ReadOnlyAccess”。 创建用户并加入用户组 在IAM控制台创建用户,并将其加入步骤1中创建的用户组。 用户登录并验证权限 新创建的用户登录控制台,切换至授权区域,验证权限:在“服务列表”中选择数据工坊,进入DWR工作流页面,单击右上角“创建工作流”,尝试创建工作流,如果无法创建(假设当前权限仅包含DWR ReadOnlyAccess),表示“DWR ReadOnlyAccess”已生效。
  • 算子参数配置示例 Inputs参数 Input结构体参数说明参见创建工作流API。 regex参数设置的正则表达式请使用regexploit工具校验。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [ { //算子所在工作流输入列表 "parameter_name": "bucket", "parameter_value": "", "value_type": "", "default": "", "type": "string", "label": "Body", "constraints": { "regex": ".*"//正则表达式请使用regexploit工具校验 }, "invisible": false, "description": "doc destination bucket name" } ] 动态参数 1 2 3 4 5 { "bucket": { "get_input": "$.inputs.bucket"//该值需要跟inputs参数中的parameter_name取值保持一致 } } 权限版本 obs授权参见对象相关授权项和桶相关授权。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [ { //1.1版本支持细粒度授权,可以精确到具体服务的操作、资源以及请求条件等 "version": "1.1", "statement": [ { //对IAM用户组授予OBS指定资源的指定操作权限 "action": [ "obs:bucket:HeadBucket", "obs:bucket:ListBucketMultipartUploads", "obs:object:AbortMultipartUpload", "obs:object:PutObject", "obs:bucket:GetBucketAcl", "obs:object:GetObject" ] } ] } ]
  • 创建IAM用户 IAM用户由账号管理员创建并管理,可以确保账号及资源的安全性,有关IAM的详细介绍请参见IAM用户。此处介绍如何创建一个具有DWR访问权限的IAM用户。如果您不需要使用IAM用户,可以略过此部分内容。 在华为云官网,单击页面右上角的“控制台”,使用注册账号登录控制台。 在“控制台”页面,鼠标移动至右上方的用户名,在下拉列表中选择“统一身份认证”。 创建用户组。 详细步骤请参见创建用户组,创建成功后,为该用户组配置Tenant Administrator权限。 创建用户。 详细步骤请参见创建用户,创建用户时“所属用户组”需选择步骤3创建的用户组。
  • 入门流程 当需要使用DWR服务对OBS内存储的数据自动进行多项复杂任务(如解析、转码、截图等)处理时,建议参考表1逐步操作。 表1 DWR使用流程简介 操作步骤 操作说明 步骤一:准备工作 注册华为云账号,并开通数据工坊DWR服务。 (可选)步骤二:浏览算子市场 在算子市场查找需要的算子,了解已有算子的功能。 步骤三:创建工作流 创建工作流对算子进行编排。 步骤四:启动工作流 当前DWR支持同步和异步两种方式启动工作流。 创建事件触发器异步启动 使用API同步启动 使用API异步启动 步骤五:查看运行记录 查看历史运行记录,了解工作流的执行情况。 父主题: 处理数据
  • SDK概述 对象存储服务软件开发工具包(OBS SDK,Object Storage Service Software Development Kit)是对OBS服务提供的REST API进行的封装,以简化用户的开发工作。用户直接调用OBS SDK提供的接口函数即可实现使用OBS服务业务能力的目的。 相关开发包请从华为云OBS开发工具包(SDK)获取。 同时,我们针对不同语言的SDK提供了开发指南和API参考。开发指南详细介绍了SDK的安装、开发操作、参数、示例和常见问题处理,API参考提供了各API的所有参数及定义。OBS提供了以下主流语言SDK供开发者使用: 语言 SDK开发指南 API参考 Java Java SDK开发指南 - Python Python SDK开发指南 - C C SDK开发指南 - Go Go SDK开发指南 - BrowserJS BrowserJS SDK开发指南 BrowserJS SDK API参考 .NET .NET SDK开发指南 .NET SDK API参考 Android Android SDK开发指南 Android SDK API参考 iOS iOS SDK开发指南 iOS SDK API参考 PHP PHP SDK开发指南 PHP SDK API参考 Node.js Node.js SDK开发指南 Node.js SDK API参考
  • 灰度发布 为保障新特性能平稳上线,可以通过灰度发布功能选择少部分用户试用,待新特性成熟以后,再切换版本让所有用户使用。 基于ServiceComb Java Chassis框架开发的微服务需要在POM中添加依赖darklaunch或handler-router,并且在配置文件中增加servicecomb.router.type=router。 基于Spring Cloud Huawei框架开发的微服务需要在POM中增加依赖spring-cloud-starter-huawei-router。 登录微服务引擎控制台。 在左侧导航栏选择“ServiceComb引擎专享版”。 单击待操作的引擎。 单击“微服务目录”。 未开启安全认证的ServiceComb引擎,请执行6。 开启安全认证的ServiceComb引擎,请执行5。 在弹出的“安全认证”对话框输入账号名及其密码,单击“确定”。 首次连接ServiceComb引擎,请输入root账号名及创建ServiceComb引擎时输入的密码。 创建账号请参考新增账号。 在“微服务列表”页签,单击微服务名称,进入详情页面,单击“灰度发布”。 单击“添加发布规则”,弹出“创建新规则”弹框。 按照权重方式添加灰度规则。 “发布规则”选择“权重”,显示权重规则设置页签。 对权重规则进行设置,权重规则配置项如下表所示。 配置项 说明 规则名称 自定义规则名称。 作用域 选择规则作用的版本。 勾选“是否添加自定义版本”,根据界面提示添加新版本。 规则配置 配置所选版本的引流权重,流量会按照配置的百分比分配给所选择的服务版本。 单击“确定”,完成权重规则配置和灰度发布。 按照自定义方式添加灰度规则。 只有ServiceComb Java Chassis框架开发的微服务通过依赖darklaunch实现灰度能力和Spring Cloud Huawei框架开发的微服务实现灰度能力,可通过此功能实现下发灰度规则。依赖handler-router下发的灰度规则需要手动在配置中心下发。 “发布规则”选择“自定义”,显示自定义规则设置页签。 对自定义规则进行设置,自定义规则配置项如下表所示。 配置项 说明 规则名称 自定义规则名称。 作用域 选择规则作用的版本。 勾选“是否添加自定义版本”,根据界面提示添加新版本。 规则配置 设置匹配规则的参数,使用darklaunch实现灰度能力时,设置的是policyCondition内容,其他设置的是Headers参数。 Spring Cloud Huawei框架开发的微服务设置的Headers参数请参见设置Header参数 。 参数名 根据契约的参数名或Header自定义的key作为参数名设置。 规则 通过选择匹配符和契约的Key或Header的Key对应的Value确定符合该规则的请求将被分配到微服务版本中。 说明: 当匹配符选~时,可使用*或者?字符的模糊匹配规则自定义规则值,*表示任意长度字符,?表示一个字符。比如,字段Name的规则值配置为*1000时,表示Name后4位为1000的都能匹配上。 当匹配符没有选~时,*或者?字符只是普通字符,没有模糊匹配的作用。 单击“确定”,完成自定义规则配置和灰度发布。 下发灰度发布规则样例如下: ServiceComb Java Chassis框架开发的微服务,在ServiceComb引擎页面下发规则是基于darklaunch依赖下发的,通过配置自定义方式添加灰度规则。 其中,在规则配置中,参数名Key必须是契约里面存在的。有可能服务端接口写的是String paramA,加了注解实际生成的是paramB,所以这里应该是写paramB。 通过选择匹配符和契约的Key对应的Value确定符合该规则的请求将被分配到微服务版本中。 成功下发的规则内容如下:配置项为cse.darklaunch.policy.${serviceName}。 ServiceComb Java Chassis框架开发的微服务,依赖handler-router下发的灰度规则需要手动在配置中心下发,配置项为:servicecomb.routeRule.${serviceName},内容如下: Spring Cloud Huawei框架开发的微服务,ServiceComb引擎页面下发灰度规则如下:
  • 查看实例列表 登录微服务引擎控制台。 在左侧导航栏选择“ServiceComb引擎专享版”。 单击待操作的引擎。 单击“微服务目录”。 未开启安全认证的ServiceComb引擎,请执行6。 开启安全认证的ServiceComb引擎,请执行5。 在弹出的“安全认证”对话框输入账号名及其密码,单击“确定”。 首次连接ServiceComb引擎,请输入root账号名及创建ServiceComb引擎时输入的密码。 创建账号请参考新增账号。 单击“实例列表”,进入实例列表查看引擎的所有实例。 支持使用微服务名称搜索目标实例,也可以选择环境、应用筛选实例。
  • 删除微服务 微服务删除后,可通过恢复备份数据进行恢复。 如果删除的服务有实例,需要先将对应实例删除,否则服务会再次注册。 登录微服务引擎控制台。 在左侧导航栏选择“ServiceComb引擎专享版”。 单击待操作的引擎。 单击“微服务目录”。 未开启安全认证的ServiceComb引擎,请执行6。 开启安全认证的ServiceComb引擎,请执行5。 在弹出的“安全认证”对话框输入账号名及其密码,单击“确定”。 首次连接ServiceComb引擎,请输入root账号名及创建ServiceComb引擎时输入的密码。 创建账号请参考新增账号。 单击“微服务列表”,进入微服务列表: 批量删除微服务:勾选待删除的微服务,单击微服务列表上面的“删除”。 删除单个微服务:单击待删除微服务所在行“操作”列的“删除”。 在输入框输入“DELETE”确认删除,单击“确定”。
  • 查看应用列表 登录微服务引擎控制台。 在左侧导航栏选择“ServiceComb引擎专享版”。 单击待操作的引擎。 单击“微服务目录”。 未开启安全认证的ServiceComb引擎,请执行6。 开启安全认证的ServiceComb引擎,请执行5。 在弹出的“安全认证”对话框输入账号名及其密码,单击“确定”。 首次连接ServiceComb引擎,请输入root账号名及创建ServiceComb引擎时输入的密码。 创建账号请参考新增账号。 单击“应用列表”,查看该引擎下当前账号下的所有应用的详细信息。 支持使用应用名称搜索目标应用,也可以选择环境筛选应用。
  • 查看微服务详情 登录微服务引擎控制台。 在左侧导航栏选择“ServiceComb引擎专享版”。 单击待操作的引擎。 单击“微服务目录”。 未开启安全认证的ServiceComb引擎,请执行6。 开启安全认证的ServiceComb引擎,请执行5。 在弹出的“安全认证”对话框输入账号名及其密码,单击“确定”。 首次连接ServiceComb引擎,请输入root账号名及创建ServiceComb引擎时输入的密码。 创建账号请参考新增账号。 单击“微服务列表”下待查看的微服务名称,进入微服务详情页查看实例列表、被调用服务、调用服务、配置、服务契约等信息。
  • 查看微服务列表 登录微服务引擎控制台。 在左侧导航栏选择“ServiceComb引擎专享版”。 单击待操作的引擎。 在页面上方“微服务引擎”下拉列表,选择待操作的微服务引擎。 单击“微服务目录”。 未开启安全认证的ServiceComb引擎,请执行7。 开启安全认证的ServiceComb引擎,请执行6。 在弹出的“安全认证”对话框输入账号名及其密码,单击“确定”。 首次连接ServiceComb引擎,请输入root账号名及创建ServiceComb引擎时输入的密码。 创建账号请参考新增账号。 单击“微服务列表”,查看该引擎下当前账号下的所有微服务。 支持使用微服务名称搜索目标服务,也可以选择环境、应用筛选服务。
  • 操作步骤 登录微服务引擎控制台。 在左侧导航栏选择“应用网关”。 在实例列表页面,可查看实例“运行状态”。 实例的状态包括: 创建中 可用 不可用 配置中 删除中 变更中 创建失败 删除失败 变更失败 未知(即实例处于未知状态) 单击待查看的实例名称。 只有实例运行状态为“可用”才可单击实例名称进入基础信息页面。 查看如表1所示的应用网关信息。 表1 网关详细信息说明 信息类型 参数 说明 基础信息 名称 创建应用网关时输入的实例名称,单击可复制。 ID 引擎的ID,单击可复制。 运行状态 实例的状态。 创建时间 创建应用网关的时间。 标签 显示为网关添加的标签,也可单击“标签管理”,根据需要对标签进行相应操作,具体操作可参见管理标签。 容量规格 创建应用网关时选择的规格,当网关为小规格时,可单击右侧的“扩容”对网关规格扩容,具体操作请参考扩容应用网关。 企业项目 创建应用网关时选择的企业项目。 计费方式 创建应用网关时选择的计费方式。 版本 创建的应用网关的版本号。 可用区 创建应用网关时选择的可用区。 连接信息 内网地址 当创建的负载均衡器开通了IPv4私网,则会显示内网地址。 内网端口 应用网关的访问端口,支持80和443。 公网地址 当创建的负载均衡器开通了IPv4公网,则会显示公网地址。 虚拟私有云 创建应用网关时选择的虚拟私有云。 子网 创建应用网关时选择的子网。 负载均衡器名称 创建应用网关时选择的负载均衡器名称,可单击名称进入负载均衡器详细信息页面。 负载均衡器ID 创建应用网关时选择的负载均衡器ID,单击可复制。
  • 登录微服务引擎控制台 登录华为云控制台。 单击,选择区域。 单击左上角,在服务列表选择“微服务引擎 CSE”,进入微服务引擎控制台。 当您使用从ServiceStage发放的微服务引擎实例时,如想在CSE中发放新实例,需要对CSE云服务进行授权。 当您没有授予任何权限时,由于CSE使用依赖VPC、DNS云服务,因此需要先创建云服务委托,将操作权限委托给CSE。 授权后,CSE将在统一身份认证服务为您创建名为cse_admin_trust的委托,授权成功后,可以进入服务委托列表查看。该操作需要有Security Administrator角色权限,请到“统一身份认证”服务中确认。 如不授权,将影响微服务引擎部分功能的正常使用,包括:创建引擎、升级引擎、开启/关闭安全认证。
  • 访问URL的匹配规则 路由转发策略的URL匹配方式 参数名 取值范围 默认值 是否允许修改 作用范围 spec.rules[].http.paths[].property.'ingress.beta.kubernetes.io/url-match-mode' REGEX/EQUAL_TO/STARTS_WITH STARTS_WITH 允许 CCE Standard/CCE Turbo Ingress中一条转发策略的访问URL的匹配模式:支持正则匹配REGEX、精确匹配EQUAL_TO、前缀匹配STARTS_WITH。默认前缀匹配
  • 预热容器网卡上限检查值 节点预热容器网卡上限检查值 参数名 取值范围 默认值 是否允许修改 作用范围 nic-maximum-target 0-256 0 允许 CCE Turbo 节点预热容器网卡上限检查值: 当节点绑定的容器网卡数超过本参数设置的值,不再主动预热容器网卡。当该参数大于等于节点最少绑定容器网卡数(nic-minimum-target)时,则开启预热容器网卡上限值检查;反之,则关闭预热容器网卡上限值检查。 范围:正整数;例如0,表示关闭预热容器网卡上限值检查。当超过节点的容器网卡配额时,后台取值为节点的容器网卡配额。 配置建议: 建议设置为0,如期望配置检查上限,建议将此值设置为大部分节点平时最多运行的Pod数
  • 动态预热容器网卡数 节点动态预热容器网卡数 参数名 取值范围 默认值 是否允许修改 作用范围 nic-warm-target 0-256 2 允许 CCE Turbo 节点动态预热容器网卡数: 当Pod使用完节点最少绑定容器网卡数(nic-minimum-target)后,会始终额外预热多少张容器网卡,只支持数值配置。 当节点动态预热容器网卡数(nic-warm-target) + 节点当前绑定的容器网卡数 大于 节点预热容器网卡上限检查值(nic-maximum-target)时,只会预热nic-maximum-target与节点当前绑定的容器网卡数的差值。 配置建议: 建议设置为2,此参数提供了动态预热能力,保证了节点始终有一定数量的预热网卡,建议配置为大部分节点日常10s内会瞬时弹性扩容的Pod数。
  • 预热容器网卡回收阈值 节点预热容器网卡回收阈值 参数名 取值范围 默认值 是否允许修改 作用范围 nic-max-above-warm-target 0-256 2 允许 CCE Turbo 节点预热容器网卡回收阈值: 只有当节点上空闲的容器网卡数 - 节点动态预热容器网卡数(nic-warm-target) 大于此阈值时,才会触发预热容器网卡的解绑回收。只支持数值配置。 调大此值会减慢空闲容器网卡的回收,加快Pod的启动速度,但会降低IP地址的利用率,特别是在IP地址紧张的场景,请谨慎调大。 调小此值会加快空闲容器网卡的回收,提高IP地址的利用率,但在瞬时大量Pod激增的场景,部分Pod启动会稍微变慢。 配置建议: 建议设置为2,建议配置为大部分节点日常在分钟级时间范围内会频繁弹性扩容缩容的Pod数 - 大部分节点日常10s内会瞬时弹性扩容的Pod数。
  • 节点最少绑定容器网卡数 节点最少绑定容器网卡数,保障节点最少有多少张容器网卡绑定在节点上,支持数值跟百分比两种配置方式。 参数名 取值范围 默认值 是否允许修改 作用范围 nic-minimum-target 0-256 10 允许 CCE Turbo 节点最少绑定容器网卡数: 保障节点最少有多少张容器网卡绑定在节点上。 范围:正整数;例如10,表示节点最少有10张容器网卡绑定在节点上。当超过节点的容器网卡配额时,后台取值为节点的容器网卡配额。 配置建议: 建议配置为大部分节点日常运行Pod个数的大小;集群中的节点上会根据配置的值预热出一定的网卡个数,预热的网卡会占用容器子网的IP,请合理规划容器子网网段大小。
  • 会话保持配置参数 监听器的会话保持模式为HTTP_COOKIE时,支持配置会话保持时间 参数名 取值范围 默认值 是否允许修改 作用范围 k8s annotation: kubernetes.io/elb.session-affinity-option 无 无 允许 CCE Standard/CCE Turbo 会话保持配置参数,选择HTTP_COOKIE的会话保持模式时,设置会话保持时间persistence_timeout;选择APP_COOKIE的会话保持模式是,设置app_cookie_name。 Ingress中配置的全局会话保持可以被服务中的会话保持模式覆盖。
  • 会话保持模式 监听器的会话保持类型 参数名 取值范围 默认值 是否允许修改 作用范围 k8s annotation: kubernetes.io/elb.session-affinity-mode HTTP_COOKIE、APP_COOKIE 无 允许 CCE Standard/CCE Turbo 会话保持类型。 取值范围:HTTP_COOKIE、APP_COOKIE。 使用说明: 当pool的protocol为HTTP、HTTPS时。如果是独享型负载均衡器的pool, 则type只能为HTTP_COOKIE,其他取值会话保持失效。 如果是共享型负载均衡器的pool, 则type可以为HTTP_COOKIE和APP_COOKIE,其他取值会话保持失效。 Ingress中配置的全局会话保持可以被服务中的会话保持模式覆盖。
  • 证书认证 参数名 取值范围 默认值 是否允许修改 作用范围 Authentication.mode 无 无 允许 CCE Standard/CCE Turbo 集群认证模式。 kubernetes 1.11及之前版本的集群支持“x509”、“rbac”和“authenticating_proxy”,默认取值为“x509”。 kubernetes 1.13及以上版本的集群支持“rbac”和“authenticating_proxy”,默认取值为“rbac”。
  • TCP连接在关闭状态下等待的时间 处于 CLOSE_WAIT 状态的空闲 conntrack 条目在 conntrack 表中保留的时间 参数名 取值范围 默认值 是否允许修改 作用范围 conntrack-tcp-timeout-close-wait 大于等于0 1h0m0s 允许 CCE Standard/CCE Turbo 处于 CLOSE_WAIT 状态的空闲 conntrack 条目在 conntrack 表中保留的时间 配置建议: 不建议配置
共100000条