负载均衡OpenAPI实践
概览
负载均衡OpenAPI接口普遍遵循RPC、RESTful风格的API接口。由于云上产品一般采用地域化部署的策略,因此OpenAPI的服务接入点(Endpoint)会因所在地域不同而有所差异。在使用OpenAPI之前,需明确负载均衡实例所属地域。
1.实名认证
租户在使用OpenAPI之前需要完成实名认证。本示例中,可以前往“百度智能云官网控制台”中的“安全认证中心”进行实名认证。没有通过实名认证的请求将会得到以下错误提示码。错误提示码,如下表所示。
| 错误码 | 错误描述 | HTTP状态码 | 中文解释 | 
|---|---|---|---|
| QualifyNotPass | The User has not pass qualify | 403 | 账号没有通过实名认证 | 
2.鉴权认证机制
在使用OpenAPI进行交互时,通过请求中携带的签名计算信息,使云厂商能准确识别该请求的合法性。在进行签名计算时,租户需要使用访问密钥,经特定算法来生成签名字符串,具体步骤可参考官网文档。访问密钥一般由访问密钥(Access Key,AK)ID与访问密钥(Secret Key,SK)组成。在账号创建后,云厂商会自动分配一对Access Key/Secret Key,租户可通过控制台管理自己的访问密钥。访问密钥管理界面,如下图所示。其中,Secret Key为服务端验证签名字符串的密钥,必须严格保管。

获取访问密钥方式如下:首先,登录控制台,点击“用户账号”→“安全认证”进入Access Key管理界面。其次,点击“Access Key”右侧的“显示”可查看其对应的Secret Key。最后,根据需要可点击“创建Access Key”创建新的Access Key/Secret Key密钥对。
获取到Access Key/Secret Key信息并计算出签名信息后,可以通过以下方式在OpenAPI请求中携带签名信息。 在HTTP请求的Header中包含Authorization信息,即在HTTP Header中加入Authorization:<认证字符串>,相关HTTP请求头信息,如下所示。
1POST /v{version}/blb HTTP/1.1
2Host: blb.bj.baidubce.com
3Content-Type: application/json
4X-Bce-Date: 2024-05-17T07:18:50Z
5Authorization: bce-auth-v1/***/2024-05-17T07:18:50Z/1800/host;x-bce-date/35ccc271f93c44f75c4b74cd7d04c32c4dd22a93xxxx1e2535f1bb3e8b1aaee4
            在HTTP请求的URL中包含Authorization信息,即在URL的QueryString中加入Authorization=<认证字符串>,相关命令代码如下所示。
1GET /v{version}/blb?blbId={blbId}&authorization=bce-auth-v1%2F***%2F20xx-xx-xxT07%3A18%3A50Z%2F1800%2Fhost%3Bx-bce-date%2F35ccc271f93c44f75c4b74cd7d04c32c4dd22a932aa21e2535f1bb3e8b1aaee4
            3.通讯协议
OpenAPI支持HTTP和HTTPS两种调用协议。有数据安全性要求的业务,需要选择HTTPS协议。为便于演示,本示例中采用HTTP调用协议。
4.数据格式
OpenAPI数据通常为JSON格式,所有request/response body内容均采用UTF-8编码。OpenAPI请求参数说明,如下表所示。
| 参数类型 | 说明 | 
|---|---|
| URI | 通常用于指明操作实体,如:POST /v{version}/instance/{instanceId} | 
| Query参数 | URL中携带的请求参数 | 
| HEADER | 通过HTTP头域传入,如:x-bce-date | 
| RequestBody | 通过JSON格式组织的请求数据体 | 
OpenAPI响应参数说明,如下表所示。
| 返回内容 | 说明 | 
|---|---|
| HTTP STATUS CODE | 如200,400,403,404等 | 
| ResponseBody | JSON格式组织的响应数据体 | 
5.问题诊断
响应失败返回信息如下。
(1)code:错误码。在遇到请求错误时,可查阅云厂商官网提供的公共错误码和接口错误码文档,查找失败原因和解决方案。
(2)message:描述错误的详细信息。
(3)requestId:请求的唯一标识。租户在联系云厂商客服或提交工单时,可以通过提交异常请求requestId获取帮助。相关代码如下所示。
1{
2    "code" : "NoSuchKey",
3    "message" : "The resource you requested does not exist",
4    "requestId" : "ae2225f7-1c2e-427a-a1ad-5413b762957d"
5}
            常见的报错原因有如下两种。
