美文网首页
golang tcp无缝升级

golang tcp无缝升级

作者: 哆啦在这A梦在哪 | 来源:发表于2021-06-30 15:34 被阅读0次

    git地址:https://github.com/shitingbao/endless_tcp

    代码直接去git看,这里简单介绍一下例子的使用

    前言

    偶然发现虽然有无缝升级的http代码,但是没有tcp连接处理,心血来潮就写了一个,有发现问题,欢迎指正和提出!!

    Example 介绍,详细代码请看example文件下的server和client方法

    只要三步

    1.定义一个实现了 ReadMessage(b *ReadMes) 的方法

    type tcpModel struct {
    }
    
    func (t *tcpModel) ReadMessage(b *tcp.ReadMes) {
        log.Println(b.N, ":", string(b.Mes))
    }
    

    2.new 一个 EndlessTcp 对象,并将上述对象放入,开始监听

        e := tcp.New(":8080")
        t := &tcpModel{}
        if err := e.EndlessTcpRegisterAndListen(t); err != nil {
            return
        }
    

    3.修改代码并发送信号(以test为例子)

    $ go build //修改代码后,重新构建出 test
    $ ps -ef|grep test // 找到正在运行的 test 对应进程号,比如是进程号是: 1234
    $ kill -SIGUSR2 1234 // 向 1234 进程发送一个 SIGUSR2 信号,如果有连接,就会显示如下:
      501 31021 27220   0  3:09下午 ttys001    0:00.09 ./test
      501 31088 31021   0  3:10下午 ttys001    0:00.05 ./test -reload
    
    第一个是第一次执行的进程,第二个带有 -reload 参数是升级后的进程,这时候,新的连接就会被新进程接受,
    旧进程将不会接受新连接,不过会继续为还没有断开的连接提供服务,直到所有旧连接都断开,然后结束旧连接。如下,只剩一个:
    
     501 31088     1   0  3:10下午 ??         0:00.96 ./test -reload
    
    

    Example使用方法

    1.启动server
    2.执行client
    3.修改server代码(比如写入的内容修改)
    4.执行上述升级操作
    5.新连接一个client(这时候发现两个连接,接受到的内容是不一样的)


    注意事项以及问题

    1.由于内部结构使用了 map 来保存con,key使用的是远程ip,所有当使用代理时(比如nginx代理),注意ip重复可能导致con被覆盖

    2.当多个连接的时候,还是需要自己处理一下特定消息的发送和接受,自己处理包的内容(write方法和read方法,现在write方法是对所有连接进行发送消息)

    3.不要改变监听的端口号,这会出现意外的错误

    4.当频繁升级时,可能会滞留一些老连接,这时候需要注意升级的次数和当前的连接

    5.对于os.NewFile 的第一个参数为什么是3,请参考:https://blog.csdn.net/u011244839/article/details/72865493

    相关文章

      网友评论

          本文标题:golang tcp无缝升级

          本文链接:https://www.haomeiwen.com/subject/uuyrultx.html