Compare commits

6 Commits

Author SHA1 Message Date
b1dfb88f71 feat sn 改成 int64 2026-01-30 11:56:10 +08:00
a7266f4bfa feat kafka 改版 2 2026-01-30 11:02:50 +08:00
2ea538995a feat kafka 2026-01-27 17:16:25 +08:00
174cd09ba6 feat 配置 2026-01-26 10:21:47 +08:00
62ebfa17ea feat kafka 2026-01-24 22:47:41 +08:00
8de7ab4a67 feat kafka 2026-01-24 21:48:31 +08:00
15 changed files with 43 additions and 36 deletions

View File

@@ -22,7 +22,7 @@ func (p *Program) Init(_ svc.Environment) error {
return err return err
} }
p.moduleList = append(p.moduleList, base) p.moduleList = append(p.moduleList, base)
p.moduleList = append(p.moduleList, (&module.DB{}).Bind(config.Get().DB, common.KeyDiscoverServiceNameGateway)) p.moduleList = append(p.moduleList, (&module.DB{}).Bind(config.Get().DB, config.Get().App.Name))
p.moduleList = append(p.moduleList, &ModuleWebServer{}) p.moduleList = append(p.moduleList, &ModuleWebServer{})
p.moduleList = append(p.moduleList, &ModuleWebsocketServer{}) p.moduleList = append(p.moduleList, &ModuleWebsocketServer{})
p.moduleList = append(p.moduleList, &ModuleLoginQueue{}) p.moduleList = append(p.moduleList, &ModuleLoginQueue{})

View File

@@ -13,19 +13,19 @@ metric:
address: "0.0.0.0" address: "0.0.0.0"
port: 18504 port: 18504
jaeger: jaeger:
endpoint: "localhost:4317" endpoint: "127.0.0.1:4317"
db: db:
etcd: etcd:
endpoints: [ "localhost:2379" ] endpoints: [ "127.0.0.1:2379" ]
redis: redis:
addr: "localhost:6379" addr: "127.0.0.1:6379"
password: "lQ7aM8oB6lK0iD5k" password: "lQ7aM8oB6lK0iD5k"
db: 0 db: 0
serve: serve:
grpc: grpc:
address: "10.0.40.199" address: "127.0.0.1"
port: 18500 port: 18500
ttl: 20 ttl: 20
socket: socket:

2
go.mod
View File

