zoukankan      html  css  js  c++  java
  • nsqlookupd.go

    package nsqlookupd

    import (
        "fmt"
        "net"
        "os"
        "sync"

        "github.com/nsqio/nsq/internal/http_api"
        "github.com/nsqio/nsq/internal/protocol"
        "github.com/nsqio/nsq/internal/util"
        "github.com/nsqio/nsq/internal/version"
    )

    type NSQLookupd struct {
        sync.RWMutex
        opts         *Options
        tcpListener  net.Listener
        httpListener net.Listener
        waitGroup    util.WaitGroupWrapper
        DB           *RegistrationDB
    }

    func New(opts *Options) *NSQLookupd {
        n := &NSQLookupd{
            opts: opts,
            DB:   NewRegistrationDB(),
        }
        n.logf(version.String("nsqlookupd"))
        return n
    }

    func (l *NSQLookupd) logf(f string, args ...interface{}) {
        if l.opts.Logger == nil {
            return
        }
        l.opts.Logger.Output(2, fmt.Sprintf(f, args...))
    }

    func (l *NSQLookupd) Main() {
        ctx := &Context{l}

        tcpListener, err := net.Listen("tcp", l.opts.TCPAddress)
        if err != nil {
            l.logf("FATAL: listen (%s) failed - %s", l.opts.TCPAddress, err)
            os.Exit(1)
        }
        l.Lock()
        l.tcpListener = tcpListener
        l.Unlock()
        tcpServer := &tcpServer{ctx: ctx}
        l.waitGroup.Wrap(func() {
            protocol.TCPServer(tcpListener, tcpServer, l.opts.Logger)
        })

        httpListener, err := net.Listen("tcp", l.opts.HTTPAddress)
        if err != nil {
            l.logf("FATAL: listen (%s) failed - %s", l.opts.HTTPAddress, err)
            os.Exit(1)
        }
        l.Lock()
        l.httpListener = httpListener
        l.Unlock()
        httpServer := newHTTPServer(ctx)
        l.waitGroup.Wrap(func() {
            http_api.Serve(httpListener, httpServer, "HTTP", l.opts.Logger)
        })
    }

    func (l *NSQLookupd) RealTCPAddr() *net.TCPAddr {
        l.RLock()
        defer l.RUnlock()
        return l.tcpListener.Addr().(*net.TCPAddr)
    }

    func (l *NSQLookupd) RealHTTPAddr() *net.TCPAddr {
        l.RLock()
        defer l.RUnlock()
        return l.httpListener.Addr().(*net.TCPAddr)
    }

    func (l *NSQLookupd) Exit() {
        if l.tcpListener != nil {
            l.tcpListener.Close()
        }

        if l.httpListener != nil {
            l.httpListener.Close()
        }
        l.waitGroup.Wait()
    }

  • 相关阅读:
    Ubuntu Linux下的Wireshark使用drcom_2011.lua分析drcom协议
    Keil提示premature end of file错误 无法生成HEX文件
    Linux和win7(win10)双系统时间错误问题 时间相差8小时
    Wireshark使用drcom_2011.lua插件协助分析drcom协议
    Keil报错failed to execute 'd:KeilC51BINC51.EXE'
    第一篇博文
    LG 7078 贪吃蛇
    LG 1791 人员雇佣
    洛谷 2698 Flowerpot
    HDU 5965 扫雷
  • 原文地址:https://www.cnblogs.com/zhangboyu/p/7457146.html
Copyright © 2011-2022 走看看