分布式功能实现
一、UDP协议实现分布式思路
支持分布式
回顾单体应用 开启ws接收协程recvproc/ws发送协程sendproc websocket收到消息->dispatch发送给dstid
基于UDP的分布式应用 开启ws接收协程recvproc/ws发送协程sendproc 开启udp接收协程udprecvproc/udp发送协程udpsendproc
websocket收到消息->broadMsg广播到局域网 udp接收到收到消息->dispatch发送给dstid 自己是局域网一份子,所以也能接收到消息
二、项目实现过程
接口携程接收到消息的时候以前直接分发给目标用户,现在先采取广播的形式
广播函数怎么实现呢?
相应的需要一个协程需要做udp数据的发送 controller/chat.go
// todo 完成udp数据的发送协程
func udpsendproc() {
log.Println("start udpsendproc")
//todo 使用udp协议拨号
con, err := net.DialUDP("udp", nil,
&net.UDPAddr{
IP: net.IPv4(192, 168, 0, 255), //代表的是个网段, 255代表的是个子网段
Port: 3000,
})
defer con.Close()
if err != nil {
log.Println(err.Error())
return
}
//todo 通过的到的con发送消息
//con.Write()
for {
select {
case data := <-udpsendchan:
_, err = con.Write(data)
if err != nil {
log.Println(err.Error())
return
}
}
}
}
实现udp接收的协程controller/chat.go
// todo 完成upd接收并处理功能
func udprecvproc() {
log.Println("start udprecvproc")
//todo 监听udp广播端口
con, err := net.ListenUDP("udp", &net.UDPAddr{
IP: net.IPv4zero, //0.0.0.0
Port: 3000,
})
defer con.Close()
if err != nil {
log.Println(err.Error())
}
//TODO 处理端口发过来的数据
for {
var buf [512]byte //获取发送过来的数据
n, err := con.Read(buf[0:]) //放到这个切片里面去
if err != nil {
log.Println(err.Error())
return
}
//直接数据处理
dispatch(buf[0:n])
}
log.Println("stop updrecvproc")
}
如何让两个协程自启动 controller/chat.go
测试协程是否启动成功