Code Monkey home page Code Monkey logo

due's People

Contributors

dobyte avatar hello999gif avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

due's Issues

tcp客户端连续发送消息时服务端收到错误信息

客户端发送
err2 := r.Proxy().Push(3, route.UploadUserPosition, &pb.PlayerPositionUploadReq{
UserId: msg.GetUserId(),
Data: &pb.PositionData{
Pos: &pb.Vector3{
X: 4,
Y: 3,
Z: 2,
},
Rotation: &pb.Vector3{
X: 4,
Y: 3,
Z: 2,
},
Speed: &pb.Vector3{
X: 4,
Y: 3,
Z: 2,
},
},
})
if err2 != nil {
log.Errorf("upload player position error: %v", err2)
}

err4 := r.Proxy().Push(4, route.UploadUserPosition, &pb.PlayerPositionUploadReq{
	UserId: msg.GetUserId(),
	Data: &pb.PositionData{
		Pos: &pb.Vector3{
			X: 1,
			Y: 1,
			Z: 1,
		},
		Rotation:  &pb.Vector3{
			X: 1,
			Y: 1,
			Z: 1,
		},
		Speed:  &pb.Vector3{
			X: 4,
			Y: 3,
			Z: 2,
		},
	},
})
if err4 != nil {
	log.Errorf("upload player position error: %v", err4)
}


err4 = r.Proxy().Push(5, route.UploadUserPosition, &pb.PlayerPositionUploadReq{
	UserId: msg.GetUserId(),
	Data: &pb.PositionData{
		Pos: &pb.Vector3{
			X: 3,
			Y: 3,
			Z: 3,
		},
		Rotation:  &pb.Vector3{
			X: 3,
			Y: 3,
			Z: 4,
		},
		Speed:  &pb.Vector3{
			X: 4,
			Y: 3,
			Z: 2,
		},
	},
})
if err4 != nil {
	log.Errorf("upload player position error: %v", err4)
}


err4 = r.Proxy().Push(6, route.UploadUserPosition, &pb.PlayerPositionUploadReq{
	UserId: msg.GetUserId(),
	Data: &pb.PositionData{
		Pos: &pb.Vector3{
			X: 6,
			Y: 7,
			Z: 8,
		},
		Rotation:  &pb.Vector3{
			X: 23,
			Y: 32,
			Z: 24,
		},
		Speed:  &pb.Vector3{
			X: 4,
			Y: 3,
			Z: 2,
		},
	},
})
if err4 != nil {
	log.Errorf("upload player position error: %v", err4)
}

err4 = r.Proxy().Push(7, route.UploadUserPosition, &pb.PlayerPositionUploadReq{
	UserId: msg.GetUserId(),
	Data: &pb.PositionData{
		Pos: &pb.Vector3{
			X: 16,
			Y: 27,
			Z: 18,
		},
		Rotation:  &pb.Vector3{
			X: 3,
			Y: 3,
			Z: 2,
		},
		Speed:  &pb.Vector3{
			X: 4,
			Y: 3,
			Z: 2,
		},
	},
})
if err4 != nil {
	log.Errorf("upload player position error: %v", err4)
}

gate服务节点接收
get unpack, seq[4], route[30] , msg[12330a0f0d0000803f150000803f1d0000803f120f0d0000803f150000803f1d0000803f1a0f0d0000804015000040401d00000040]

get unpack, seq[5], route[30] , msg[12330a0f0d0000404015000040401d00004040120f0d0000404015000040401d000080401a0f0d0000804015000040401d00000040]

get unpack, seq[6], route[30] , msg[12330a0f0d0000c040150000e0401d00000041120f0d0000b84115000000421d0000c0411a0f0d0000804015000040401d00000040]

get unpack, seq[7], route[30] , msg[12330a0f0d0000c040150000e0401d00000041120f0d0000b84115000000421d0000c0411a0f0d0000804015000040401d00000040]

get unpack, seq[7], route[30] , msg[12330a0f0d00008041150000d8411d00009041120f0d0000404015000040401d000000401a0f0d0000804015000040401d00000040]

seq3少了,seq7多了一条
把pb消息换成别的pb消息也是一样
但是在发送消息之间增加一个time.sleep延时就正常了

Middleware调用顺序

版本:v2
问题:使用Middleware时,会在Middleware调用栈全部结束之后才调用业务逻辑,希望能在Middleware栈最深处就调用业务。

n.Proxy().Router().Group(func(group *node.RouterGroup) {
		group.Middleware(middleware.RecordMetric1)
		group.Middleware(middleware.RecordMetric2)
		group.AddRouteHandler(int32(pb_lobby.ROUTE_Echo1), false, EchoHandler)
})

// RecordMetric1 指标
func RecordMetric1(ctx *node.Context) {
	logger.Info("RecordMetric1 in")
	start := time.Now()
	ctx.Middleware.Next(ctx)

	logger.Info("RecordMetric1 out", time.Since(start))
}

// RecordMetric2 指标
func RecordMetric2(ctx *node.Context) {
	logger.Info("RecordMetric2 in")
	start := time.Now()
	ctx.Middleware.Next(ctx)

	logger.Info("RecordMetric2 out", time.Since(start))
} 

func EchoHandler(ctx *node.Context) {
	logger.Info("EchoHandler in")
	time.Sleep(2 * time.Second)
	logger.Info("EchoHandler out")
}

得到的日志
 [RecordMetric1 in]
 [RecordMetric2 in]
 [RecordMetric2 out 128ns]
 [RecordMetric1 out 121.798µs]
 [EchoHandler in]
 [EchoHandler out]

