写点什么

Go 自定义 DNS 解析器负载均衡实践

作者:FunTester
  • 2022 年 2 月 24 日
  • 本文字数:1467 字

    阅读完需:约 5 分钟

Go自定义DNS解析器负载均衡实践

前文讲到Go语言自定义DNS解析器实践,今天分享一下如何在自定义的 DNS 解析器中实现负载均衡。


PS:这里我并没有找到fasthttp相关资料,暂时不做fasthttp的实践。

实现

首先我们看前文用提到用于创建 HTTP 客户端的代码片段:


DialContext: func(ctx context.Context, network, address string) (net.Conn, error) {        host, port, err := net.SplitHostPort(address)        if err != nil {          return nil, err        }
// 创建链接 if host == "fun.tester" { ip := "127.0.0.1" log.Println(ip) conn, err := dialer.DialContext(ctx, network, ip+":"+port) if err == nil { return conn, nil } } return dialer.DialContext(ctx, network, address) },
复制代码


其实只要对这个方法进行小小的改造即可,思路跟Java自定义DNS解析器负载均衡实现一样,都是预设一些 IP,然后随机获取一个使用。


// 创建链接        if host == "fun.tester" {          ips := []string{"127.0.0.1", "0.0.0.0"}          ip := futil.RandomStrs(ips)          log.Println(ip)          conn, err := dialer.DialContext(ctx, network, ip+":"+port)          if err == nil {            return conn, nil          }        }
复制代码


当然这个地方完全可以配置化,有兴趣的同学可以自行拓展。

测试

先说结论:结论同Java自定义DNS解析器负载均衡实现,只有在创建新连接的时候,才会执行一次改造后的方法。


测试服务跟 Java 一致,这里不分享了。用例如下:


// TestFaast// @Description: 测试自定义DNS解析功能// @param tfunc TestFaast(t *testing.T) {  url := "http://fun.tester:12345/test"  get := fhttp.Get(url, nil)  for i := 0; i < 10; i++ {    go func() {      log.Println(string(fhttp.Response(get)))    }()  }  response := fhttp.Response(get)  log.Println(string(response))
}
复制代码


控制台输出:


=== RUN   TestFaast2022/02/14 18:34:14 0.0.0.02022/02/14 18:34:14 127.0.0.12022/02/14 18:34:14 127.0.0.12022/02/14 18:34:14 127.0.0.12022/02/14 18:34:14 0.0.0.02022/02/14 18:34:14 127.0.0.12022/02/14 18:34:14 127.0.0.12022/02/14 18:34:14 0.0.0.02022/02/14 18:34:14 0.0.0.02022/02/14 18:34:14 127.0.0.12022/02/14 18:34:14 127.0.0.12022/02/14 18:34:14 Have Fun ~ Tester !2022/02/14 18:34:14 Have Fun ~ Tester !2022/02/14 18:34:14 Have Fun ~ Tester !2022/02/14 18:34:14 Have Fun ~ Tester !2022/02/14 18:34:14 Have Fun ~ Tester !2022/02/14 18:34:14 Have Fun ~ Tester !2022/02/14 18:34:14 Have Fun ~ Tester !2022/02/14 18:34:14 Have Fun ~ Tester !2022/02/14 18:34:14 Have Fun ~ Tester !2022/02/14 18:34:14 Have Fun ~ Tester !2022/02/14 18:34:14 Have Fun ~ Tester !--- PASS: TestFaast (0.17s)
复制代码


完美实现,随机函数可自定义,最好自己先测试一波。

Have Fun ~ Tester !

发布于: 刚刚阅读数: 2
用户头像

FunTester

关注

公众号:FunTester,750篇原创,欢迎关注 2020.10.20 加入

公众号FunTester,坚持原创文章的测试人,一个有趣的灵魂。

评论

发布
暂无评论
Go自定义DNS解析器负载均衡实践