云服务器内容精选

  • 问题现象 当部署主机相关的应用时,出现如下日志: 以路径为例,有以下几种常见现象: 输入的路径参数有“\b”特殊字符导致部署报错,如下图所示。 图1 日志信息 输入的路径参数有“\f”特殊字符导致部署报错,如下图所示。 图2 日志信息 输入的路径参数有“\r”特殊字符导致部署报错,如下图所示。 图3 日志信息 输入的路径参数有“\t”特殊字符导致部署报错,如下图所示。 图4 日志信息 输入的路径参数有“\n”特殊字符导致部署报错,如下图所示。 图5 日志信息
  • 处理方法 若未安装Go,可通过“安装Go语言 ”部署步骤进行安装。 正确配置相关环境变量。 由于当前启动/停止操作为“no_login”方式,若系统为Linux系统,Go语言为手动安装,还需在以下文件中增加环境变量: Ubuntu: ~/.bashrc 和 ~/.profile Centos: ~/.bashrc 和 ~/.bash_profile 所需环境变量配置示例如下: export GOROOT=/usr/local/go/go_install_dir/go export GOPATH=/usr/local/go/go_workpath export PATH= $GOROOT/bin:$PATH
  • 代码样例 本示例用于通过指定多段上传任务号(uploadId),上传段到examplebucket桶中,并且指定对象名为example/objectname。 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 package main import ( "fmt" "os" "strings" 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.UploadPartInput{} // 指定存储桶名称 input.Bucket = "examplebucket" // 指定对象名,此处以 example/objectname 为例。 input.Key = "example/objectname" // 指定多段上传任务号,此处以00000188677110424014075CC4A77xxx为例。 input.UploadId = "00000188677110424014075CC4A77xxx" // 指定上传段的段号,取值为从1到10000的整数。这次以1为例。 input.PartNumber = 1 // 指定待上传段的源文件路径,这里以localfile为例。 input.SourceFile = "localfile" // 上传段 output, err := obsClient.UploadPart(input) if err == nil { fmt.Printf("Upload part(%d) successful with bucket(%s) and object(%s)!!\n", input.PartNumber, input.Bucket, input.Key) fmt.Printf("ETag:%s\n", output.ETag) return } fmt.Printf("Upload part(%d) fail with bucket(%s) and object(%s)!!\n", input.PartNumber, input.Bucket, input.Key) 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) } }
  • 返回结果说明 表4 返回结果 参数名称 参数类型 描述 output *UploadPartOutput 参数解释: 接口返回信息。详情参见UploadPartOutput。 err error 参数解释: 接口返回错误信息。 表5 UploadPartOutput 参数名称 参数类型 描述 StatusCode int 参数解释: HTTP状态码。 取值范围: 状态码是一组从2xx(成功)到4xx或5xx(错误)的数字代码,状态码表示了请求响应的状态。完整的状态码列表请参见状态码。 默认取值: 无 RequestId string 参数解释: OBS服务端返回的请求ID。 默认取值: 无 ResponseHeaders map[string][]string 参数解释: HTTP响应头信息。 默认取值: 无 PartNumber int 参数解释: 段号。 取值范围: 取值范围是[1,10000]的非负整数。 默认取值: 无 ETag string 参数解释: 对象的base64编码的128位MD5摘要。ETag是对象内容的唯一标识,可以通过该值识别对象内容是否有变化。比如上传对象时ETag为A,下载对象时ETag为B,则说明对象内容发生了变化。ETag只反映变化的内容,而不是其元数据。上传的对象或拷贝操作创建的对象,都有唯一的ETag。 约束限制: 当对象是服务端加密的对象时,ETag值不是对象的MD5值。 取值范围: 长度为32的字符串。 默认取值: 无 SseHeader SseCHeader 或 SseKmsHeader 参数解释: 服务端加密头信息,选择SSE-C加密方式,则详见SseCHeader,选择SSE-KMS加密方式,则详见SseKmsHeader。 表6 SseCHeader 参数名称 参数类型 是否必选 描述 Encryption string 作为请求参数时必选 参数解释: 表示服务端加密是SSE-C方式。对象使用SSE-C加密方式。 取值范围: 可选值:AES256,即选择SSE-C方式加密对象。 默认取值: 无 Key string 作为请求参数时必选 参数解释: SSE-C方式下加密使用的密钥,该密钥用于加密对象。 约束限制: 该头域由256bit的密钥经过Base64编码得到,示例:K7QkYpBkM5+hca27fsNkUnNVaobncnLht/rCB2o/9Cw= 默认取值: 无 KeyMD5 string 作为请求参数时可选 参数解释: SSE-C方式下加密使用密钥的MD5值,该值用于验证密钥传输过程中是否出错。 约束限制: 由密钥值经过MD5加密再经过Base64编码后得到,示例:4XvB3tbNTN+tIEVa0/fGaQ== 默认取值: 无 表7 SseKmsHeader 参数名称 参数类型 是否必选 描述 Encryption string 作为请求参数时必选 参数解释: 表示服务端加密是SSE-KMS方式。对象使用SSE-KMS方式加密。 取值范围: 可选值:kms,即选择SSE-KMS方式加密对象。 默认取值: 无 Key string 作为请求参数时可选 参数解释: SSE-KMS加密方式下使用的KMS主密钥的ID值。 取值范围: 有效值支持两种格式: regionID:domainID(账号ID):key/key_id key_id 其中: regionID是使用密钥所属region的ID,可在地区和终端节点页面获取; domainID是使用密钥所属账号的账号ID,获取方法参见如何获取账号ID和用户ID?; key_id是从 数据加密 服务创建的密钥ID,获取方法请参见查看密钥。 默认取值: 如果用户没有提供该头域,那么默认的主密钥将会被使用。 如果默认主密钥不存在,将默认创建并使用。
  • 请求参数说明 表1 请求参数列表 参数名称 参数类型 是否必选 描述 input *UploadPartInput 必选 参数解释: 上传段请求参数。详情参见UploadPartInput。 extensions extensionOptions 可选 参数解释: 拓展配置项。通过调用拓展配置项为对应请求配置额外的拓展请求头,详情参见extensionOptions。 表2 UploadPartInput 参数名称 参数类型 是否必选 描述 Bucket string 必选 参数解释: 桶名。 约束限制: 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。 桶命名规则如下: 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。 禁止使用IP地址。 禁止以“-”或“.”开头及结尾。 禁止两个“.”相邻(如:“my..bucket”)。 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。 默认取值: 无 Key string 必选 参数解释: 对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。 例如,您对象的访问地址为examplebucket.obs.cn-north-4.myhuaweicloud.com/folder/test.txt 中,对象名为folder/test.txt。 取值范围: 长度大于0且不超过1024的字符串。 默认取值: 无 PartNumber int 必选 参数解释: 段号。 取值范围: 取值范围是[1,10000]的非负整数。 默认取值: 无 UploadId string 必选 参数解释: 分段上传任务的ID。任务ID可以通过初始化分段上传任务生成。 约束限制: 取值范围: 长度为32的字符串,例如: 000001648453845DBB78F2340DD460D8。 默认取值: 无 ContentMD5 string 可选 参数解释: 待上传对象数据的MD5值(经过Base64编码),提供给OBS服务端,校验数据完整性。 取值范围: 按照RFC 1864标准计算出消息体的MD5摘要字符串,即消息体128-bit MD5值经过base64编码后得到的字符串。 示例:n58IG6hfM7vqI4K0vnWpog==。 默认取值: 无 SseHeader SseCHeader 可选 参数解释: 服务端加密头信息,选择SSE-C加密方式,则详见SseCHeader。 Body io.Reader 可选 参数解释: 待上传对象的数据流。 取值范围: 0~48.8TB,单位:字节。 默认取值: 无 SourceFile string 可选 参数解释: 待上传对象的源文件路径。 默认取值: 无 Offset int64 可选 参数解释: 源文件中某一分段的起始偏移大小。 取值范围: 非负整数,小于待上传对象的大小,单位:字节。 默认取值: 0 PartSize int64 可选 参数解释: 当前段的长度。 约束限制: 上传段接口要求除最后一段以外,其他的段大小都要大于100KB。但是上传段接口并不会立即校验上传段的大小(因为不知道是否为最后一段),只有调用合并段接口时才会校验。 OBS 3.0的桶支持最小段的大小为100KB,OBS 2.0的桶支持最小段的大小为5MB。 取值范围: 100KB~5GB,单位:字节。 默认取值: 102400字节 表3 SseCHeader 参数名称 参数类型 是否必选 描述 Encryption string 作为请求参数时必选 参数解释: 表示服务端加密是SSE-C方式。对象使用SSE-C加密方式。 取值范围: 可选值:AES256,即选择SSE-C方式加密对象。 默认取值: 无 Key string 作为请求参数时必选 参数解释: SSE-C方式下加密使用的密钥,该密钥用于加密对象。 约束限制: 该头域由256bit的密钥经过Base64编码得到,示例:K7QkYpBkM5+hca27fsNkUnNVaobncnLht/rCB2o/9Cw= 默认取值: 无 KeyMD5 string 作为请求参数时可选 参数解释: SSE-C方式下加密使用密钥的MD5值,该值用于验证密钥传输过程中是否出错。 约束限制: 由密钥值经过MD5加密再经过Base64编码后得到,示例:4XvB3tbNTN+tIEVa0/fGaQ== 默认取值: 无
  • 功能说明 初始化分段上传任务后,通过分段上传任务的ID,上传段到指定桶中。除了最后一段以外,其他段的大小范围是100KB~5GB;最后一段的大小范围是0~5GB。上传的段的编号也有范围限制,其范围是1~10000。 上传段时,除了指定上传ID,还必须指定段编号。您可以选择1和10000之间的任意段编号。段编号在您正在上传的对象中唯一地标示了段及其位置。如果您使用之前上传的段的同一段编号上传新段,则之前上传的段将被覆盖。无论您何时上传段,OBS都将在其响应中返回ETag标头。对于每个段上传任务,您必须记录每个段编号和ETag值。您在随后的请求中需要添加这些值以完成多段上传。
  • 接口约束 您必须是桶拥有者或拥有上传段的权限,才能上传段。建议使用 IAM 或桶策略进行授权,如果使用IAM则需授予obs:object:PutObject权限,如果使用桶策略则需授予PutObject权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、配置对象策略。 OBS支持的Region与Endpoint的对应关系,详细信息请参见地区与终端节点。 初始化上传段任务并上传一个或多个段之后,您必须合并段或取消多段上传任务,才能停止收取已上传的段的存储费用。仅当在合并段或取消多段上传任务之后,OBS才释放段存储并停止向您收取段存储费用。 段任务中的partNumber是唯一的,重复上传相同partNumber的段,后一次上传会覆盖前一次上传内容。多并发上传同一对象的同一partNumber时,服务端遵循Last Write Win策略,但“Last Write”的时间定义为段元数据创建时间。为了保证数据准确性,客户端需要加锁保证同一对象的同一个段上传的并发性。同一对象的不同段并发上传不需要加锁。
  • 执行结果 执行结果由3部分组成:函数返回、执行摘要和日志。 表21 执行结果说明 参数项 执行成功 执行失败 函数返回 返回函数中定义的返回信息。 返回包含错误信息和错误类型的JSON文件。格式如下: { "errorMessage": "", "errorType":"", } errorMessage:Runtime返回的错误信息 errorType:错误类型 执行摘要 显示请求ID、配置内存、执行时长、实际使用内存和收费时长。 显示请求ID、配置内存、执行时长、实际使用内存和收费时长。 日志 打印函数日志,最多显示4KB的日志。 打印报错信息,最多显示4KB的日志。
  • 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 获取函数的别名 GetToken()、GetAccessKey()和GetSecretKey()方法返回的内容包含敏感信息,请谨慎使用,避免造成用户敏感信息的泄露。
  • 代码示例 本示例用于配置examplebucket桶的标签。 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 package main import ( "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.SetBucketTaggingInput{} // 指定存储桶名称 input.Bucket = "bucketname" // 指定桶的标签 input.Tags = []obs.Tag{ {Key: "key0", Value: "value0"}, {Key: "key1", Value: "value1"}, } // 设置桶标签 output, err := obsClient.SetBucketTagging(input) if err == nil { fmt.Printf("Set bucket(%s)'s tag configuration successful!\n", input.Bucket) fmt.Printf("RequestId:%s\n", output.RequestId) return } fmt.Printf("Set bucket(%s)'s tag configuration fail!\n", input.Bucket) 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) } }
  • 返回结果说明 表4 返回结果列表 参数名称 参数类型 描述 output *BaseModel type BaseModel struct 参数解释: 接口返回信息,详见BaseModel。 err error 参数解释: 接口返回错误信息。 表5 BaseModel 参数名称 参数类型 描述 StatusCode int 参数解释: HTTP状态码。 取值范围: 状态码是一组从2xx(成功)到4xx或5xx(错误)的数字代码,状态码表示了请求响应的状态。完整的状态码列表请参见状态码。 默认取值: 无 RequestId string 参数解释: OBS服务端返回的请求ID。 默认取值: 无 ResponseHeaders map[string][]string 参数解释: HTTP响应头信息。 默认取值: 无
  • 参数 表1 数据库连接参数 参数名称 参数说明 host 主机IP地址,也可通过环境变量${PGHOST}来指定。 port 主机服务器的端口号,也可通过环境变量${PGPORT}来指定。 dbname 数据库名,也可通过环境变量${PGDATABASE}来指定。 user 要连接的用户名,也可通过环境变量${PGUSER}来指定。 password 要连接用户对应的连接密码。 connect_timeout 用于连接服务器操作的超时值,也可通过环境变量${PGCONNECT_TIMEOUT}来指定。 sslmode 启用SSL加密的方式,也可通过环境变量${PGSSLMODE}来指定。 参数取值范围: disable:不使用ssl安全连接。 allow:如果数据库服务器要求使用,则可以使用SSL安全加密连接,但不验证数据库服务器的真实性。 prefer:如果数据库支持,那么首选使用SSL安全加密连接,但不验证数据库服务器的真实性。 require:必须使用SSL安全连接,但是只做了数据加密,而并不验证数据库服务器的真实性。 verify-ca:必须使用SSL安全连接,并验证服务器是否具有由可信任的证书机构签发的证书。 verify-full:必须使用SSL安全连接,并且验证服务器是否具有由可信任的证书机构签发的证书,以及验证服务器主机名是否与证书中的一致 sslkey 指定用于客户端证书的密钥位置,如果需要走SSL连接,并且该参数未指定,可通过设置环境变量${PGSSLKEY}来指定。 sslcert 指定客户端SSL证书的文件名,或者通过设置环境变量${PGSSLCERT}来指定。 sslrootcert 指定一个包含SSL证书机构(CA)证书的文件名称,或者通过设置环境变量${PGSSLROOTCERT}来指定。 sslcrl 指定ssl证书撤销列表(CRL)的文件名。列在这个文件中的证书如果存在,在尝试认证该服务器证书时会被拒绝,从而连接失败。也可通过环境变量${PGSSLCRL}来指定。 sslpassword 指定对秘钥解密成明文的密码短语,当指定该参数的时候表示sslkey是一个加密存储的文件,当前sslkey支持des/aes加密方式。 说明: DES加密算法安全性低,存在安全风险,建议使用更安全的加密算法。 disable_prepared_binary_result 字符串类型,若设置为yes,表示此连接在从预准备语句接收查询结果时不应使用二进制格式。该参数仅用于调试。 取值范围:yes/no。 binary_parameters 字符串类型,该参数表示是否始终以二进制形式发送[]byte。取值范围:yes/no。若该参数设置为yes,建议绑定参数按照[]byte绑定,可以减少内部类型转换。 target_session_attrs 指定数据库的连接类型,该参数用于识别主备节点,也可通过环境变量${PGTARGETSESSIONATTRS}来指定。默认值为“any”,共有六种:any、master、slave、preferSlave、read-write、read-only。 any:尝试连接URL连接串中的任何一个数据节点。 master:尝试连接到URL连接串中的主节点,如果找不到就抛出异常。 slave:尝试连接到URL连接串中的备节点,如果找不到就抛出异常。 preferSlave:尝试连接到URL连接串中的备数据节点(如果有可用的话),否则连接到主数据节点。 read-write:读写模式,表示只能连接主节点。 read-only:只读模式,表示只能连接备节点。 loggerLevel 日志级别,打印相关调试信息,也可通过环境变量${PG LOG GERLEVEL}来指定。 支持trace/debug/info/warn/error/none,级别从高到低。 application_name 设置正在使用连接的GO驱动的名称。缺省值为go-driver,该参数不建议用户配置。 RuntimeParams 要在连接上设置为会话默认值的运行时参数。例如参数名search_path,application_name,timezone等。各参数的详细介绍参见客户端连接缺省设置,可通过show语法查看参数是否设置成功。
  • 订阅普通消息 参考如下示例代码(以下加粗内容需要替换为实例自有信息,请根据实际情况替换)。 package main import ( "context" "fmt" "log" "os" "time" "github.com/apache/rocketmq-clients/golang" "github.com/apache/rocketmq-clients/golang/credentials" ) const ( Topic = "topic01" GroupName = "groupname" Endpoint = "192.168.xx.xx:8080" AccessKey = os.Getenv("ROCKETMQ_AK") //用户名和密钥直接硬编码到代码中或者明文存储都存在很大的风险,建议在配置文件或者环境变量中密文存放,使用时解密。 SecretKey = os.Getenv("ROCKETMQ_SK") ) var ( // 接收消息请求的最大等待时间 awaitDuration = time.Second * 5 // 每次能接收的最大消息数 maxMessageNum int32 = 16 // 消息不可见时间,在消息被接收后对其他消费者不可见,直到超时。 invisibleDuration = time.Second * 20 ) func main() { os.Setenv("mq.consoleAppender.enabled", "true") golang.ResetLogger() simpleConsumer, err := golang.NewSimpleConsumer(&golang.Config{ Endpoint: Endpoint, Group: GroupName, Credentials: &credentials.SessionCredentials{ AccessKey: AccessKey, AccessSecret: SecretKey, }, }, golang.WithAwaitDuration(awaitDuration), golang.WithSubscriptionExpressions(map[string]*golang.FilterExpression{ Topic: golang.SUB_ALL, }), ) if err != nil { log.Fatal(err) } err = simpleConsumer.Start() if err != nil { log.Fatal(err) } defer simpleConsumer.GracefulStop() go func() { for { fmt.Println("start recevie message") mvs, err := simpleConsumer.Receive(context.TODO(), maxMessageNum, invisibleDuration) if err != nil { fmt.Println(err) } for _, mv := range mvs { simpleConsumer.Ack(context.TODO(), mv) fmt.Println(mv) } fmt.Println("wait a moment") fmt.Println() time.Sleep(time.Second * 3) } }() time.Sleep(time.Minute) } 示例代码中的参数说明如下,请参考收集连接信息获取参数值。 Topic:输入Topic名称。 GroupName:输入消费组名称。 Endpoint:输入grpc连接地址/grpc公网连接地址。 AccessKey:创建实例时,如果开启了ACL,需要输入用户名。 SecretKey:创建实例时,如果开启了ACL,需要输入用户密钥。
  • 准备环境 执行以下命令,检查是否已安装Go。 go version 返回如下回显时,说明Go已经安装。 go version go1.16.5 linux/amd64 如果未安装Go,请下载并安装。 在“go.mod”中增加以下代码,添加依赖。 module rocketmq-example-go go 1.13 require ( github.com/apache/rocketmq-clients/golang/v5 )
  • 同步发送 同步发送是指消息发送方发出一条消息到服务端,服务端接收并处理消息,然后返回响应给发送方,发送方收到响应后才会发送下一条消息的通讯方式。 参考如下示例代码(以下加粗内容需要替换为实例自有信息,请根据实际情况替换)。 package main import ( "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名称。