示例仓库
笔者改过的官方示例:distributed-chat
- https://github.com/Hacker-Linner/cloud-native-game-server/tree/master/demo/3-distributed-chat
探索
我们进入 3-distributed-chat
启动主服务器
用来管理或者调度集群中的其他服务器。
首先编译一下:
代码语言:javascript复制go build -o distributed
然后:
代码语言:javascript复制# 它的监听地址是 127.0.0.1:34567,同时也是 gRPC 服务器地址
# 它对外提供了两个服务:
# TopicService.NewUser ->> 处理来自网关的新用户请求的公共逻辑等
# TopicService.Stats ->> 集群机器服务调用统计等等
# 说白了就是 Component 里面的两个 hanlder
./distributed master --listen "127.0.0.1:34567"
启动聊天服务器并让它加入到 cluster
真正的游戏业务逻辑服务
代码语言:javascript复制# --master 127.0.0.1:34567 远程主服务器地址
# 它的监听地址是 127.0.0.1:34580,同时也是 gRPC 服务器地址
# 它对外提供了两个服务:
# RoomService.JoinRoom ->> 将客户端的 session 加入 Group 统一管理
# RoomService.SyncMessage ->> 广播消息,就是调用 Group 管理的 session,写信息到它们给自的 websocket 连接
./distributed chat --master "127.0.0.1:34567" --listen "127.0.0.1:34580"
启动网关服务器并让它加入到 cluster
客户端真正要连接的入口地址:
代码语言:javascript复制# -gate-address "127.0.0.1:34590" 这个就是客户端 websocket 连接要连接的地址
# 它的监听地址是 127.0.0.1:34570,同时也是 gRPC 服务器地址
# 它对外提供了两个服务:
# BindService.Login # 鉴权方面到处理
# BindService.BindChatServer # 直接绑定到具体到聊天服务器
./distributed gate --master "127.0.0.1:34567" --listen "127.0.0.1:34570" --gate-address "127.0.0.1:34590"
远程服务 Remote Service
集群上的每台服务器,通过 Master 节点注册后,都会把除自己以外的集群中其它节点提供的服务注册为自己的 Remote Service。
所以当我们客户端调用 starx.notify('RoomService.SyncMessage'...
,其实网关服务器会调用它的 Remote Service,最终会转到 Chat Server
节点。
具体流程
http://127.0.0.1:12345/web/
用户加入房间:BindService.Login(Gate Server)
-> TopicService.NewUser(Master Server)
-> RoomService.JoinRoom(Chat Server)
用户发送消息:Gate Server
-> RoomService.SyncMessage(Chat Server)