期望得到
 [RecordMetric1 in]
 [RecordMetric2 in]
 [EchoHandler in]
 [EchoHandler out]
 [RecordMetric2 out 128ns]
 [RecordMetric1 out 121.798µs]

我在本地修改以下代码可以实现

  1. cluster/node/middleware.go
 type Middleware struct {
	index        int
	middlewares  []MiddlewareHandler
+	routeHandler RouteHandler
 }

 // 重置中间件
-func (m *Middleware) reset(middlewares []MiddlewareHandler) {
+func (m *Middleware) reset(middlewares []MiddlewareHandler, routeHandler RouteHandler) {
 	m.index = -1
 	m.middlewares = middlewares
+	m.routeHandler = routeHandler
 }

func (m *Middleware) Skip(ctx *Context, skip int) {
	m.index += skip
	if m.isFinished() {
+		m.routeHandler(ctx)
		return
	}

  1. cluster/node/router.go
 	if ok {
 		if len(route.middlewares) > 0 {
-			ctx.Middleware.reset(route.middlewares)
+			ctx.Middleware.reset(route.middlewares, route.handler)
 			ctx.Middleware.Next(ctx)
-
-			if ctx.Middleware.isFinished() {
-				route.handler(ctx)
-			}
 		} else {

随机端口如何在docker容器中映射?

server.NewServer() 用到了 xnet.ParseAddr() , 用到了随机端口。
我想问:如果我将项目打包成docker镜像,容器化运行时,如何映射容器与宿主机的端口?

讨论组

你好,请问有没对于这个框架讨论的QQ或者微信群? 对这个项目挺有兴趣的

增加通用错误

现在如果要返回错误码给客户端似乎需要在每个pb message里面定义,是否可以在packet的head里面定一个1个bit(和心跳包类似),表示错误返回,里面带上code。这样可以在gate,或者任意一个node给客户端返回了。

7 个优化建议

嗨。这是我在学习 due 的过程中发现的一些小问题(有一些可能并不是问题)

截图可能比较大,需要点开来查看,因为我想提供更完整的追踪线索。(🤔 我怎么不使用 github 的代码链接?因为我截图完了才想起这个功能更方便您查看对应的代码,下次一定)

1. cluster/node/context.go 中的 Context 注释应该是:获取上下文

image

2. cluster/node/node.go 中的 setState,n.instance 的判断可以提前返回

修改前:
image

修改后:

if n.instance == nil {
  return
}
...

3. transport/grpc/node/server.go 中的 NewServer 错误判断是否是多余的?

修改前:
image

修改后:
image

4. locate/redis/watcher 中的 newWatcherMgr 函数中,go 协程中的错误并没有做任何处理

image

5. locate/redis/watcher 的 Next 方法中的 state 添加枚举值或注释

image

6. internal/dispatcher/dispatcher.go 中的 ReplaceServices 方法,释放锁可以使用 defer。但我不确定这么做的目的是否是为了缩小锁的临界区?

image

7. transport/grpc/internal/resolver/direct/builder.go 中的 Build 方法中,err 可以缩小作用域

修改前:
image

修改后:
image

3 questions about annotations, naming, and protocols

  1. due/network/ws/server.go 中,为什么除了 GET 请求会被升级,其余的都会抛出 405 的错误?
    通常 HTTP GET 请求是获取资源的请求,也就是只读请求,但是 Websocket 是双向通信协议呀。
    image

  2. ws 和 tcp 的 server_conn_mgr.go 中的结构体 connMgr(ws/server_conn_mgr.go)和 serverConnMgr 结构体(tcp/server_conn_mgr.go)是否可以统一命名?

  3. due/network/ws/client_conn.go 中的 clientConn 结构体中的 conn 字段注解有误。
    image

我想确认 2 和 3 是否修改后,会让 Due 变得更好(或者这样做是否对)?得到答复后,我很乐意修改它们并提交 pr。

期待你的回复 :-)

v0.0.11版本需求收集

  • 节点间RPC实现
  • 节点动态负载均衡策略(网关根据节点状态,动态调配无状态路由消息的投递策略)
  • Kafka事件总线实现

引入go workspaces

This file is in F:\due\transport\grpc, which is a nested module in the F:\due\go.mod module.
To work on multiple modules at once, please use a go.work file.
See https://github.com/golang/tools/blob/master/gopls/doc/workspace.md for more information on using workspaces.

我看到项目中报了这个错误, 是否考虑引入go.work 工作空间来进行多模块化,让ide 可以更友好的识别

Gate 组件偶发的报错

作者您好,我在使用 Gate 组件时,从 WS 连接读取消息,偶尔会产生如下报错信息:

read message failed: 5 read tcp [10.0.4.3:3553](http://10.0.4.3:3553/)->[171.216.69.26:5632](http://171.216.69.26:5632/): read: connection reset by peer

websocket upgrade error: websocket: the client is not using the websocket protocol: 'upgrade' token not found in 'Connection' header

偶尔会出现这种情况,重启一下就好了

windows系统下无"syscall.SIGUSR1, syscall.SIGUSR2"信号,无法通过编译

如题,windows系统下无"syscall.SIGUSR1, syscall.SIGUSR2"信号,无法通过编译,源代码:container.go:41

// Serve 启动容器
func (c *Container) Serve() {
       // ...
	signal.Notify(c.sig, syscall.SIGHUP, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGKILL, syscall.SIGTERM, syscall.SIGUSR1, syscall.SIGUSR2)
      // ...
}

是否可在监听信号前通过runtime.GOOS判断当前系统以适配?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.