From 5a1067aaa4b119fb7c436bcec3510a7fe01db8cf Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Sun, 12 May 2024 19:53:29 +0800 Subject: [PATCH] =?UTF-8?q?other:=20v2=20rpc=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rpc/rpc2/client.go | 10 ++++++ rpc/rpc2/codec.go | 10 ++++++ rpc/rpc2/context.go | 13 +++++++ rpc/rpc2/message.go | 10 ++++++ rpc/rpc2/router.go | 16 +++++++++ vivid/actor_id.go | 2 +- vivid/actor_id_benchmark_test.go | 60 ++++++++++++++++++++++++++++++++ 7 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 rpc/rpc2/client.go create mode 100644 rpc/rpc2/codec.go create mode 100644 rpc/rpc2/context.go create mode 100644 rpc/rpc2/message.go create mode 100644 rpc/rpc2/router.go diff --git a/rpc/rpc2/client.go b/rpc/rpc2/client.go new file mode 100644 index 0000000..55f1eab --- /dev/null +++ b/rpc/rpc2/client.go @@ -0,0 +1,10 @@ +package rpc + +// Client 是一个 RPC 客户端的接口,该接口用于定义一个 RPC 客户端,用于发起 RPC 调用 +type Client interface { + // Tell 用于向指定的服务发起一个 RPC 调用,该调用不需要返回值 + Tell(route Route, data any) error + + // Ask 用于向指定的服务发起一个 RPC 调用,该调用需要返回值 + Ask(route Route, data any) (Context, error) +} diff --git a/rpc/rpc2/codec.go b/rpc/rpc2/codec.go new file mode 100644 index 0000000..1aafcaa --- /dev/null +++ b/rpc/rpc2/codec.go @@ -0,0 +1,10 @@ +package rpc + +// Codec 是一个 RPC 编解码器的接口,该接口用于定义一个 RPC 编解码器,用于在 RPC 调用过程中对数据进行编解码 +type Codec interface { + // Encode 用于对数据进行编码 + Encode(data any) ([]byte, error) + + // Decode 用于对数据进行解码 + Decode(data []byte, dst any) error +} diff --git a/rpc/rpc2/context.go b/rpc/rpc2/context.go new file mode 100644 index 0000000..84ffc3b --- /dev/null +++ b/rpc/rpc2/context.go @@ -0,0 +1,13 @@ +package rpc + +// Context 是一个 RPC 调用上下文的接口,该接口用于在 RPC 调用过程中传递上下文信息 +type Context interface { + // ReadTo 对于被调用方,ReadTo 方法用于将上下文信息读取到指定的结构体中 + ReadTo(dst any) error + + // MustReadTo 对于被调用方,MustReadTo 方法用于将上下文信息读取到指定的结构体中,如果读取失败则会 panic + MustReadTo(dst any) + + // Write 对于调用方,Write 方法用于将上下文信息写入到上下文中 + Write(src any) error +} diff --git a/rpc/rpc2/message.go b/rpc/rpc2/message.go new file mode 100644 index 0000000..5527b18 --- /dev/null +++ b/rpc/rpc2/message.go @@ -0,0 +1,10 @@ +package rpc + +// Message 是一个 RPC 消息的接口,该接口用于定义一个 RPC 消息,用于在 RPC 调用过程中传递 +type Message interface { + // GetRoute 用于获取消息的路由 + GetRoute() Route + + // GetBytes 用于获取消息的字节数据 + GetBytes() []byte +} diff --git a/rpc/rpc2/router.go b/rpc/rpc2/router.go new file mode 100644 index 0000000..c593045 --- /dev/null +++ b/rpc/rpc2/router.go @@ -0,0 +1,16 @@ +package rpc + +// Route 是一个 RPC 路由的接口,该接口用于定义一个 RPC 路由 +type Route = string + +// RouteHandler 是一个 RPC 路由处理器的类型,该类型用于定义一个 RPC 路由处理器 +type RouteHandler func(ctx Context) + +// Router 是 RPC 路由器的接口,该接口被用于 RPC 服务路由的注册及调用路由的匹配 +type Router interface { + // Register 用于注册一个 RPC 服务路由,当存在相同路由时会发生 panic + Register(route Route, handler RouteHandler) + + // Match 用于根据 RPC 服务名匹配对应的路由处理器,如果找到则返回对应的处理器,否则返回 nil + Match(route Route) RouteHandler +} diff --git a/vivid/actor_id.go b/vivid/actor_id.go index e30cf3e..2aa889a 100644 --- a/vivid/actor_id.go +++ b/vivid/actor_id.go @@ -101,5 +101,5 @@ func (i ActorId) IsZero() bool { // String 返回 ActorId 的字符串表示。 func (i ActorId) String() string { - return fmt.Sprintf("%s:%d:%d", i.Host(), i.Port(), i.Guid()) + return fmt.Sprintf("%s:%d:%s:%d", i.Host(), i.Port(), i.SystemName(), i.Guid()) } diff --git a/vivid/actor_id_benchmark_test.go b/vivid/actor_id_benchmark_test.go index 281d59d..7860e4b 100644 --- a/vivid/actor_id_benchmark_test.go +++ b/vivid/actor_id_benchmark_test.go @@ -5,8 +5,68 @@ import ( "testing" ) +func BenchmarkActorId(b *testing.B) { + id := vivid.NewActorId("127.0.0.1", 8080, "Connection", 1) + b.Run("Generate", func(b *testing.B) { + for i := 0; i < b.N; i++ { + vivid.NewActorId("127.0.0.1", 8080, "Connection", 1) + } + }) + + b.Run("GetHost", func(b *testing.B) { + for i := 0; i < b.N; i++ { + id.Host() + } + }) + + b.Run("GetPort", func(b *testing.B) { + for i := 0; i < b.N; i++ { + id.Port() + } + }) + + b.Run("GetSystemName", func(b *testing.B) { + for i := 0; i < b.N; i++ { + id.SystemName() + } + }) + + b.Run("GetGuid", func(b *testing.B) { + for i := 0; i < b.N; i++ { + id.Guid() + } + }) +} + func BenchmarkNewActorId(b *testing.B) { for i := range uint64(b.N) { vivid.NewActorId("127.0.0.1", 8080, "Connection", i) } } + +func BenchmarkActorId_Get(b *testing.B) { + id := vivid.NewActorId("127.0.0.1", 8080, "Connection", 1) + b.Run("GetHost", func(b *testing.B) { + for i := 0; i < b.N; i++ { + id.Host() + } + }) + + b.Run("GetPort", func(b *testing.B) { + for i := 0; i < b.N; i++ { + id.Port() + } + }) + + b.Run("GetSystemName", func(b *testing.B) { + for i := 0; i < b.N; i++ { + id.SystemName() + } + }) + + b.Run("GetGuid", func(b *testing.B) { + for i := 0; i < b.N; i++ { + id.Guid() + } + }) +}