前文讲到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 t
func 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   TestFaast
2022/02/14 18:34:14 0.0.0.0
2022/02/14 18:34:14 127.0.0.1
2022/02/14 18:34:14 127.0.0.1
2022/02/14 18:34:14 127.0.0.1
2022/02/14 18:34:14 0.0.0.0
2022/02/14 18:34:14 127.0.0.1
2022/02/14 18:34:14 127.0.0.1
2022/02/14 18:34:14 0.0.0.0
2022/02/14 18:34:14 0.0.0.0
2022/02/14 18:34:14 127.0.0.1
2022/02/14 18:34:14 127.0.0.1
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 !
2022/02/14 18:34:14 Have Fun ~ Tester !
--- PASS: TestFaast (0.17s)

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

Have Fun ~ Tester !


↙↙↙阅读原文可查看相关链接,并与作者交流