云服务器内容精选
-
执行结果 执行结果由3部分组成:函数返回、执行摘要和日志。 表21 执行结果说明 参数项 执行成功 执行失败 函数返回 返回函数中定义的返回信息。 返回包含错误信息和错误类型的JSON文件。格式如下: { "errorMessage": "", "errorType":"", } errorMessage:Runtime返回的错误信息 errorType:错误类型 执行摘要 显示请求ID、配置内存、执行时长、实际使用内存和收费时长。 显示请求ID、配置内存、执行时长、实际使用内存和收费时长。 日志 打印函数日志,最多显示4KB的日志。 打印报错信息,最多显示4KB的日志。
-
Go函数接口定义 FunctionGraph运行时支持Go 1.x版本,函数有明确的接口定义,如下所示: func Handler (payload []byte, ctx context.RuntimeContext) 入口函数名(Handler):入口函数名称。 执行事件体(payload): 函数执行界面由用户输入的执行事件参数, 格式为JSON对象。 上下文环境(ctx):Runtime提供的函数执行上下文,其接口定义在SDK接口说明。 Go函数的函数执行入口参数格式为:与代码包中的可执行文件名保持一致。编译后的动态库文件名称必须与函数执行入口的插件名称保持一致,例如:动态库名称为testplugin.so,则函数执行入口命名为testplugin.Handler。请参考函数执行入口进行配置或修改。
-
SDK接口 FunctionGraph函数GoSDK提供了Event事件接口、Context接口和日志记录接口。Go SDK下载(Go SDK下载.sha256)。 Event事件接口 Go SDK加入了触发器事件结构体定义,目前支持 CTS 、KAFKA、DIS、DDS、 SMN 、LTS、TIMER、APIG、八种。在需要使用触发器的场景时,编写相关代码更简单。 APIG触发器相关字段说明 APIGTriggerEvent相关字段说明 表1 APIGTriggerEvent相关字段说明 字段名 字段描述 IsBase64Encoded Event中的body是否是base64编码 HttpMethod Http请求方法 Path Http请求路径 Body Http请求body PathParameters 所有路径参数 RequestContext 相关的APIG配置(APIGRequestContext对象) Headers Http请求头 QueryStringParameters 查询参数 UserData APIG自定义认证中设置的userdata 表2 APIGRequestContext相关字段说明 字段名 字段描述 ApiId API的ID RequestId 此次API请求的requestId Stage 发布环境名称 APIGTriggerResponse相关字段说明 表3 APIGTriggerResponse相关字段说明 字段名 字段描述 Body 消息体 Headers 最终返回的Http响应头 StatusCode Http状态码,int类型 IsBase64Encoded body是否经过base64编码,bool类型 APIGTriggerEvent提供GetRawBody()方法获取base64解码后的body体,相应的APIGTriggerResponse提供SetBase64EncodedBody()方法来设置base64编码的body体。 DIS触发器相关字段说明 表4 DISTriggerEvent相关字段说明 字段名 字段描述 ShardID 分区ID Message DIS消息体(DISMessage结构) Tag 函数版本 StreamName 通道名称 表5 DISMessage相关字段说明 字段名 字段描述 NextPartitionCursor 下一个游标 Records 消息记录(DISRecord结构) MillisBehindLatest 保留字段 表6 DISRecord相关字段说明 字段名 字段描述 PartitionKey 数据分区 Data 数据 SequenceNumber 序列号(每个记录的唯一标识) KAFKA触发器相关字段说明 表7 KAFKATriggerEvent相关字段说明 字段名 字段描述 InstanceId 实例ID Records 消息记录(表8) TriggerType 触发器类型,返回KAFKA Region region EventTime 事件发生时间,秒数 EventVersion 事件版本 表8 KAFKARecord相关字段说明 字段名 字段描述 Messages DMS消息体 TopicId DMS的主题ID SMN触发器相关字段说明 表9 SMNTriggerEvent相关字段说明 字段名 字段描述 Record 消息记录集合(SMNRecord结构) 表10 SMNRecord相关字段说明 字段名 字段描述 EventVersion 事件版本(当前为1.0) EventSubscriptionUrn 订阅URN EventSource 事件源 Smn SMN事件消息体(SMNBody结构) 表11 SMNBody相关字段说明 字段名 字段描述 TopicUrn SMN主题URN TimeStamp 消息时间戳 MessageAtrributes 消息属性集合 Message 消息体 Type 消息类型 MessageId 消息ID Subject 消息主题 定时触发器相关字段说明 表12 TimerTriggerEvent相关字段说明 字段名 字段描述 Version 版本名称(当前为“v1.0”) Time 当前时间 TriggerType 触发器类型(“Timer”) TriggerName 触发器名称 UserEvent 触发器附加信息 LTS触发器相关字段说明 表13 LTSTriggerEvent相关字段说明 字段名 字段描述 Lts LTS消息(LTSBody结构) 表14 LTSBody相关字段说明 字段名 字段描述 Data LTS原始消息 LTSBody提供GetRawData()函数返回base64解码后的消息。 CTS触发器相关字段说明 表15 CTSTriggerEvent字段说明 字段名 字段说明 CTS CTS消息体(表16) 表16 CTS结构相关字段说明 字段名 字段描述 Time 事件产生时间 User 触发该事件的用户信息(表17) Request 事件请求内容 Response 事件响应内容 Code 响应码 ServiceType 事件触发的服务名称 ResourceType 事件触发的资源类型 ResourceName 事件触发的资源名称 ResourceId 事件触发资源的唯一标识 TraceName 事件名称 TraceType 事件触发的方式(如ConsoleAction:代表前台操作) RecordTime CTS服务接收事件时间 TraceId 当前事件的唯一标识 TraceStatus 事件状态 表17 User字段说明 字段名 字段描述 Name 用户名(同一账号可以创建多个子用户) Id 用户ID Domain 账号信息(表18) 表18 Domain字段说明 字段名 字段描述 Name 账号名称 Id 账号ID 例如使用APIG触发器时,只需要把入口函数(假如函数名为handler)的第一个参数按照如下方式设置:handler(APIGTriggerEvent event, Context context)。相关约束条件请参考Base64解码和返回结构体的说明。 关于所有TriggerEvent,上面提到的TriggerEvent方法均有与之对应的set方法,建议在本地调试时使用;DIS和LTS均有对应的getRawData()方法,但无与之相应的setRawData()方法。 Context接口 Context接口提供函数获取函数执行上下文,例如,用户委托的AccessKey/SecretKey、当前请求ID、函数执行分配的内存空间、CPU数等。 Context接口说明如表19所示。 表19 Context类上下文方法说明 方法名 方法说明 getRequestID( ) 获取请求ID。 getRemainingTimeInMilligetRunningTimeInSecondsSeconds ( ) 获取函数剩余运行时间。 getAccessKey( ) 获取用户委托的AccessKey(有效期24小时),使用该方法需要给函数配置委托。 当前 函数工作流 已停止维护Runtime SDK 中getAccessKey接口,您将无法使用getAccessKey获取临时AK。 getSecretKey( ) 获取用户委托的SecretKey(有效期24小时),使用该方法需要给函数配置委托。 当前函数工作流已停止维护Runtime SDK 中getSecretKey接口,您将无法使用getSecretKey获取临时SK。 getSecurityAccessKey() 获取用户委托的SecurityAccessKey(有效期24小时),使用该方法需要给函数配置委托。 getSecuritySecretKey() 获取用户委托的SecuritySecretKey(有效期24小时),使用该方法需要给函数配置委托。 getSecurityToken() 获取用户委托的SecurityToken(有效期24小时),使用该方法需要给函数配置委托。 getUserData(string key) 通过key获取用户通过环境变量传入的值。 getFunctionName( ) 获取函数名称。 getRunningTimeInSeconds ( ) 获取函数超时时间。 getVersion( ) 获取函数的版本。 getMemorySize( ) 分配的内存。 getCPUNumber( ) 获取函数占用的CPU资源。 getPackage( ) 获取函数组。 getToken( ) 获取用户委托的token(有效期24小时),使用该方法需要给函数配置委托。 getLogger( ) 获取context提供的logger方法(默认会输出时间、请求ID等信息)。 getAlias 获取函数的别名
-
前提条件 部署 APM Agent时,必须确保接入APM的机器与APM服务网络连通,Agent才能正常工作。可使用Telnet命令测试目标机器与APM服务器网络是否连通。例如,以检查华北-北京四区域,且接入方式为“Skywalking”的连通性为例,请登录应用所部署的机器,并输入命令telnet 100.125.2.112:11800,其他区域或源代码的地址请参考探针接入地址。 GO语言支持Skywalking和OpenTelemetry。
-
环境类 Go环境配置 用户需要在环境变量中配置以下参数: GO111MODULE:用户使用在线导入的方式安装Go驱动时需要设置GO111MODULE为on。如果不希望进行Go mod工程的改造,需将GO111MODULE设置为off,并手动下载依赖包。依赖包与驱动根目录和业务代码保持同级。 GOPROXY:用户使用在线导入时需配置包含Go驱动包的路径。 用户可以根据自己场景参数配置Go其他相关环境变量。 通过go env查看Go环境变量配置结果,并且查看Go版本是否在1.13或以上。 Go驱动安装 从发布包中获取Go驱动包。包名为 GaussDB -Kernel_数据库版本号_操作系统版本号_64bit_Go.tar.gz。解压后为Go驱动源码包。 进入Go驱动代码根路径,执行go mod tidy下载相关依赖,需要在环境变量中配置GOPATH=${Go驱动依赖包存放路径}。 若依赖已下载至本地,可以在go.mod里面添加一行“通过replace将Go驱动包替换为本地Go驱动包地址”,表示代码里面所有的import Go驱动包都是使用本地路径, 同时依赖也不会从代理里下载。 通过go mod tidy下载相关依赖时可能会下载为某个依赖的低版本,如果依赖的低版本存在漏洞,可以通过更改go.mod文件中对应依赖的版本号,更新依赖到漏洞修复后的版本来规避风险。 数据库提供的Go驱动包依赖Go 1.13及以上版本。
-
参数说明 参数 参数说明 ctx 表示给定的上下文。 query 被执行的SQL语句。 args 被执行SQL语句需要绑定的参数。支持按位置绑定和按名称绑定,详情见DB类型中的示例。 stmt 已有的预处理语句,一般指prepare语句返回的预处理语句。 Query类接口Query()、QueryContext()、QueryRow()、QueryRowContext()通常用于查询语句,如SELECT语句。操作语句使用Exec()接口执行,若非查询语句通过Query类接口执行,则执行结果可能与预期不符,因此不建议使用Query类接口执行非查询语句,例如UPDATE/INSERT等。 使用Query类接口执行查询语句的结果需要通过type Rows中Next()接口获取,若不通过Next()接口获取,可能会产生不可预期的错误。
-
注意事项 定时消息的最大延迟时间为1年,延迟超过1年的消息将会发送失败。 定时消息的定时时间如果被设置成当前时间戳之前的某个时刻,消息将立刻投递给消费者。 在理想情况下,定时消息设定的时间与实际发送时间的误差在0.1s以内。但在定时消息投递压力过大时,会触发定时消息投递流控机制,精度会变差。 在0.1s的精度内,不保证消息投递的顺序性。即如果两条定时消息的定时时间差距小于0.1s,他们投递的顺序与他们发送的顺序无法确保一致。 无法确保定时消息仅投递一次,定时消息可能会重复投递。 定时消息的定时时间是服务端开始向消费端投递的时间。如果消费者当前有消息堆积,那么定时消息会排在堆积消息后面,将不能严格按照配置的时间进行投递。 由于客户端和服务端可能存在时间差,消息的实际投递时间与客户端设置的投递时间之间可能存在偏差,以服务端时间为准。 设置定时消息的投递时间后,依然受消息老化时间限制,默认消息老化时间为2天。例如,设置定时消息5天后才能被消费,如果第5天后一直没被消费,那么这条消息将在第7天被删除。 定时消息将占用普通消息约3倍的存储空间,大量使用定时消息时需要注意存储空间占用。
-
同步发送 同步发送是指消息发送方发出一条消息到服务端,服务端接收并处理消息,然后返回响应给发送方,发送方收到响应后才会发送下一条消息的通讯方式。 参考如下示例代码(以下加粗内容需要替换为实例自有信息,请根据实际情况替换)。 package mainimport ("context""fmt""github.com/apache/rocketmq-client-go/v2""github.com/apache/rocketmq-client-go/v2/primitive""github.com/apache/rocketmq-client-go/v2/producer""os")// implements a simple producer to send message.func main() {p, _ := rocketmq.NewProducer(producer.WithNsResolver(primitive.NewPassthroughResolver([]string{"192.168.0.1:8100"})),producer.WithRetry(2),)err := p.Start()if err != nil {fmt.Printf("start producer error: %s", err.Error())os.Exit(1)}msg := &primitive.Message{Topic: "topic1",Body: []byte("Hello RocketMQ Go Client!"),}msg.WithTag("TagA")msg.WithKeys([]string{"KeyA"})res, err := p.SendSync(context.Background(), msg)if err != nil {fmt.Printf("send message error: %s\n", err)} else {fmt.Printf("send message success: result=%s\n", res.String())}err = p.Shutdown()if err != nil {fmt.Printf("shutdown producer error: %s", err.Error())}} 示例代码中的参数说明如下,请参考收集连接信息获取参数值。 192.168.0.1:8100:表示实例连接地址和端口。 topic1:表示Topic名称。
-
订阅普通消息 参考如下示例代码(以下加粗内容需要替换为实例自有信息,请根据实际情况替换)。 package mainimport ("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() {c, _ := rocketmq.NewPushConsumer(consumer.WithGroupName("testGroup"),consumer.WithNsResolver(primitive.NewPassthroughResolver([]string{"192.168.0.1:8100"})),)err := c.Subscribe("test", consumer.MessageSelector{}, func(ctx context.Context,msgs ...*primitive.MessageExt) (consumer.ConsumeResult, error) {for i := range msgs {fmt.Printf("subscribe callback: %v \n", msgs[i])}return consumer.ConsumeSuccess, nil})if err != nil {fmt.Println(err.Error())}// Note: start after subscribeerr = 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())}} 示例代码中的参数说明如下,请参考收集连接信息获取参数值。 testGroup:表示消费组名称。 192.168.0.1:8100:表示实例连接地址和端口。 test:表示Topic名称。
-
准备环境 执行以下命令,检查是否已安装Go。 go version 返回如下回显时,说明Go已经安装。 go version go1.16.5 linux/amd64 如果未安装Go,请下载并安装。 进入Go脚本所在的bin目录下。 执行“touch go.mod”命令新建一个“go.mod”,并增加以下代码,添加依赖。 module rocketmq-example-gogo 1.13require (github.com/apache/rocketmq-client-go/v2 v2.1.2) 执行如下命令增加代理。 export GOPROXY=https://goproxy.cn,direct 执行如下命令下载依赖。 go mod tidy
-
异步发送 异步发送是指消息发送方发出一条消息后,不等服务端返回响应,接着发送下一条消息的通讯方式。 使用异步发送需要客户端实现异步发送回调接口(SendCallback)。即消息发送方在发送了一条消息后,不需要等待服务端响应接着发送第二条消息。发送方通过回调接口接收服务端响应,并处理响应结果。 参考如下示例代码(以下加粗内容需要替换为实例自有信息,请根据实际情况替换)。 package mainimport ("context""fmt""os""sync""github.com/apache/rocketmq-client-go/v2""github.com/apache/rocketmq-client-go/v2/primitive""github.com/apache/rocketmq-client-go/v2/producer")// implements a async producer to send message.func main() {p, _ := rocketmq.NewProducer(producer.WithNsResolver(primitive.NewPassthroughResolver([]string{"192.168.0.1:8100"})),producer.WithRetry(2))err := p.Start()if err != nil {fmt.Printf("start producer error: %s", err.Error())os.Exit(1)}var wg sync.WaitGroupwg.Add(1)callback := func(ctx context.Context, result *primitive.SendResult, e error) {if e != nil {fmt.Printf("receive message error: %s\n", err)} else {fmt.Printf("send message success: result=%s\n", result.String())}wg.Done()}message := primitive.NewMessage("test", []byte("Hello RocketMQ Go Client!"))err = p.SendAsync(context.Background(), callback, message)if err != nil {fmt.Printf("send message error: %s\n", err)wg.Done()}wg.Wait()err = p.Shutdown()if err != nil {fmt.Printf("shutdown producer error: %s", err.Error())}} 示例代码中的参数说明如下,请参考收集连接信息获取参数值。 192.168.0.1:8100:表示实例连接地址和端口。 test:表示Topic名称。
-
问题现象 当部署主机相关的应用时,出现如下日志: 以路径为例,有以下几种常见现象: 输入的路径参数有“\b”特殊字符导致部署报错,如下图所示。 图1 日志信息 输入的路径参数有“\f”特殊字符导致部署报错,如下图所示。 图2 日志信息 输入的路径参数有“\r”特殊字符导致部署报错,如下图所示。 图3 日志信息 输入的路径参数有“\t”特殊字符导致部署报错,如下图所示。 图4 日志信息 输入的路径参数有“\n”特殊字符导致部署报错,如下图所示。 图5 日志信息
-
问题现象 日志提示如下信息: "msg": "Failed to find handler for \"usr/local/python/Python-3.5.4.tgz\". Make sure the required command to extract the file is installed. Command \"/usr/bin/unzip\" could not handle archive. Command \"/usr/bin/gtar\" could not handle archive."}
-
可用的拓展请求头 创建方式 说明 WithTrafficLimitHeader(trafficLimit int64) 配置在请求中携带单链接限速头域。目前仅支持 GetObject 方法。 取值范围:819200 ~ 838860800,单位:bit/s。 表1 PayerType 常量名 原始值 说明 BucketOwnerPayer BucketOwner 表示桶拥有者支付所有费用。 RequesterPayer Requester 表示请求者支付流量和请求次数费用,桶拥有者支付存储费用。
-
代码示例 本示例用于列举所有并行文件系统列表 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233343536373839404142434445 package mainimport ( "fmt" "os" obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs")func main() { //推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。 //您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html。 ak := os.Getenv("AccessKeyID") sk := os.Getenv("SecretAccessKey") // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。 // securityToken := os.Getenv("SecurityToken") // endpoint填写Bucket对应的Endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写。 endPoint := "https://obs.cn-north-4.myhuaweicloud.com" // 创建obsClient实例 // 如果使用临时AKSK和SecurityToken访问OBS,需要在创建实例时通过obs.WithSecurityToken方法指定securityToken值。 obsClient, err := obs.New(ak, sk, endPoint/*, obs.WithSecurityToken(securityToken)*/) if err != nil { fmt.Printf("Create obsClient error, errMsg: %s", err.Error()) } input := &obs.ListBucketsInput{} // 指定桶列表中是否存在Location字段,此处以true为例,默认是false input.QueryLocation = true // 指定桶类型,此处以为obs.POSIX为例,即获取所有并行文件系统,默认不设置则获取所有桶和并行文件系统列表 input.BucketType = obs.POSIX // 列举并行文件系统列表 output, err := obsClient.ListBuckets(input) if err == nil { fmt.Printf("List buckets successful!\n") fmt.Printf("RequestId:%s\n", output.RequestId) for index, val := range output.Buckets { fmt.Printf("Bucket[%d]-Name:%s,CreationDate:%s\n", index, val.Name, val.CreationDate) } return } fmt.Printf("List buckets fail!\n") if obsError, ok := err.(obs.ObsError); ok { fmt.Println("An ObsError was found, which means your request sent to OBS was rejected with an error response.") fmt.Println(obsError.Error()) } else { fmt.Println("An Exception was found, which means the client encountered an internal problem when attempting to communicate with OBS, for example, the client was unable to access the network.") fmt.Println(err) }}
更多精彩内容
CDN加速
GaussDB
文字转换成语音
免费的服务器
如何创建网站
域名网站购买
私有云桌面
云主机哪个好
域名怎么备案
手机云电脑
SSL证书申请
云点播服务器
免费OCR是什么
电脑云桌面
域名备案怎么弄
语音转文字
文字图片识别
云桌面是什么
网址安全检测
网站建设搭建
国外CDN加速
SSL免费证书申请
短信批量发送
图片OCR识别
云数据库MySQL
个人域名购买
录音转文字
扫描图片识别文字
OCR图片识别
行驶证识别
虚拟电话号码
电话呼叫中心软件
怎么制作一个网站
Email注册网站
华为VNC
图像文字识别
企业网站制作
个人网站搭建
华为云计算
免费租用云托管
云桌面云服务器
ocr文字识别免费版
HTTPS证书申请
图片文字识别转换
国外域名注册商
使用免费虚拟主机
云电脑主机多少钱
鲲鹏云手机
短信验证码平台
OCR图片文字识别
SSL证书是什么
申请企业邮箱步骤
免费的企业用邮箱
云免流搭建教程
域名价格