需求背景
比如一个后端 Java 服务要部署到 SLB 虚拟服务器组里的 2 台服务器。
SLB 虚拟服务器组里的 2 台服务器
每台服务器进行部署时,需要保证没有请求会转发到该服务器,否则用户可能会在请求时报错。
所以需要有一个 下线 的操作,把当前服务器的权重设置为 0,这样该服务器就不会再接受新请求。然后再把服务部署到该台服务器。
在部署完成之后,需要有一个 上线 的操作,把服务器的权重设置为原来的值,比如 100,这样该服务器就可以接受新请求。
备注:
在微服务场景下,服务下线一般会涉及两部分:
- 注册中心(Nacos、Eureka、Zookeeper 等)下线(服务停止时自动从注册中心下线;通过调用注册中心下线接口下线服务。)
- 负载均衡(阿里云 SLB、LVS、Nginx等)下线(设置虚拟服务器组的后端服务器权重为0;移除虚拟服务器组的后端服务器。)
需求实现
SLB 虚拟服务器组
的接口参考:https://help.aliyun.com/document_detail/35217.html 。
需要注意的是 SLB 默认服务器组
的接口与虚拟服务器组
的接口不一样,参考:https://help.aliyun.com/document_detail/27634.html 。
这里实现的是通过 Python 设置 SLB 虚拟服务器组
中的服务器权重。
安装 Pyhon 依赖环境
# python -V
Python 2.7.5
# pip install aliyun-python-sdk-core
# pip install aliyun-python-sdk-slb
Python 代码实现示例
# cat set_backend_servers_weight.py
#!/usr/bin/env python
# coding=utf-8
from aliyunsdkcore.client import AcsClient
from aliyunsdkslb.request.v20140515.SetVServerGroupAttributeRequest import SetVServerGroupAttributeRequest
import argparse
class SetLoadBalancerAttribute(object):
def __init__(self, access_key_id, access_key_secret, region_id):
self.access_key_id = access_key_id
self.access_key_secret = access_key_secret
self.region_id = region_id
def set_vserver_group_attribute(self, vserver_group_id, vserver_group_name, server_id, weight, port):
client = AcsClient(self.access_key_id, self.access_key_secret, self.region_id)
request_args = [{"ServerId": server_id, "Weight": int(weight), "Type": "ecs", "Port": int(port)}]
request = SetVServerGroupAttributeRequest()
request.set_accept_format('json')
request.set_VServerGroupId(vserver_group_id)
if vserver_group_name:
request.set_VServerGroupName(vserver_group_name)
request.set_BackendServers(request_args)
response = client.do_action_with_exception(request)
return response
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--vserver_group_id', help='必选,后端服务器组ID,不可更改。', required=True)
parser.add_argument('--vserver_group_name', help='可选,虚拟服务器组名称,可自定义更改。', default='', required=False)
parser.add_argument('--server_id', help='String类型,必选,后端服务器的实例ID,不可更改。', required=True)
parser.add_argument('--weight', help='Integer类型,必选,后端服务器的权重,取值范围:0~100,可自定义更改。', required=True)
parser.add_argument('--port', help='Integer类型,必选,后端服务器使用的端口,取值范围:1~65535,可自定义更改。', required=True)
args = parser.parse_args()
# !!!运行脚本前先修改一下这 3 个参数: access_key_id、access_key_secret、region_id
slb_api = SetLoadBalancerAttribute("access_key_id", "access_key_secret", "region_id")
# argparse 默认的变量名是 -- 或 - 后面的字符串,比如 '--weight' 就可以通过 args.weight 来获取参数的值。
# 但是也可以通过 dest=xxx 来设置参数的变量名,然后在代码中用 args.xxx 来获取参数的值。
res = slb_api.set_vserver_group_attribute(args.vserver_group_id, args.vserver_group_name, args.server_id,
args.weight, args.port)
print res
使用方式
查看帮助信息。
# python set_backend_servers_weight.py -h
usage: set_backend_servers_weight.py [-h] --vserver_group_id VSERVER_GROUP_ID
[--vserver_group_name VSERVER_GROUP_NAME]
--server_id SERVER_ID --weight WEIGHT
--port PORT
optional arguments:
-h, --help show this help message and exit
--vserver_group_id VSERVER_GROUP_ID
必选,后端服务器组ID,不可更改。
--vserver_group_name VSERVER_GROUP_NAME
可选,虚拟服务器组名称,可自定义更改。
--server_id SERVER_ID
String类型,必选,后端服务器的实例ID,
可更改。
--weight WEIGHT Integer类型,必选,后端服务器的权重,
值范围:0~100,可自定义更改。
--port PORT Integer类型,必选,后端服务器使用的端
口,取值范围:1~65535,可自定义更改。
设置虚拟服务器组中的其中一台服务器权重为 0 。
# python set_backend_servers_weight.py --vserver_group_id rsp-wz9wu0b9ixxxx --server_id i-wz91qkxlna0564b7xxxx --weight 0 --port 25074
{"VServerGroupId":"rsp-wz9wu0b9ixxxx","RequestId":"CA751AFF-A692-4EBE-9344-FC24E42182AC","VServerGroupName":"xx-xxxxx-service_25074","BackendServers":{"BackendServer":[{"Type":"ecs","ServerId":"i-wz91qkxlna0564b7xxxx","Port":25074,"Weight":0},{"Type":"ecs","ServerId":"i-wz9chqvj8ehsw2hcxxxx","Port":25074,"Weight":100}]}}
设置虚拟服务器组中的其中一台服务器权重为 0 。
设置虚拟服务器组的其中一台服务器权重为 100 。
# python set_backend_servers_weight.py --vserver_group_id rsp-wz9wu0b9ixxxx --server_id i-wz91qkxlna0564b7xxxx --weight 100 --port 25074
{"VServerGroupId":"rsp-wz9wu0b9ixxxx","RequestId":"24300A75-A3AF-458D-8ECB-9564B7BD010E","VServerGroupName":"xx-xxxxx-service_25074","BackendServers":{"BackendServer":[{"Type":"ecs","ServerId":"i-wz91qkxlna0564b7xxxx","Port":25074,"Weight":100},{"Type":"ecs","ServerId":"i-wz9chqvj8ehsw2hxxxx","Port":25074,"Weight":100}]}}
设置虚拟服务器组的其中一台服务器权重为 100 。
网友评论