@@ -4,7 +4,7 @@ go 1.24.0
require ( require (
bou.ke/monkey v1.0.2 bou.ke/monkey v1.0.2
git.hlsq.asia/mmorpg/service-common v0.0.0-20260123132258-4d661d08134e git.hlsq.asia/mmorpg/service-common v0.0.0-20260130035320-5dc5391b07ed
github.com/alicebob/miniredis/v2 v2.35.0 github.com/alicebob/miniredis/v2 v2.35.0
github.com/gin-contrib/cors v1.7.6 github.com/gin-contrib/cors v1.7.6
github.com/gin-gonic/gin v1.11.0 github.com/gin-gonic/gin v1.11.0

4
go.sum
View File

@@ -2,8 +2,8 @@ bou.ke/monkey v1.0.2 h1:kWcnsrCNUatbxncxR/ThdYqbytgOIArtYWqcQLQzKLI=
bou.ke/monkey v1.0.2/go.mod h1:OqickVX3tNx6t33n1xvtTtu85YN5s6cKwVug+oHMaIA= bou.ke/monkey v1.0.2/go.mod h1:OqickVX3tNx6t33n1xvtTtu85YN5s6cKwVug+oHMaIA=
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
git.hlsq.asia/mmorpg/service-common v0.0.0-20260123132258-4d661d08134e h1:jcDwaL280D5BVGCfcIC3mQCjmwPz5fxX7NO1qf6nAIo= git.hlsq.asia/mmorpg/service-common v0.0.0-20260130035320-5dc5391b07ed h1:O08p0egfekFqQSnc4sfEJUTI5dGiEyiDRNW/VYa/Ce4=
git.hlsq.asia/mmorpg/service-common v0.0.0-20260123132258-4d661d08134e/go.mod h1:mMhZcumphj6gaVTppVYsMTkd+5HupmQgAc53Pd4MH9I= git.hlsq.asia/mmorpg/service-common v0.0.0-20260130035320-5dc5391b07ed/go.mod h1:mMhZcumphj6gaVTppVYsMTkd+5HupmQgAc53Pd4MH9I=
github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0= github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0=
github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/IBM/sarama v1.46.3 h1:njRsX6jNlnR+ClJ8XmkO+CM4unbrNr/2vB5KK6UA+IE= github.com/IBM/sarama v1.46.3 h1:njRsX6jNlnR+ClJ8XmkO+CM4unbrNr/2vB5KK6UA+IE=

View File

@@ -10,7 +10,7 @@ const (
ServiceStatusStopping // 停止中 ServiceStatusStopping // 停止中
) )
var GatewaySID string var GatewaySID int64
const ( const (
KeyGatewayAccessToken = "gateway:token:access:%v" KeyGatewayAccessToken = "gateway:token:access:%v"

View File

@@ -25,7 +25,7 @@ func (s *Server) ToClient(server grpc_pb.Gateway_ToClientServer) error {
if args, err := server.Recv(); err != nil { if args, err := server.Recv(); err != nil {
return return
} else { } else {
if args.USN == "" { if args.USN == -1 {
//utils.WorkerPool(ws_handler.UserMgr.GetAllInterface(), func(task interface{}) { //utils.WorkerPool(ws_handler.UserMgr.GetAllInterface(), func(task interface{}) {
// client := task.(*ws_handler.Client) // client := task.(*ws_handler.Client)

View File

@@ -24,7 +24,7 @@ type LoginReq struct {
} }
type LoginResp struct { type LoginResp struct {
USN string `json:"usn"` USN int64 `json:"usn"`
Name string `json:"name"` Name string `json:"name"`
AccessToken string `json:"accessToken"` AccessToken string `json:"accessToken"`
RefreshToken string `json:"refreshToken"` RefreshToken string `json:"refreshToken"`
@@ -43,7 +43,7 @@ func Login(c *gin.Context) {
return return
} }
usn, name := "", "" usn, name := int64(0), ""
if req.Phone != "" { if req.Phone != "" {
// TODO 校验验证码 // TODO 校验验证码
login, err := client.PhoneLogin(c, &grpc_pb.PhoneLoginReq{ login, err := client.PhoneLogin(c, &grpc_pb.PhoneLoginReq{
@@ -117,7 +117,7 @@ func RefreshToken(c *gin.Context) {
})) }))
} }
func genToken(ctx context.Context, usn string) (string, string, error) { func genToken(ctx context.Context, usn int64) (string, string, error) {
at, err := genTokenOne(ctx, global.KeyGatewayAccessToken, usn, time.Duration(config.Get().Auth.ShortExpire)*time.Minute) at, err := genTokenOne(ctx, global.KeyGatewayAccessToken, usn, time.Duration(config.Get().Auth.ShortExpire)*time.Minute)
if err != nil { if err != nil {
return "", "", err return "", "", err
@@ -129,7 +129,7 @@ func genToken(ctx context.Context, usn string) (string, string, error) {
return at, rt, nil return at, rt, nil
} }
func genTokenOne(ctx context.Context, key string, usn string, ttl time.Duration) (string, error) { func genTokenOne(ctx context.Context, key string, usn int64, ttl time.Duration) (string, error) {
token, err := utils.GenToken(usn, config.Get().Auth.Secret, ttl) token, err := utils.GenToken(usn, config.Get().Auth.Secret, ttl)
if err != nil { if err != nil {
return "", err return "", err

View File

@@ -22,14 +22,14 @@ type Client struct {
cancel context.CancelFunc // 取消上下文 cancel context.CancelFunc // 取消上下文
heartBeat time.Time // 最后一次心跳 heartBeat time.Time // 最后一次心跳
Status int32 // 状态0 登陆中 1 正常 2 离线 Status int32 // 状态0 登陆中 1 正常 2 离线
USN string // 用户ID USN int64 // 用户ID
SceneSID string // 场景服ID SceneSID int64 // 场景服ID
InstanceID int32 // 副本ID副本类型 InstanceID int32 // 副本ID副本类型
UniqueNo string // 副本唯一编号 UniqueNo int64 // 副本唯一编号
} }
func NewClient(usn string, conn socket.ISocketConn) *Client { func NewClient(usn int64, conn socket.ISocketConn) *Client {
client := &Client{ client := &Client{
USN: usn, USN: usn,
conn: conn, conn: conn,

View File

@@ -75,7 +75,7 @@ func (c *Client) onEnter(msg *ss_pb.C2S_EnterInstance) {
} }
func (c *Client) onLeave() { func (c *Client) onLeave() {
if c.SceneSID == "" { if c.SceneSID == 0 {
return return
} }
client, err := grpc_client.SceneNewClient(c.SceneSID) client, err := grpc_client.SceneNewClient(c.SceneSID)
@@ -94,7 +94,7 @@ func (c *Client) onLeave() {
} }
func (c *Client) onAction(msg *ss_pb.C2S_Action) { func (c *Client) onAction(msg *ss_pb.C2S_Action) {
if c.SceneSID == "" { if c.SceneSID == 0 {
return return
} }
if err := grpc_client.SendMessageToScene(c.SceneSID, grpc_client.FunAction, &grpc_pb.ActionReq{ if err := grpc_client.SendMessageToScene(c.SceneSID, grpc_client.FunAction, &grpc_pb.ActionReq{

View File

@@ -8,35 +8,35 @@ import (
var UserMgr *userManager var UserMgr *userManager
type userManager struct { type userManager struct {
userMap map[string]*Client userMap map[int64]*Client
sync.RWMutex sync.RWMutex
} }
func init() { func init() {
UserMgr = &userManager{ UserMgr = &userManager{
userMap: make(map[string]*Client), userMap: make(map[int64]*Client),
} }
} }
func (m *userManager) Add(usn string, client *Client) { func (m *userManager) Add(usn int64, client *Client) {
m.Lock() m.Lock()
defer m.Unlock() defer m.Unlock()
m.userMap[usn] = client m.userMap[usn] = client
global.OnlineUsersGauge.Inc() global.OnlineUsersGauge.Inc()
} }
func (m *userManager) Delete(usn string) { func (m *userManager) Delete(usn int64) {
m.Lock() m.Lock()
defer m.Unlock() defer m.Unlock()
delete(m.userMap, usn) delete(m.userMap, usn)
global.OnlineUsersGauge.Dec() global.OnlineUsersGauge.Dec()
} }
func (m *userManager) GetAll() map[string]*Client { func (m *userManager) GetAll() map[int64]*Client {
m.RLock() m.RLock()
defer m.RUnlock() defer m.RUnlock()
copyMap := make(map[string]*Client, len(m.userMap)) copyMap := make(map[int64]*Client, len(m.userMap))
for k, v := range m.userMap { for k, v := range m.userMap {
copyMap[k] = v copyMap[k] = v
} }
@@ -54,7 +54,7 @@ func (m *userManager) GetAllInterface() []interface{} {
return r return r
} }
func (m *userManager) GetByUSN(usn string) *Client { func (m *userManager) GetByUSN(usn int64) *Client {
m.RLock() m.RLock()
defer m.RUnlock() defer m.RUnlock()
return m.userMap[usn] return m.userMap[usn]

View File

@@ -161,7 +161,7 @@ func (l *Login) CheckOnline(user *User) string {
} }
// KickUser 把玩家踢下线 // KickUser 把玩家踢下线
func (l *Login) KickUser(gatewaySID string, usn string) bool { func (l *Login) KickUser(gatewaySID int64, usn int64) bool {
gc, err := grpc_client.GatewayNewClient(gatewaySID) gc, err := grpc_client.GatewayNewClient(gatewaySID)
if err != nil { if err != nil {
log.Errorf("KickUser cannot find gateway client: %v, sid: %v", err, gatewaySID) log.Errorf("KickUser cannot find gateway client: %v, sid: %v", err, gatewaySID)

View File

@@ -78,7 +78,7 @@ func (q *QueueUp) Dequeue() (*client.Client, error) {
} }
// GetPosition 返回用户前面还有多少人在排队 // GetPosition 返回用户前面还有多少人在排队
func (q *QueueUp) GetPosition(usn string) (int64, bool) { func (q *QueueUp) GetPosition(usn int64) (int64, bool) {
val, ok := q.waiting.Load(usn) val, ok := q.waiting.Load(usn)
if !ok { if !ok {
return 0, false return 0, false
@@ -88,7 +88,7 @@ func (q *QueueUp) GetPosition(usn string) (int64, bool) {
} }
// RemoveUser 安全移除用户(标记为取消) // RemoveUser 安全移除用户(标记为取消)
func (q *QueueUp) RemoveUser(usn string) bool { func (q *QueueUp) RemoveUser(usn int64) bool {
_, loaded := q.waiting.LoadAndDelete(usn) _, loaded := q.waiting.LoadAndDelete(usn)
return loaded return loaded
} }

View File

@@ -71,7 +71,7 @@ func authJwt() gin.HandlerFunc {
} }
// 这里将Header写到请求中grpc-gateway框架会读取然后传给grpc服务 // 这里将Header写到请求中grpc-gateway框架会读取然后传给grpc服务
c.Request.Header.Set("X-Usn", claims.USN) c.Request.Header.Set("X-Usn", utils.Int64ToString(claims.USN))
// 这里写到上下文中,打日志 // 这里写到上下文中,打日志
c.Set("usn", claims.USN) c.Set("usn", claims.USN)
c.Next() c.Next()

View File

@@ -14,6 +14,7 @@ import (
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime" "github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
"go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin" "go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin"
"google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/encoding/protojson"
"strings"
) )
func InitServeMux() *runtime.ServeMux { func InitServeMux() *runtime.ServeMux {
@@ -49,7 +50,13 @@ func InitRouter() *gin.Engine {
gin.Recovery(), gin.Recovery(),
ginLogger(log.GetLogger().Named("GIN")), ginLogger(log.GetLogger().Named("GIN")),
cors.New(corsConfig()), cors.New(corsConfig()),
otelgin.Middleware(common.KeyDiscoverServiceNameGateway), otelgin.Middleware(
common.KeyDiscoverServiceNameGateway,
otelgin.WithSpanNameFormatter(func(c *gin.Context) string {
method := strings.ToUpper(c.Request.Method)
return method + " " + c.Request.URL.Path
}),
),
) )
r.HandleMethodNotAllowed = true r.HandleMethodNotAllowed = true

View File

@@ -44,7 +44,7 @@ func (g *GatewayWsServer) OnHandShake(conn socket.ISocketConn) socket.Action {
func (g *GatewayWsServer) OnMessage(conn socket.ISocketConn, bytes []byte) socket.Action { func (g *GatewayWsServer) OnMessage(conn socket.ISocketConn, bytes []byte) socket.Action {
cli, ok := conn.GetParam("client").(*client.Client) cli, ok := conn.GetParam("client").(*client.Client)
if !ok || cli.USN == "" || cli.Status != 1 { if !ok || cli.USN == 0 || cli.Status != 1 {
return socket.Close return socket.Close
} }
cli.OnEvent(&client.ClientEvent{Msg: bytes}) cli.OnEvent(&client.ClientEvent{Msg: bytes})
@@ -53,7 +53,7 @@ func (g *GatewayWsServer) OnMessage(conn socket.ISocketConn, bytes []byte) socke
func (g *GatewayWsServer) OnPong(conn socket.ISocketConn) { func (g *GatewayWsServer) OnPong(conn socket.ISocketConn) {
cli, ok := conn.GetParam("client").(*client.Client) cli, ok := conn.GetParam("client").(*client.Client)
if !ok || cli.USN == "" { if !ok || cli.USN == 0 {
return return
} }
cli.OnEvent(&client.PongEvent{}) cli.OnEvent(&client.PongEvent{})