(1)参数缺失。租户需根据API文档列出的传参要求,仔细检查是否漏掉了必传参数,同时也需要检查公共参数是否有缺失。
(2)权限不足。如果租户使用子账号调用API,必须确保子账号已被授予执行特定API操作的权限。
负载均衡OpenAPI使用实践
租户可以通过直接调用或选用云厂商提供的标准SDK两种方式,使用OpenAPI接口服务。为便于理解,示例中将通过curl命令调用OpenAPI接口进行演示。下面介绍如何通过OpenAPI执行管理操作。
1.资源准备
在创建负载均衡实例前,除了确认OpenAPI的服务域名和公共参数外,还需要准备好所在地域内的VPC、子网及云服务器等资源。其中,子网与云服务器要创建在相同的VPC实例内。
2.创建应用型负载均衡实例
根据VPC实例ID与子网ID创建负载均衡实例,请求示例命令如下。
1curl --request POST 'http://blb.bj.baidubce.com/v1/appblb' \
2--header 'host: blb.bj.baidubce.com' \
3--header 'x-bce-date: 2024-08-15T11:55:14Z' \
4--header 'Authorization: authorization string' \
5--header 'x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1' \
6--data '{
7    "vpcId": "vpc-xxxxxxxx",        // 实例所在的专有网络的唯一ID
8    "subnetId": "sbn-xxxxxxxx",     // 实例所在的子网的唯一ID
9    "name": "blb-test",             // 负载均衡实例名称
10}'
            响应回复内容示例如下。
1HTTP/1.1 200 OK
2x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1
3{
4    "blbId": "lb-xxxxxxxx",        // 实例ID
5    "name": "blb-test",            // 实例名称
6    "address": "192.168.0.24"      // 实例IP
7}
            3.查询应用型负载均衡实例
根据负载均衡ID查询实例的详细信息,请求示例命令如下。
1curl --request GET 'http://blb.bj.baidubce.com/v1/appblb/lb-xxxxxxxx' \
2--header 'host: blb.bj.baidubce.com' \
3--header 'x-bce-date: 2024-08-15T11:55:14Z' \
4--header 'Authorization: authorization string' \
5--header 'x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1'
            响应回复内容示例如下。
1HTTP/1.1 200 OK
2x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1
3{
4    "blbId": "lb-xxxxxxxx",                  // 实例ID
5    "status": "available",                   // 实例状态
6    "name": "blb-test",                      // 实例名称
7    "desc": "",                              // 实例描述信息
8    "address": "192.168.0.24",               // 实例IP  
9    "cidr": "192.168.0.0/16",                // VPC网段
10    "vpcName": "test",                       // VPC名称
11    "subnetName": "系统预定义子网",            // Subnet名称
12    "subnetCider": "192.168.0.0/20",         // Subnet网段
13    "createTime": "2024-03-07T02:35:31Z",    // 创建时间
14    "listener": []                           // 监听详细信息
15}
            4.更新应用型负载均衡实例
根据负载均衡ID更新实例信息,请求示例命令如下。
1curl --request PUT 'http://blb.bj.baidubce.com/v1/appblb/lb-xxxxxxxx' \
2--header 'host: blb.bj.baidubce.com' \
3--header 'x-bce-date: 2024-08-15T11:55:14Z' \
4--header 'Authorization: authorization string' \
5--header 'x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1' \
6--data '{
7    "name": "blb-for-test",
8    "desc": "测试"
9}'
            响应回复内容示例如下。
1HTTP/1.1 200 OK
2x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1
            5.创建监听
为负载均衡实例创建监听时,可配置监听端口和调度算法等信息,请求示例命令如下。
1curl --request POST 'http://blb.bj.baidubce.com/v1/appblb/lb-xxxxxxxx/TCPlistener' \
2--header 'host: blb.bj.baidubce.com' \
3--header 'x-bce-date: 2024-08-15T11:55:14Z' \
4--header 'Authorization: authorization string' \
5--header 'x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1' \
6--data '{
7    "listenerPort": 80,              // 端口,通过访问该端口将流量转发到后端服务器端口
8    "scheduler": "LeastConnection",  // 转发规则,如:加权轮询(RoundRobin)等
9}'
            响应回复内容示例如下。
