AutoScaling 支持虚拟服务器组功能
AutoScaling 伸缩组可以通过配置负载均衡实例,在伸缩组扩容时,自动将扩容出来的 ECS 实例添加到负载均衡默认服务器组中,在伸缩组缩容时,自动将待移除的 ECS 实例从负载均衡默认服务器组中移除。
现在,AutoScaling 伸缩组支持配置虚拟服务器组,在伸缩组扩容时,自动将扩容出来的 ECS 实例添加到对应的负载均衡实例虚拟服务器组中,在伸缩组缩容时,自动将待移除的 ECS 实例从对应的负载均衡实例虚拟服务器组中移除。通过使用弹性伸缩组新上线的虚拟服务器组特性,您可以对伸缩组内 ECS 实例的请求转发实现更加精细化的管理。您还可以通过 AttachVServerGroups 和 DetachVServerGroups 接口,随时增加或者减少伸缩组内的虚拟服务器组。
本文将为您介绍如何通过 JAVA SDK 的方式创建带有虚拟服务器组的伸缩组,以及如何使用 AttachVServerGroups 和 DetachVServerGroups 接口来管理伸缩组内的虚拟服务器组。
负载均衡(SLB)虚拟服务器组
虚拟服务器组 (VServer group)是一组 ECS 实例的集合。虚拟服务器组允许您在监听维度上个性化定义服务器组,即负载均衡实例下的不同监听可使用不同的虚拟服务器组,可以满足域名和 URL 转发的个性化需求。
如果您没有创建虚拟服务器组,负载均衡实例会将请求按照您设置的权重和监听规则转发给所有添加到默认服务器组的后端服务器 (ECS 实例);如果您创建了虚拟服务器组,负载均衡实例会将请求按照您设置的监听规则转发给关联的虚拟服务器组,负载均衡实例对应的默认服务器组添加的后端服务器(ECS 实例)不再接收请求。
使用限制
- 虚拟服务器组只能添加监听所在地域的后端服务器。
- 一个后端服务器可以属于多个虚拟服务器组。
- 一个实例可以通过不同的端口号在同一个虚拟服务器组绑定多次。
- 弹性伸缩服务伸缩组中的虚拟服务器组的唯一性由负载均衡ID+虚拟服务器组ID+端口号确定。
关于虚拟服务器组的更多信息,您可以通过 管理虚拟服务器组 进行了解。
创建带有虚拟服务器组的伸缩组
本章将向您介绍如何使用 JAVA SDK 和 ESS控制台 来创建带有虚拟服务器组的伸缩组。
通过 ESS 控制台
首先登陆 ESS控制台 ,点击创建伸缩组按钮,弹出如下伸缩组创建界面:
选择负载均衡实例,控制台会自动为您配置当前负载均衡实例的默认服务器组,通过点击虚拟服务器组按钮,可以将负载均衡下的虚拟服务器组配置到当前伸缩组,配置虚拟服务器组时需要填写端口号(即弹性伸缩创建出来的ECS实例添加到虚拟服务器组使用的端口号)、权重(即弹性伸缩创建出来的ECS实例添加到虚拟服务器组使用的权重)信息,配置好以后点击确定即可。
伸缩组创建好以后,可以查看当前伸缩组对应的虚拟服务器组信息,如下图所示:
至此,配置有虚拟服务器组的伸缩组创建好了。
通过 JAVA SDK
导入 ESS Java SDK
首先,您需要下载 aliyun-java-sdk-core、aliyun-java-sdk-ess 两个依赖,您可以查看 maven-central 界面,搜索并下载相应的 jar 包,aliyun-java-sdk-ess 对应的 jar 包的版本号需要是 2.2.8 及以上版本才能使用虚拟服务器组特性,aliyun-java-sdk-core 推荐使用最新的版本。
您可以选择使用 maven 来管理您 Java 项目的依赖库,在您的项目对应的 pom.xml 文件中加入下面的依赖项即可:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-ess</artifactId>
<version>2.2.8</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.5.0</version>
</dependency>
使用 JAVA SDK 创建带有虚拟服务器组的伸缩组
导入 ESS Java SDK 到您的 Java 工程以后,您就可以创建带有虚拟服务器组的伸缩组了,代码如下:
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.ess.model.v20140828.CreateScalingGroupRequest;
import com.aliyuncs.ess.model.v20140828.CreateScalingGroupResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import java.util.ArrayList;
import java.util.List;
public class EssSdkDemo {
public static final String REGION_ID = "cn-hangzhou";
public static final String AK = "xxxxxxxxxxxxxx";
public static final String AKS = "xxxxxxxxxxxxxx";
public static void main(String[] args) throws Exception {
IClientProfile clientProfile = DefaultProfile.getProfile(REGION_ID, AK, AKS);
IAcsClient client = new DefaultAcsClient(clientProfile);
createScalingGroupWithVServerGroup(client);
}
public static void createScalingGroupWithVServerGroup(IAcsClient client) throws Exception {
CreateScalingGroupRequest request = new CreateScalingGroupRequest();
request.setScalingGroupName("测试虚拟服务器组");
request.setMinSize(0);
request.setMaxSize(100);
//伸缩组配置的交换机列表,推荐配置不同可用区下的交换机,提高伸缩组扩容成功率
List<String> vSwitchIds = new ArrayList<String>();
vSwitchIds.add("vsw-aaaaaaa");
vSwitchIds.add("vsw-bbbbbbb");
request.setVSwitchIds(vSwitchIds);
//虚拟服务器组参数列表
List<CreateScalingGroupRequest.VServerGroup> vServerGroups = new ArrayList<CreateScalingGroupRequest.VServerGroup>();
//负载均衡实例 lb-aaaaaaaa 对应的虚拟服务器组列表
CreateScalingGroupRequest.VServerGroup vServerGroupA = new CreateScalingGroupRequest.VServerGroup();
vServerGroupA.setLoadBalancerId("lb-aaaaaaaa");
//虚拟服务器组属性列表参数
List<CreateScalingGroupRequest.VServerGroup.VServerGroupAttribute> vServerGroupAttributesA = new ArrayList<CreateScalingGroupRequest.VServerGroup.VServerGroupAttribute>();
//添加虚拟服务器组rsp-aaaaa,指定实例添加到虚拟服务器组的端口号为20,权重不设置,选择默认值50
CreateScalingGroupRequest.VServerGroup.VServerGroupAttribute vServerGroupAttribute1 = new CreateScalingGroupRequest.VServerGroup.VServerGroupAttribute();
vServerGroupAttribute1.setVServerGroupId("rsp-aaaaa");
vServerGroupAttribute1.setPort(20);
vServerGroupAttributesA.add(vServerGroupAttribute1);
//添加虚拟服务器组rsp-bbbbb,指定实例添加到虚拟服务器组的端口号为30,权重设置为100
CreateScalingGroupRequest.VServerGroup.VServerGroupAttribute vServerGroupAttribute2 = new CreateScalingGroupRequest.VServerGroup.VServerGroupAttribute();
vServerGroupAttribute2.setVServerGroupId("rsp-bbbbb");
vServerGroupAttribute2.setPort(30);
vServerGroupAttribute2.setWeight(100);
vServerGroupAttributesA.add(vServerGroupAttribute2);
//设置虚拟服务器组属性列表
vServerGroupA.setVServerGroupAttributes(vServerGroupAttributesA);
vServerGroups.add(vServerGroupA);
//负载均衡实例 lb-bbbbbbbb 对应的虚拟服务器组列表
CreateScalingGroupRequest.VServerGroup vServerGroupB = new CreateScalingGroupRequest.VServerGroup();
vServerGroupB.setLoadBalancerId("lb-bbbbbbbb");
//虚拟服务器组属性列表参数
List<CreateScalingGroupRequest.VServerGroup.VServerGroupAttribute> vServerGroupAttributesB = new ArrayList<CreateScalingGroupRequest.VServerGroup.VServerGroupAttribute>();
//添加虚拟服务器组rsp-cccccc,指定实例添加到虚拟服务器组的端口号为40,权重不设置,选择默认值50
CreateScalingGroupRequest.VServerGroup.VServerGroupAttribute vServerGroupAttribute3 = new CreateScalingGroupRequest.VServerGroup.VServerGroupAttribute();
vServerGroupAttribute3.setVServerGroupId("rsp-cccccc");
vServerGroupAttribute3.setPort(40);
vServerGroupAttributesB.add(vServerGroupAttribute3);
//添加虚拟服务器组rsp-dddddd,指定实例添加到虚拟服务器组的端口号为50,权重不设置,选择默认值50
CreateScalingGroupRequest.VServerGroup.VServerGroupAttribute vServerGroupAttribute4 = new CreateScalingGroupRequest.VServerGroup.VServerGroupAttribute();
vServerGroupAttribute4.setVServerGroupId("rsp-dddddd");
vServerGroupAttribute4.setPort(50);
vServerGroupAttributesB.add(vServerGroupAttribute4);
//设置虚拟服务器组属性列表
vServerGroupB.setVServerGroupAttributes(vServerGroupAttributesB);
vServerGroups.add(vServerGroupB);
request.setVServerGroups(vServerGroups);
CreateScalingGroupResponse response = client.getAcsResponse(request);
System.out.println(response.getScalingGroupId());
}
}
使用上述代码,可以创建配置了四个虚拟服务器组的伸缩组。伸缩组配置的虚拟服务器组信息如下:
-
负载均衡实例 lb-aaaaaaaa 下的虚拟服务器组
- 虚拟服务器组 rsp-aaaaa,使用的端口号为 20,权重为 50
- 虚拟服务器组 rsp-bbbbb,使用的端口号为 30,权重为 100
-
负载均衡实例 lb-bbbbbbbb 下的虚拟服务器组
- 虚拟服务器组 rsp-cccccc,使用的端口号为 40,权重为 50
- 虚拟服务器组 rsp-dddddd,使用的端口号为 50,权重为 50
当伸缩组发生扩容伸缩活动时,扩容创建出来的 ECS 实例自动添加到上述四个虚拟服务器组中,并按照伸缩组中对应的虚拟服务器组设置的端口号和权重添加 ECS 实例;当伸缩组发生缩容伸缩活动时(移出伸缩组并释放),待移出伸缩组并释放的 ECS 实例会自动从上述四个虚拟服务器组中移除。
注意:
- 上述代码中,AK、AKS、虚拟服务器组ID、负载均衡ID等参数需要您根据实际情况进行设置。
- 每个伸缩组目前支持配置 5 个虚拟服务器组(负载均衡实例ID+虚拟服务器组ID+端口号相同视为一个虚拟服务器组),如果同一个虚拟服务器组设置了不同的端口号配置到伸缩组中,则视为添加了多个虚拟服务器组
- 如果参数中同一个虚拟服务器相同的端口号设置了多次,则只取参数中最先设置的,接口会自动进行去重处理,不报错
伸缩组添加虚拟服务器组
如果伸缩组创建完成以后,您想添加虚拟服务器组到伸缩组中,可以通过使用 AttachVServerGroups 接口 或者 登陆 ESS控制台 通过修改伸缩组来实现。
通过 ESS 控制台向伸缩组添加虚拟服务器组
登录 ESS控制台,找到对应的伸缩组,点击修改伸缩组,弹出如下伸缩组修改对话框:
修改虚拟服务器组,点击确定即可。
通过 AttachVServerGroups 接口向伸缩组添加虚拟服务器组
通过 AttachVServerGroups 接口向伸缩组添加虚拟服务器组,对应的 JAVA 代码如下:
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.ess.model.v20140828.AttachVServerGroupsRequest;
import com.aliyuncs.ess.model.v20140828.AttachVServerGroupsResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import java.util.ArrayList;
import java.util.List;
public class EssSdkDemo {
public static final String REGION_ID = "cn-hangzhou";
public static final String AK = "xxxxxxxxxxxxxx";
public static final String AKS = "xxxxxxxxxxxxxx";
public static void main(String[] args) throws Exception {
IClientProfile clientProfile = DefaultProfile.getProfile(REGION_ID, AK, AKS);
IAcsClient client = new DefaultAcsClient(clientProfile);
attachVServerGroups(client);
}
public static void attachVServerGroups(IAcsClient client) throws Exception {
AttachVServerGroupsRequest request = new AttachVServerGroupsRequest();
request.setScalingGroupId("asg-xxxxxxxx");
request.setRegionId(REGION_ID);
//待添加的虚拟服务器组列表
List<AttachVServerGroupsRequest.VServerGroup> vServerGroups = new ArrayList<AttachVServerGroupsRequest.VServerGroup>();
//负载均衡实例 lb-aaaaaa 对应的虚拟服务器组列表
AttachVServerGroupsRequest.VServerGroup vServerGroup = new AttachVServerGroupsRequest.VServerGroup();
vServerGroup.setLoadBalancerId("lb-aaaaaa");
List<AttachVServerGroupsRequest.VServerGroup.VServerGroupAttribute> vServerGroupAttributes = new ArrayList<AttachVServerGroupsRequest.VServerGroup.VServerGroupAttribute>();
AttachVServerGroupsRequest.VServerGroup.VServerGroupAttribute vServerGroupAttribute = new AttachVServerGroupsRequest.VServerGroup.VServerGroupAttribute();
vServerGroupAttribute.setVServerGroupId("rsp-aaaaaaa");
vServerGroupAttribute.setWeight(60);
vServerGroupAttribute.setPort(100);
vServerGroupAttributes.add(vServerGroupAttribute);
vServerGroup.setVServerGroupAttributes(vServerGroupAttributes);
vServerGroups.add(vServerGroup);
request.setVServerGroups(vServerGroups);
//true 表示将伸缩组内的ECS实例添加到虚拟服务器组中,false 表示不添加
request.setForceAttach(false);
AttachVServerGroupsResponse response = client.getAcsResponse(request);
System.out.println(response.getRequestId());
}
}
使用上述代码,可以实现向伸缩组 asg-xxxxxxxx 内添加虚拟服务器组 rsp-aaaaaaa,虚拟服务器组使用的端口号为 60,权重为 100,虚拟服务器组所属的负载均衡实例为 lb-aaaaaa。如果 ForceAttach 参数设置为 true,表示需要将组内现存的 ECS 实例按照设置的端口号(60)和权重(100)全部添加到虚拟服务器组 rsp-aaaaaaa 后端;如果 ForceAttach 参数设置为 false,则表示不添加。
注意:
- 上述代码中,AK、AKS、虚拟服务器组ID、负载均衡ID等参数需要您根据实际情况进行设置。
- 如果请求参数中的虚拟服务器组已经在伸缩组中存在(负载均衡ID+虚拟服务器组ID+端口号都相同则认为存在),则忽略对应的虚拟服务器组+端口号,并且接口不报错
- 如果请求参数中的虚拟服务器组重复(负载均衡ID+虚拟服务器组ID+端口号都相同则认为重复),则只取参数中最先设置的,接口自动去重,并且不报错
伸缩组移除虚拟服务器组
如果伸缩组创建完成以后,您想移除伸缩组中已经配置好的虚拟服务器组,可以通过使用 DetachVServerGroups 接口 或者 登陆 ESS控制台 通过修改伸缩组来实现。
通过 ESS 控制台将虚拟服务器组从伸缩组中移除
登录 ESS控制台,找到对应的伸缩组,点击修改伸缩组,弹出如下伸缩组修改对话框:
修改虚拟服务器组,点击确定即可。
通过 DetachVServerGroups 接口将虚拟服务器组从伸缩组中移除
通过 DetachVServerGroups 接口将虚拟服务器组从伸缩组中移除,对应的 JAVA 代码如下:
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.ess.model.v20140828.DetachVServerGroupsRequest;
import com.aliyuncs.ess.model.v20140828.DetachVServerGroupsResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import java.util.ArrayList;
import java.util.List;
public class EssSdk2Demo {
public static final String REGION_ID = "cn-hangzhou";
public static final String AK = "xxxxxxxxxxxxxx";
public static final String AKS = "xxxxxxxxxxxxxx";
public static void main(String[] args) throws Exception {
IClientProfile clientProfile = DefaultProfile.getProfile(REGION_ID, AK, AKS);
IAcsClient client = new DefaultAcsClient(clientProfile);
detachVServerGroups(client);
}
public static void detachVServerGroups(IAcsClient client) throws Exception {
DetachVServerGroupsRequest request = new DetachVServerGroupsRequest();
request.setScalingGroupId("asg-xxxxxxxx");
request.setRegionId(REGION_ID);
//待添加的虚拟服务器组列表
List<DetachVServerGroupsRequest.VServerGroup> vServerGroups = new ArrayList<DetachVServerGroupsRequest.VServerGroup>();
//负载均衡实例 lb-aaaaaa 对应的虚拟服务器组列表
DetachVServerGroupsRequest.VServerGroup vServerGroup = new DetachVServerGroupsRequest.VServerGroup();
vServerGroup.setLoadBalancerId("lb-aaaaaa");
List<DetachVServerGroupsRequest.VServerGroup.VServerGroupAttribute> vServerGroupAttributes = new ArrayList<DetachVServerGroupsRequest.VServerGroup.VServerGroupAttribute>();
DetachVServerGroupsRequest.VServerGroup.VServerGroupAttribute vServerGroupAttribute = new DetachVServerGroupsRequest.VServerGroup.VServerGroupAttribute();
vServerGroupAttribute.setVServerGroupId("rsp-aaaaaaa");
vServerGroupAttribute.setWeight(60);
vServerGroupAttributes.add(vServerGroupAttribute);
vServerGroup.setVServerGroupAttributes(vServerGroupAttributes);
vServerGroups.add(vServerGroup);
request.setVServerGroups(vServerGroups);
//true 表示将伸缩组内的ECS实例从虚拟服务器组移除,false 表示不移除
request.setForceDetach(false);
DetachVServerGroupsResponse response = client.getAcsResponse(request);
System.out.println(response.getRequestId());
}
}
使用上述代码,可以实现将伸缩组 asg-xxxxxxxx 中已经存在的端口号为 60 的虚拟服务器组 rsp-aaaaaaa 移除,虚拟服务器组所属的负载均衡实例为 lb-aaaaaa。如果 ForceDetach 参数设置为 true,表示需要将伸缩组内现存且在虚拟服务器组 rsp-aaaaaaa 中添加了的端口号为 60 的 ECS 实例从虚拟服务器组中移除;如果 ForceAttach 参数设置为 false,则表示不移除。
注意:
- 上述代码中,AK、AKS、虚拟服务器组ID、负载均衡ID等参数需要您根据实际情况进行设置。
- 如果请求参数中的虚拟服务器组在伸缩组中不存在(负载均衡ID+虚拟服务器组ID+端口号都相同则认为存在,反之为不存在),则忽略,并且接口不报错
写在最后
您可以在伸缩组中配置虚拟服务器组,对伸缩组内的 ECS 实例实现灵活的请求转发管理,并且通过 AttachVServerGroups 和 DetachVServerGroups 接口,您可以随时增加或者减少伸缩组内的虚拟服务器组,降低了虚拟服务器组与伸缩组的耦合程度,大大增加了您使用上的灵活性与实用性。