分布式功能实现

一、UDP协议实现分布式思路

支持分布式

回顾单体应用 开启ws接收协程recvproc/ws发送协程sendproc websocket收到消息->dispatch发送给dstid

基于UDP的分布式应用 开启ws接收协程recvproc/ws发送协程sendproc 开启udp接收协程udprecvproc/udp发送协程udpsendproc

websocket收到消息->broadMsg广播到局域网 udp接收到收到消息->dispatch发送给dstid 自己是局域网一份子,所以也能接收到消息

二、项目实现过程

接口携程接收到消息的时候以前直接分发给目标用户,现在先采取广播的形式 28、分布式功能实现 - 图1

广播函数怎么实现呢? 28、分布式功能实现 - 图2

相应的需要一个协程需要做udp数据的发送 controller/chat.go

  1. // todo 完成udp数据的发送协程
  2. func udpsendproc() {
  3. log.Println("start udpsendproc")
  4. //todo 使用udp协议拨号
  5. con, err := net.DialUDP("udp", nil,
  6. &net.UDPAddr{
  7. IP: net.IPv4(192, 168, 0, 255), //代表的是个网段, 255代表的是个子网段
  8. Port: 3000,
  9. })
  10. defer con.Close()
  11. if err != nil {
  12. log.Println(err.Error())
  13. return
  14. }
  15. //todo 通过的到的con发送消息
  16. //con.Write()
  17. for {
  18. select {
  19. case data := <-udpsendchan:
  20. _, err = con.Write(data)
  21. if err != nil {
  22. log.Println(err.Error())
  23. return
  24. }
  25. }
  26. }
  27. }

实现udp接收的协程controller/chat.go

  1. // todo 完成upd接收并处理功能
  2. func udprecvproc() {
  3. log.Println("start udprecvproc")
  4. //todo 监听udp广播端口
  5. con, err := net.ListenUDP("udp", &net.UDPAddr{
  6. IP: net.IPv4zero, //0.0.0.0
  7. Port: 3000,
  8. })
  9. defer con.Close()
  10. if err != nil {
  11. log.Println(err.Error())
  12. }
  13. //TODO 处理端口发过来的数据
  14. for {
  15. var buf [512]byte //获取发送过来的数据
  16. n, err := con.Read(buf[0:]) //放到这个切片里面去
  17. if err != nil {
  18. log.Println(err.Error())
  19. return
  20. }
  21. //直接数据处理
  22. dispatch(buf[0:n])
  23. }
  24. log.Println("stop updrecvproc")
  25. }

如何让两个协程自启动 controller/chat.go

28、分布式功能实现 - 图3

测试协程是否启动成功

28、分布式功能实现 - 图4