1HTTP/1.1 200 OK
2x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1
            6.查询监听
根据负载均衡ID查询实例下的监听的详细信息,请求示例命令如下。
1curl --request GET 'http://blb.bj.baidubce.com/v1/appblb/lb-xxxxxxxx/TCPlistener' \
2--header 'host: blb.bj.baidubce.com' \
3--header 'x-bce-date: 2024-08-15T11:55:14Z' \
4--header 'Authorization: authorization string' \
5--header 'x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1'
            响应回复内容示例如下。
1HTTP/1.1 200 OK
2x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1
3{
4    "listenerList": [
5        {
6            "listenerPort": 80,
7            "scheduler": "LeastConnection",
8        }
9    ]
10}
            7.更新监听
根据负载均衡ID和监听端口更新监听的配置信息,请求示例命令如下。
1curl --request PUT 'http://blb.bj.baidubce.com/v1/appblb/lb-xxxxxxxx/TCPlistener?listenerPort=80' \
2--header 'host: blb.bj.baidubce.com' \
3--header 'x-bce-date: 2024-08-15T11:55:14Z' \
4--header 'Authorization: authorization string' \
5--header 'x-bce-request-id: 946002ee-cb4f-4aad-b686-5be55df27f09' \
6--data '{
7    "scheduler":"RoundRobin"
8}'
            响应回复内容示例如下。
1HTTP/1.1 200 OK
2x-bce-request-id: 946002ee-cb4f-4aad-b686-5be55df27f09
            8.创建服务器组
根据负载均衡ID创建后端服务器组,创建时可以指定后端云服务器ID与权重信息,请求示例命令如下。
1curl --request POST 'http://blb.bj.baidubce.com/v1/appblb/lb-xxxxxxxx/appservergroup' \
2--header 'host: blb.bj.baidubce.com' \
3--header 'x-bce-date: 2024-08-15T11:55:14Z' \
4--header 'Authorization: authorization string' \
5--header 'x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1' \
6--data '{
7    "name": "sg_test",                    // 服务器组名称
8    "desc": "sg_test",                    // 服务器组描述           
9    "backendServerList":[                 // 后端云服务器列表       
10        { 
11            "instanceId": "i-xxxxxxxx",   // 云服务器ID       
12            "weight": 20                  // 云服务器权重
13        }
14    ]
15}'
            响应回复内容示例如下。
1HTTP/1.1 200 OK
2x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1
3
4{
5    "id": "sg-xxxxxxxx",     // 服务器组ID
6    "name": "sg_test",       // 服务器组名称
7    "desc": "sg_test",       // 服务器组描述
8    "status": "available"    // 服务器组状态               
9}
            9.查询服务器组
根据负载均衡实例ID查询实例下所有的服务器组信息,请求示例命令如下。
1curl --request GET 'http://blb.bj.baidubce.com/v1/appblb/lb-xxxxxxxx/appservergroup' \
2--header 'host: blb.bj.baidubce.com' \
3--header 'x-bce-date: 2024-08-15T11:55:14Z' \
4--header 'Authorization: authorization string' \
5--header 'x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1'
            响应回复内容示例如下。
1HTTP/1.1 200 OK
2x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1
3{
4    "appServerGroupList":[
5        {
6            "id": "sg-xxxxxxxx",      // 服务器组ID
7            "name": "sg_test",        // 服务器组名称
8            "desc": "sg_test",        // 服务器组描述
9            "status": "available",    // 服务器组状态
10            "portList": []            // 服务端口详细信息
11        }
12    ]    
13}
            10.更新服务器组
根据负载均衡实例ID和服务器组ID更新服务器组信息,请求示例命令如下。
1curl --request PUT 'http://blb.bj.baidubce.com/v1/appblb/lb-xxxxxxxx/appservergroup' \
2--header 'host: blb.bj.baidubce.com' \
3--header 'x-bce-date: 2024-08-15T11:55:14Z' \
4--header 'Authorization: authorization string' \
5--header 'x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1' \
6--data '{
7    "sgId": "sg-xxxxxxxx",  // 服务器组ID
8    "name": "sg_test_1",    // 服务器组名称
9    "desc": "sg_test_1"     // 服务器组描述
10}'
            响应回复内容示例如下。
