前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go语言自定义DNS解析器实践

Go语言自定义DNS解析器实践

作者头像
FunTester
发布2022-04-01 09:39:44
2.4K0
发布2022-04-01 09:39:44
举报
文章被收录于专栏:FunTester

写完了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以后推荐这个)。

代码语言:javascript
复制
// 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,这个有时候也能部分解决将固定域名的请求发送到固定机器的需求。

简单设置的方法如下:

代码语言:javascript
复制
 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来测试负载均衡(下期出文字版和视频版)。

代码语言:javascript
复制
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的过程,注释掉了,留着以后用。

测试

测试用例如下:

代码语言:javascript
复制
// 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))
}

控制台输出:

代码语言:javascript
复制
=== 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框架写的简单服务,脚本如下:

代码语言:javascript
复制
    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()
    }
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 设置net.Dialer
  • 奇怪的知识点
  • 自定义net.Dialer
  • 测试
  • 测试服务
相关产品与服务
测试服务
测试服务 WeTest 包括标准兼容测试、专家兼容测试、手游安全测试、远程调试等多款产品,服务于海量腾讯精品游戏,涵盖兼容测试、压力测试、性能测试、安全测试、远程调试等多个方向,立体化安全防护体系,保卫您的信息安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档