基于go的websocket消息推送的集群实现目前websocket技术已经很成熟go语言转发服务,选型Go语言,当然是为了节省成本以及它强大go语言转发服务的高并发性能 。我使用的是第三方开源的websocket库即gorilla/websocket 。
由于我们线上推送的量不小 , 推送后端需要部署多节点保持高可用,所以需要自己做集群 , 具体架构方案如图go语言转发服务:
Auth Service:鉴权服务,根据Token验证用户权限 。
Collect Service:消息采集服务,负责收集业务系统消息,存入MongoDB后,发送给消息分发服务 。
Dispatch Service:消息分发服务 , 根据路由规则分发至对应消息推送服务节点上 。
Push Service:消息推送服务,通过websocket将消息推送给用户 。
【go语言转发服务 go语言类型转换】 集群推送的关键点在于,web端与服务端建立长连接之后,具体跟哪个推送节点保持长连接的,如果我们能够找到对应的连接节点,那么我们就可以将消息推送出去 。下面讲解一下集群的大致流程:
1. web端用户登录之后 , 带上token与后端推送服务(Push Service)保持长连接 。
2. 推送服务收到连接请求之后,携带token去鉴权服务(Auth Service)验证此token权限,并返回用户ID 。
3. 把返回的用户ID与长连接存入本地缓存,保持用户ID与长连接绑定关系 。
4. 再将用户ID与本推送节点IP存入redis,建立用户(即长连接)与节点绑定关系,并设置失效时间 。
5. 采集服务(Collect Service)收集业务消息 , 首先存入mongodb,然后将消息透传给分发服务(Dispatch Service) 。
6. 分发服务收到消息之后,根据消息体中的用户ID,从redis中获取对应的推送服务节点IP,然后转发给对应的推送节点 。
7. 推送服务节点收到消息之后,根据用户ID , 从本地缓存中取出对应的长连接 , 将消息推送给客户端 。
其他注意事项:
Golang 端口转发工具初学go , 写一个端口转发工具 。很方便的小工具,希望能对大家学习go语言有所帮助 。
```Golang
package main
import(
"fmt"
"io"
"net"
"sync"
)
varlocksync.Mutex
vartrueList[]string
varipstring
varliststring
funcmain(){
ip="0.0.0.0:888"
server()
}
funcserver(){
fmt.Printf("Listening%s",ip)
lis,err:=net.Listen("tcp",ip)
iferr!=nil{
fmt.Println(err)
return
}
deferlis.Close()
for{
conn,err:=lis.Accept()
iferr!=nil{
fmt.Println("建立连接错误:%v\n",err)
continue
}
fmt.Println(conn.RemoteAddr(),conn.LocalAddr())
gohandle(conn)
}
}
funchandle(sconnnet.Conn){
defersconn.Close()
ip:="127.0.0.1:8888"
dconn,err:=net.Dial("tcp",ip)
iferr!=nil{
fmt.Printf("连接%v失败:%v\n",ip,err)
return
}
ExitChan:=make(chanbool,1)
gofunc(sconnnet.Conn,dconnnet.Conn,Exitchanbool){
io.Copy(dconn,sconn)
ExitChan-true
}(sconn,dconn,ExitChan)
gofunc(sconnnet.Conn,dconnnet.Conn,Exitchanbool){
io.Copy(sconn,dconn)
ExitChan-true
}(sconn,dconn,ExitChan)
-ExitChan
dconn.Close()
}
golang一个端口怎么同时提供http和https1、首先使用一个公共的端口作为监听,让HTTP和HTTPS服务分别监听在各自的端口上 。
2、其次在公共端口服务区分这是HTTP请求还是HTTPS请求 。
3、最后各自转发到所服务的监听即可 。
如何用Go语言打造一个高性能MySQLProxy读取配置文件并启动go语言转发服务,在配置文件中设置go语言转发服务的监听端口监听客户端请求 。
推荐阅读
- 手机如何直播夜晚星空效果,手机直播步骤
- sqlserver快速导出数据,SQLserver导出数据
- linux命令exec,创建文件夹Linux命令
- widget大全flutter,flutter didupdatewidget
- linux显示版本+命令 linux查看系统版本信息
- mysql的分页查询实例,mysql 分页查询语句
- 角色扮演游戏魔法,角色扮演游戏游戏
- 比基尼直播平台下载,比基尼直播平台下载安卓
- go语言除0 go语言除法口诀