1HTTP/1.1 200 OK
2x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1
            11.创建服务器组端口
根据负载均衡实例ID与健康检查配置信息,创建服务器组端口,请求示例命令如下。
1curl --request POST 'http://blb.bj.baidubce.com/v1/appblb/lb-xxxxxxxx/appservergroupport' \
2--header 'host: blb.bj.baidubce.com' \
3--header 'x-bce-date: 2024-08-15T11:55:14Z' \
4--header 'Authorization: authorization string' \
5--header 'x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1' \
6--data '{
7    "sgId": "sg-xxxxxxxx",               // 服务器组ID
8    "type": "TCP",                       // 服务器组端口协议
9    "port": 80,                          // 服务器组端口
10    "healthCheck": "TCP",                // 健康检查协议
11    "healthCheckPort": "TCP",            // 健康检查端口        
12    "healthCheckTimeoutInSecond": 2,     // 健康检查超时时间   
13    "healthCheckIntervalInSecond": 3     // 健康检查重试间隔                  
14    "healthCheckDownRetry": 3,           // 不健康阈值                   
15    "healthCheckUpRetry": 3              // 健康阈值                   
16}'
            响应回复内容示例如下。
1HTTP/1.1 200 OK
2x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1
3{
4    "id": "sg_port-xxxxxxxx",    // 服务器组端口ID
5    "status": "available"        // 服务器组端口状态              
6}
            12.更新服务器组端口
通过负载均衡实例ID、服务器组ID以及服务器组端口ID,更新服务器组端口信息,请求示例命令如下。
1curl --request PUT 'http://blb.bj.baidubce.com/v1/appblb/lb-xxxxxxxx/appservergroupport' \
2--header 'host: blb.bj.baidubce.com' \
3--header 'x-bce-date: 2024-08-15T11:55:14Z' \
4--header 'Authorization: authorization string' \
5--header 'x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1' \
6--data '{
7    "sgId": "sg-xxxxxxxx",                // 服务器ID
8    "portId": "sg_port-xxxxxxxx",         // 服务器组端口ID
9    "healthCheck": "TCP",                 // 健康检查协议
10    "healthCheckTimeoutInSecond": 2,      // 健康检查超时时间   
11    "healthCheckDownRetry": 3,            // 不健康阈值
12    "healthCheckUpRetry": 3,              // 健康阈值
13    "healthCheckIntervalInSecond": 1      // 健康检查重试间隔  
14}'
            响应回复内容示例如下。
1HTTP/1.1 200 OK
2x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1
            13.创建策略(监听绑定服务器组)
通过负载均衡实例ID、服务器组ID以及服务器组端口ID,实现负载均衡前端端口和后端服务器组绑定,请求示例命令如下。
1curl --request POST 'http://blb.bj.baidubce.com/v1/appblb/lb-xxxxxxxx/policys' \
2--header 'host: blb.bj.baidubce.com' \
3--header 'x-bce-date: 2024-08-15T11:55:14Z' \
4--header 'Authorization: authorization string' \
5--header 'x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1' \
6--data '{ 
7    "listenerPort": 80,                         // 负载均衡监听端口 
8    "type": "TCP",                              // 负载均衡监听协议
9    "appPolicyVos": [ 
10        {
11            "appServerGroupId": "sg-xxxxxxxx",   // 后端服务器组ID
12            "backendPort": 80,                   // 后端服务器组端口
13            "priority": 100,                     // 策略优先级
14            "ruleList": [                        // 策略规则列表
15                {
16                    "key": "*",
17                    "value": "*"
18                }
19            ]
20        }
21    ]
22}'
            响应回复内容示例如下。
1HTTP/1.1 200 OK
2x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1
            14.查询策略
根据负载均衡实例ID及监听信息查询转发策略,请求示例命令如下。
1curl --request GET 'http://blb.bj.baidubce.com/v1/appblb/lb-xxxxxxxx/policys?port=80&type=TCP' \
2--header 'host: blb.bj.baidubce.com' \
3--header 'x-bce-date: 2024-08-15T11:55:14Z' \
4--header 'Authorization: authorization string' \
5--header 'x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1'
            响应回复内容示例如下。
