diff --git a/README.md b/README.md index ee5067d..77190aa 100644 --- a/README.md +++ b/README.md @@ -490,7 +490,7 @@ ws.close(); ## 3.3 发送消息 ### 3.3.1 文本消息 -客户端只要只到发送用户是谁,还有内容就可以显示文本消息,这里我们重点关注一下数据部分 +客户端只要知道发送用户是谁,还有内容就可以显示文本消息,这里我们重点关注一下数据部分 target:定义接收的目标,目前未设置 @@ -1065,10 +1065,10 @@ net.ipv4.tcp_wmem = 4096 4096 16777216 - 为了方便演示,IM系统和webSocket(acc)系统合并在一个系统中 - IM系统接口: -获取全部在线的用户,查询单前服务的全部用户+集群中服务的全部用户 +获取全部在线的用户,查询当前服务的全部用户+集群中服务的全部用户 发送消息,这里采用的是http接口发送(微信网页版发送消息也是http接口),这里考虑主要是两点: 1.服务分离,让acc系统尽量的简单一点,不掺杂其它业务逻辑 -2.发送消息是走http接口,不使用webSocket连接,才用收和发送数据分离的方式,可以加快收发数据的效率 +2.发送消息是走http接口,不使用webSocket连接,采用收和发送数据分离的方式,可以加快收发数据的效率 ### 7.2 架构 diff --git a/helper/server_helper.go b/helper/server_helper.go index a09f9da..1ef239e 100644 --- a/helper/server_helper.go +++ b/helper/server_helper.go @@ -12,21 +12,80 @@ import ( ) // 获取服务器Ip -func GetServerIp() (ip string) { - addrs, err := net.InterfaceAddrs() +// func GetServerIp() (ip string) { +// addrs, err := net.InterfaceAddrs() + +// if err != nil { +// return "" +// } + +// for _, address := range addrs { +// // 检查ip地址判断是否回环地址 +// if ipNet, ok := address.(*net.IPNet); ok && !ipNet.IP.IsLoopback() { +// if ipNet.IP.To4() != nil { +// ip = ipNet.IP.String() +// } +// } +// } + +// return +// } + +/**** 问题:我在本地多网卡机器上,运行分布式场景,此函数返回的ip有误导致rpc连接失败。 遂google结果如下: + *** 1、https://www.jianshu.com/p/301aabc06972 + *** 2、https://www.cnblogs.com/chaselogs/p/11301940.html +****/ +func GetServerIp() string { + ip, err := externalIP() if err != nil { return "" } + return ip.String() +} - for _, address := range addrs { - // 检查ip地址判断是否回环地址 - if ipNet, ok := address.(*net.IPNet); ok && !ipNet.IP.IsLoopback() { - if ipNet.IP.To4() != nil { - ip = ipNet.IP.String() +func externalIP() (net.IP, error) { + ifaces, err := net.Interfaces() + if err != nil { + return nil, err + } + for _, iface := range ifaces { + if iface.Flags&net.FlagUp == 0 { + continue // interface down + } + if iface.Flags&net.FlagLoopback != 0 { + continue // loopback interface + } + addrs, err := iface.Addrs() + if err != nil { + return nil, err + } + for _, addr := range addrs { + ip := getIpFromAddr(addr) + if ip == nil { + continue } + return ip, nil } } + return nil, err +} + +func getIpFromAddr(addr net.Addr) net.IP { + var ip net.IP + switch v := addr.(type) { + case *net.IPNet: + ip = v.IP + case *net.IPAddr: + ip = v.IP + } + if ip == nil || ip.IsLoopback() { + return nil + } + ip = ip.To4() + if ip == nil { + return nil // not an ipv4 address + } - return + return ip }