Go语言搬砖 slb-api调用

718 阅读4分钟

这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战

安全提醒:
请不要直接在公司账号或生产服务器 所在账号下测试,先创建个人账号,弄个按量收费的slb(公网slb是要钱的,内网slb是免费的)进行测试

前言

SLB(Load Balance) S是Server,负载均衡的意思,它的作用可以承接前方CDN和防火墙的流量,然后将流量按照调度策略分发给后端的服务器

常用的nginx也有负载均衡的能力,通常也是将流量按照调度策略分发给后端的服务器

这里调用的slb-api是指的阿里云负载均衡中 传统型负载均衡

image.png

需求

既然要基于api进行二次开发,那么具体要实现什么功能,达到什么目地了

在常见业务景场中 slb可以做到以下功能,但是需要手工操作,那么接下来我们用代码实现,增加自动化能力

  • 灰度发布 (项目发布后的流量接入控制)
  • 流量控制 (按照规则设置不同服务不同流量分发)
  • 摘机操作 (服务器迁移,故障转移等将相应服务器剔除,不接受流量)
  • 黑白名单 (按照规则限制ip访问或允许ip访问,提高服务安全性)

实现

接下来开始直接撸代码,上面的需求部分 灰度发布,流量控制,摘机操作在SLB里面 其实全部是针对流量分发的一个操作

  1. 摘机操作 其实就是将流量归零,这样就可以随意操作这台0流量的服务器了
  2. 流量控制 其实是按照服务器的性能以及部署情况 针对不同服务器设置不同流量
  3. 灰度发布 其实是流量递增的一个过程,就是流量 在测试通过后不断增加值

而黑白名单 则是控制该slb允许哪些ip访问,或不允许哪些ip访问

  1. 黑名单 限制某些ip不能访问,可用于ddos,cc攻击事件,禁止该ip访问我们的服务,
  2. 白名单 允许某些ip访问,其他ip均不能访问,可用于企业内部服务只让内部访问

可视化调试

OpenAPI Explorer 提供了可视化界面,且自带生成各种语言的demo,对于新手非常友好

image.png

发起调用后,就可以看到相关结果了,在生成代码示例上方还有 该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页面找到文档或说明