1HTTP/1.1 200 OK
2x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1
3
4{ 
5    "policyList":[
6        {
7            "id": "policy-xxxxxxxx",             // 策略ID
8            "appServerGroupId": "sg-xxxxxxxx",   // 服务器组ID
9            "appServerGroupName": "sg_test",     // 服务器组名称
10            "frontendPort": 80,                  // 监听端口
11            "type": "TCP",                       // 监听协议
12            "backendPort": 80,                   // 后端服务器组端口
13            "portType": "TCP",                   // 后端服务器组协议
14            "priority": 100,                     // 策略优先级
15            "desc": "",                          // 备注信息
16            "groupType": "Server",               // 关联服务器组类型
17            "ruleList": [                        // 策略规则列表
18                {
19                    "key": "*",
20                    "value": "*"
21                } 
22            ]
23        }
24    ] 
25}
            15.删除策略
根据负载均衡实例ID及转发策略ID,删除转发策略,请求示例命令如下。
1curl --request PUT 'http://blb.bj.baidubce.com/v1/appblb/lb-xxxxxxxx/policys?batchdelete' \
2--header 'host: blb.bj.baidubce.com' \
3--header 'x-bce-date: 2024-08-15T11:55:14Z' \
4--header 'Authorization: authorization string' \
5--header 'x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1' \
6--data '{
7    "port": 80,                            // 监听端口
8    "policyIdList": ["policy-xxxxxxx"]     // 策略ID
9}'
            响应回复内容示例如下。
1HTTP/1.1 200 OK
2x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1
            16.删除服务器组端口
根据负载均衡实例ID及服务器组端口ID,删除服务器组端口,请求示例命令如下。
1curl --request PUT 'http://blb.bj.baidubce.com/v1/appblb/lb-xxxxxxxx/appservergroupport?batchdelete' \
2--header 'host: blb.bj.baidubce.com' \
3--header 'x-bce-date: 2024-08-15T11:55:14Z' \
4--header 'Authorization: authorization string' \
5--header 'x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1' \
6--data '{
7    "sgId": "sg-xxxxxxxx",             // 服务器组ID
8    "portIdList": ["sg_port-xxxxxxxx"] // 服务器组端口ID
9}'
            响应回复内容示例如下。
1HTTP/1.1 200 OK
2x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1
            17.删除服务器组
根据负载均衡实例ID及服务器组ID,删除服务器组,请求示例命令如下。
1curl --request PUT 'http://blb.bj.baidubce.com/v1/appblb/lb-xxxxxxxx/appservergroup?delete' \
2--header 'host: blb.bj.baidubce.com' \
3--header 'x-bce-date: 2024-08-15T11:55:14Z' \
4--header 'Authorization: authorization string' \
5--header 'x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1' \
6--data '{
7    "sgId": "sg-xxxxxxxx"  // 服务器组ID
8}'
            响应回复内容示例如下。
1HTTP/1.1 200 OK
2x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1
            18.删除监听
根据负载均衡实例ID及监听信息,删除监听,请求示例命令如下。
1curl --request PUT 'http://blb.bj.baidubce.com/v1/appblb/lb-xxxxxxxx/listener?batchdelete' \
2--header 'host: blb.bj.baidubce.com' \
3--header 'x-bce-date: 2024-08-15T11:55:14Z' \
4--header 'Authorization: authorization string' \
5--header 'x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1' \
6--data '{
7    "portTypeList":[
8        {
9            "port": 80,    // 监听端口
10            "type": "TCP"  // 监听协议
11        } 
12    ]
13}'
            响应回复内容示例如下。
1HTTP/1.1 200 OK
2x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1
            19.释放应用型负载均衡实例
根据负载均衡实例ID,删除负载均衡实例,请求示例命令如下。
1curl --request DELETE 'http://blb.bj.baidubce.com/v1/appblb/lb-xxxxxxxx' \
2--header 'host: blb.bj.baidubce.com' \
3--header 'x-bce-date: 2024-08-15T11:55:14Z' \
4--header 'Authorization: authorization string' \
5--header 'x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1'
            响应回复内容示例如下。
1HTTP/1.1 200 OK
2x-bce-request-id: 34d63db4-721b-3127-607c-b51734437fb1
            