扯两句
golang 就是网络开发的C语言
忘了从哪里看到的这句话了,还是蛮贴切的,golang的runtime和官方包里面封装了很多底层的东西(比如说:epoll等),到了应用层,一般只需要考虑业务。
当然了,也能自己去实现更高效的底层网络事件(应该是阿里有大牛在什么比赛上面,自己实现epoll事务处理,在某些场景下,是比官方默认的效率高很多)
鉴于源码无法全部分开,只是在此处贴一小部分,谢谢理解
封装listener
coreListener.go (model)
// CoreListener TCP链接对象的封装
type CoreListener struct {
listener net.Listener
lock sync.RWMutex
status bool
network string
address string
startTime time.Time
}
// NewCoreListener 新建对象
func NewCoreListener(network string, address string) *CoreListener {
return &CoreListener{
status: false,
network: network,
address: address,
}
}
// IsRuning 是否在监听中
func (cl *CoreListener) IsRuning() bool {
return cl.status
}
// Start 开启服务
func (cl *CoreListener) Start() error {
cl.lock.Lock()
defer cl.lock.Unlock()
if cl.IsRuning() {
return fmt.Errorf("服务已经启动")
}
var err error
/*
// 判断是否是在WIN下,启动的方式不一样 2020-03
// 可以只考虑在linux下,本机用docker调试 2020-04
if utilprocess.IsWIN() {
cl.listener, err = net.Listen(cl.network, cl.address)
} else {
f := os.NewFile(3, "")
cl.listener, err = net.FileListener(f)
}
*/
cl.listener, err = net.Listen(cl.network, cl.address)
if err == nil {
cl.startTime = time.Now()
cl.status = true
}
logs.ExitedProcess(err, "start tcp error")
return err
}
tcp.go
// StartCoreTCPServer 核心TCP服务,监听端口,方便硬件连接
func StartCoreTCPServer() {
// 2S 之后才启动SOCKET服务
time.Sleep(time.Second * 2)
err := coreListener.Start()
if logs.ErrorProcess(err, "tcp start error") {
return
}
logs.Show("start tcp service @%s", port)
// 启动心跳检查
// 关闭默认心跳。2022-04-22
base.Go(heartBeatJob)
启动
main.go
func main() {
// ...其他省略
base.Go(core.StartCoreTCPServer)
base.Go(core.StartWebServer)
// ...其他省略