负载均衡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