「All right reserved, any unauthorized reproduction or transfer is prohibitted」
写完了Java 自定义 DNS 解析器实践和Java 自定义 DNS 解析器负载均衡实现之后,自然也需要对 Go 语言的测试拓展相同的功能,走了一些弯路,最终目的还是实现了。今天分享一下 Go 语言 HTTP 接口测试自定义 DNS 解析的实现。这里只用http
库作为演示,fasthttp
以后有机会再尝试分享。
设置 net.Dialer
这里先分享一下net.Dialer
的设置方式。net.Dialer
翻译为拨号器,我的理解是 HTTP 连接的建立类,类似于Java
语言HttpClient
库里面的org.apache.http.impl.conn.PoolingHttpClientConnectionManager
部分功能。(HttpClient4.5x 以后推荐这个)。
// clients 初始化请求客户端
// @Description:
// @return fhttp.Client
func clients() http.Client {
dialer := &net.Dialer{
Timeout: 1 * time.Second,
}
return http.Client{
Timeout: time.Duration(5) * time.Second, //超时时间
Transport: &http.Transport{
MaxIdleConnsPerHost: 200, //单个路由最大空闲连接数
MaxConnsPerHost: 10000, //单个路由最大连接数
IdleConnTimeout: 90 * time.Second,
TLSHandshakeTimeout: 10 * time.Second,
ExpectContinueTimeout: 1 * time.Second,
DialContext: dialer.DialContext,
},
}
}
奇怪的知识点
在本次学习的过程中,发现了 Go 语言的net/http
库还支持了另外一个有趣的功能,就是绑定 DNS 服务 IP,这个有时候也能部分解决将固定域名的请求发送到固定机器的需求。
简单设置的方法如下:
dialer := &net.Dialer{
Timeout: 1 * time.Second,
}
dialer.Resolver = &net.Resolver{
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
return dialer.DialContext(ctx, "tcp", "114.114.114.114:53") // 通过tcp请求nameserver解析域名
},
}
其他设置项同上。
自定义 net.Dialer
在http.Transport
创建参数中,有一个DialContext
参数就是指定用于创建未加密 TCP 连接的拨号函数。参数类型是func(ctx context.Context, network, addr string) (net.Conn, error)
方法,这里我习惯称之为闭包。我们只要实现这个方法即可。
下面这个例子我设置了两个 IP 来测试负载均衡(下期出文字版和视频版)。
DialContext: func(ctx context.Context, network, address string) (net.Conn, error) {
host, port, err := net.SplitHostPort(address)
if err != nil {
return nil, err
}
//通过自定义nameserver获取域名解析的IP
//ips, _ := dialer.Resolver.LookupHost(ctx, host)
//for _, s := range ips {
// log.Println(s)
//}
// 创建链接
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)
},
中间有一部分通过自定义的nameserver
获取到域名解析结果 IP 的过程,注释掉了,留着以后用。
测试
测试用例如下:
// 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 log.Println(string(fhttp.Response(get)))
// go func() {
// log.Println(string(fhttp.Response(get)))
// }()
//}
response := fhttp.Response(get)
log.Println(string(response))
}
控制台输出:
=== RUN TestFaast
2022/02/07 15:34:47 127.0.0.1
2022/02/07 15:34:48 Have Fun ~ Tester !
--- PASS: TestFaast (0.31s)
PASS
测试服务
测试服务基于moco_FunTester
框架写的简单服务,脚本如下:
static void main(String[] args) {
def util = new ArgsUtil(args)
def server = getServerNoLog(util.getIntOrdefault(0, 12345))
server.response(delay(textRes("Have Fun ~ Tester !"), 100))
def run = run(server)
waitForKey("fan")
run.stop()
}
Have Fun ~ Tester !
TesterHome 为用户提供「保留所有权利,禁止转载」的选项。
除非获得原作者的单独授权,任何第三方不得转载标注了「All right reserved, any unauthorized reproduction or transfer is prohibitted」的内容,否则均视为侵权。
具体请参见TesterHome 知识产权保护协议。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
No Reply at the moment.