这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战
安全提醒:
请不要直接在公司账号或生产服务器 所在账号下测试,先创建个人账号,弄个按量收费的slb(公网slb是要钱的,内网slb是免费的)进行测试
前言
SLB(Load Balance) S是Server,负载均衡的意思,它的作用可以承接前方CDN和防火墙的流量,然后将流量按照调度策略分发给后端的服务器
常用的nginx也有负载均衡的能力,通常也是将流量按照调度策略分发给后端的服务器
这里调用的slb-api是指的阿里云负载均衡中 传统型负载均衡
需求
既然要基于api进行二次开发,那么具体要实现什么功能,达到什么目地了
在常见业务景场中 slb可以做到以下功能,但是需要手工操作,那么接下来我们用代码实现,增加自动化能力
- 灰度发布 (项目发布后的流量接入控制)
- 流量控制 (按照规则设置不同服务不同流量分发)
- 摘机操作 (服务器迁移,故障转移等将相应服务器剔除,不接受流量)
- 黑白名单 (按照规则限制ip访问或允许ip访问,提高服务安全性)
实现
接下来开始直接撸代码,上面的需求部分 灰度发布,流量控制,摘机操作在SLB里面 其实全部是针对流量分发的一个操作
- 摘机操作 其实就是将流量归零,这样就可以随意操作这台0流量的服务器了
- 流量控制 其实是按照服务器的性能以及部署情况 针对不同服务器设置不同流量
- 灰度发布 其实是流量递增的一个过程,就是流量 在测试通过后不断增加值
而黑白名单 则是控制该slb允许哪些ip访问,或不允许哪些ip访问
- 黑名单 限制某些ip不能访问,可用于ddos,cc攻击事件,禁止该ip访问我们的服务,
- 白名单 允许某些ip访问,其他ip均不能访问,可用于企业内部服务只让内部访问
可视化调试
OpenAPI Explorer 提供了可视化界面,且自带生成各种语言的demo,对于新手非常友好
发起调用后,就可以看到相关结果了,在生成代码示例上方还有 该api的文档 以及参数详情,非常方便
因为习惯了 代码编辑器 搬砖,所以接下来都在编辑器操作了
功能实现
流量控制具体实现是控制 服务器权重的值
权重值0-100 0表示不接受流量(归零) 100表示最大值
如果一个SLB带两个服务器 权重都是100 那么就是按照1:1的流量轮巡 如果一个SLB带三个服务器 权重是100 50 50 那么就是2:1:1的流量分发
流量控制
package main
import (
"flag"
"fmt"
"github.com/aliyun/alibaba-cloud-sdk-go/services/slb"
)
func main() {
//实现摘机功能
SLBWeight("loadBalanceInstanceId","0","serverInstanceId")
//实现灰度发布
SLBWeight("loadBalanceInstanceId","5","serverInstanceId")
SLBWeight("loadBalanceInstanceId","10","serverInstanceId")
//实现流量控制
SLBWeight("loadBalanceInstanceId","100","serverInstanceId")
}
//该方法需要3个参数个 slb实例id 权重值 服务器实例id
func SLBWeight(lbID string,weight string,serverId string) {
//需要填入 AccessKey ID 和 AccessKey Secret 是 API 的密钥
client, err := slb.NewClientWithAccessKey("cn-hangzhou", "AK", "AS")
request := slb.CreateSetBackendServersRequest()
request.Scheme = "https"
request.LoadBalancerId = lbID
request.BackendServers = "[{ "ServerId": serverId, "Weight": weight, "Type": "ecs", "Port":"80","Description":"" }]"
fmt.Println("request is: ",request.BackendServers)
response, err := client.SetBackendServers(request)
if err != nil {
fmt.Print(err.Error())
}
fmt.Printf("response is %#v\n", response.BackendServers.BackendServer)
}
黑白名单
这个黑白名单,需要提前去SLB里面创建,依次要创建黑名单策略组和白名单策略组,具体实现将ip写入到对应的策略组
package main
import (
"fmt"
"github.com/aliyun/alibaba-cloud-sdk-go/services/slb"
)
func main() {
//实现黑名单
SLBAccessControl("blackListId","ip")
//实现白名单
SLBAccessControl("whiteListId","ip")
}
//该方法需要2个参数 访问实例控制组id 需要限制的ip
func SLBAccessControl(acID string,ipEntry string) {
client, err := slb.NewClientWithAccessKey("cn-hangzhou", "<accessKeyId>", "<accessSecret>")
request := slb.CreateAddAccessControlListEntryRequest()
request.Scheme = "https"
request.AclId = "acID"
request.AclEntrys = `[{"entry":ipEntry,"comment":""}]`
response, err := client.AddAccessControlListEntry(request)
if err != nil {
fmt.Print(err.Error())
}
fmt.Printf("response is %#v\n", response)
}
总结
SLB的api调用总体比较简单,进一步和项目集成的话,也是作为util包,通过编写web项目提供接口 来实现
api调用有任何问题 都在OpenAPI Explorer页面找到文档或说明