之前已经将NSQ的nsqlookupd模块源码大致的看了一遍了,现在开始阅读nsqd模块的源码。作为NSQ的核心模块,代码量也相对多点。废话不多说,开始读代码。
首先从mai()方法开始:
func main() {
prg := &program{}
if err := svc.Run(prg, syscall.SIGINT, syscall.SIGTERM); err != nil {
log.Fatal(err)
}
}
main()方法很简单,就几行代码,但理解起来却不简单。大量的操作都封装在了svc.Run()里了,其主要作用是运行程序并阻塞,直到接受到SIGINT或SIGTERM信号,关闭程序。
关于系统调用和信号处理,可以看自己看看相关的介绍,就不再赘述了。
文采不行,写不出什么长篇大论的,还是老样子,直接贴代码吧:
package main
import (
"crypto/tls"
"flag"
"fmt"
"log"
"math/rand"
"os"
"path/filepath"
"strconv"
"strings"
"syscall"
"time"
"github.com/BurntSushi/toml"
"github.com/judwhite/go-svc/svc"
"github.com/mreiferson/options"
"github.com/nsqio/nsq/internal/app"
"github.com/nsqio/nsq/internal/version"
"github.com/nsqio/nsq/nsqd"
)
type tlsRequiredOption int
func (t *tlsRequiredOption) Set(s string) error {
s = strings.ToLower(s)
if s == "tcp-https" {
*t = nsqd.TLSRequiredExceptHTTP
return nil
}
required, err := strconv.ParseBool(s)
if required {
*t = nsqd.TLSRequired
} else {
*t = nsqd.TLSNotRequired
}
return err
}
func (t *tlsRequiredOption) Get() interface{} { return int(*t) }
func (t *tlsRequiredOption) String() string {
return strconv.FormatInt(int64(*t), 10)
}
func (t *tlsRequiredOption) IsBoolFlag() bool { return true }
type tlsMinVersionOption uint16
func (t *tlsMinVersionOption) Set(s string) error {
s = strings.ToLower(s)
switch s {
case "":
return nil
case "ssl3.0":
*t = tls.VersionSSL30
case "tls1.0":
*t = tls.VersionTLS10
case "tls1.1":
*t = tls.VersionTLS11
case "tls1.2":
*t = tls.VersionTLS12
default:
return fmt.Errorf("unknown tlsVersionOption %q", s)
}
return nil
}
func (t *tlsMinVersionOption) Get() interface{} { return uint16(*t) }
func (t