Skip to content

Commit

Permalink
Merge pull request #21 from pwnsky/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
i0gan authored Sep 29, 2023
2 parents 4a8f153 + 7e28112 commit d7f08ac
Show file tree
Hide file tree
Showing 464 changed files with 103,741 additions and 7,755 deletions.
49 changes: 34 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@

近年来,随着互联网飞速发展,元宇宙引发了全球科技产业的高度关注和投资热潮,在这个元宇宙技术的领域里,服务端技术的高低决定了元宇宙发展的成熟度,一个高度可扩展、高性能、高可用的服务端框架用以支持元宇宙应用程序的开发和部署是本次研究的方向。pwnsky团队提出了一种面向元宇宙的分布式服务器框架设计与实现方法,为构建高性能、可扩展的元宇宙系统提供了理论基础和技术支持。通过对需求和特点进行了深入分析,本文明确了分布式服务端框架的设计目标和相关技术。用 C++和 Lua 语言共同编写此框架,将框架拆分成了内核层、节点层和业务层,提升程序的拓展性和可维护性。将业务功能拆分到不同节点上运行,以实现不同功能的解耦和资源的高效利用,利用动态负载均衡算法,可以在不同节点之间有效地分配任务,确保系统的稳定性和性能。最后,采用科学的方式对框架进行测试且给相应的实验数据,并将该框架运用在某商业项目中,也对所做的内容进行了总结和展望。

**Unity SDK: ** [squick-unity-sdk](https://github.com/pwnsky/squick-unity-sdk)
**Unity SDK**: [squick-unity-sdk](https://github.com/pwnsky/squick-unity-sdk)

**Unreal SDK: **[squick-unreal-sdk](https://github.com/pwnsky/squick-unreal-sdk)
**Unreal SDK**: [squick-unreal-sdk](https://github.com/pwnsky/squick-unreal-sdk)

**后台: ** [squick-mid](https://github.com/pwnsky/squick-mid)
**后台**: [squick-mid](https://github.com/pwnsky/squick-mid)

**讨论QQ群:739065686**

**version:** 1.0.0
**version:** 1.0.3

---

Expand Down Expand Up @@ -43,17 +43,17 @@
8. 日志系统,能够将日志异步写入到文件里,且在 Linux 环境下程序崩溃时,自动 Dump Stack 调用链写入崩溃文件 【100%】
9. 分布式服务,各服务之间通过网络来进行沟通,可通过分布式+集群方式减轻服务器压力 【50%】
10. 支持业务代码的热更新 【50%】
11. 支持主流的 Mysql、MongoDb、Redis 等数据库 【80%】
12. 支持跨平台,可以在 Windows、Linux 上编译和开发,在 Windows 上可以支持 VS 进行项目开发【100%】
13. 支持 1 变 N 或 N 变 1,一个物理机上单个进程启动全部服务器,方便开发调试。不同物理机上启动单个或多个服务器 【100%】
14. 拥有比较完整的自动化工具,如自动化代码生成、编译、打包、部署、清理等等 【80%】
15. 支持主流的协议,如 HTTP/HTTPS、Websocket、TCP、UDP、KCP 等等 【60%】
16. 为了保证包的正确处理与不丢失,基于 TCP 之上,自定义双向 RPC 协议 【100%】
17. 可视化的抓协议包工具【0%】
18. 远程调试控制台【0%】
19. 数据库Lua接口提供【0%】
20. 统一的数据库代理存取数据命令,使用简单协议能够便捷切换使用Mysql、Redis、MongoDb数据库 【10%】
21. Unity、UnrealEngine客户端SDK完善【50%】
11. 支持跨平台,可以在 Windows、Linux 上编译和开发,在 Windows 上可以支持 VS 进行项目开发【100%】
12. 支持 1 变 N 或 N 变 1,一个物理机上单个进程启动全部服务器,方便开发调试。不同物理机上启动单个或多个服务器 【100%】
13. 拥有比较完整的自动化工具,如自动化代码生成、编译、打包、部署、清理等等 【80%】
14. 支持主流的协议,如 HTTP/HTTPS、Websocket、TCP、UDP、KCP 等等 【60%】
15. 为了保证包的正确处理与不丢失,基于 TCP 之上,自定义双向 RPC 协议 【100%】
16. 可视化的抓协议包工具【0%】
17. 远程调试控制台【0%】
18. 数据库Lua接口提供【0%】
19. 统一的数据库代理存取数据命令,使用简单协议能够便捷切换使用Mysql、Redis、MongoDb数据库 【10%】
20. Unity、UnrealEngine客户端SDK完善【50%】
21. 高可用-数据库代理服务器,支持主流的 Mysql、MongoDb、Redis 、Clickhouse等数据库,采用proto协议进行交互,Lua协程异步读取【30%】

## 测试

Expand Down Expand Up @@ -409,6 +409,25 @@ docker run -d --restart always --name squick_db_redis_1 -p 10420:6379 redis:7.0



### 搭建Clickhouse日志数据库

负责记录服务器日志、游戏日志、埋点数据等。

```
docker run -d --restart always --name squick_db_clickhouse_1 -p 10430:8123 -p 10431:9000 -p 10432:9009 clickhouse/clickhouse-server:23.1.3.5-alpine
```

创建之后进入容器

```
vi /etc/clickhouse-server/users.xml
# 找到 <password></password>
# 在中间增加 pwnsky_squick
```



## 生成配置文件

采用Office软件打开{project_path}/resource/excel/server/DB.xlsx,修改里面的IP为你搭建的数据库ip,默认为127.0.0.1。修改完毕之后,需要重新生产配置文件,需执行一个脚本进行生成。linux执行如下:
Expand Down
6 changes: 3 additions & 3 deletions config/plugin/db_proxy.xml
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
<XML>
<DbProxy>
<DbProxy>
<Plugin Name="core/net" />
<Plugin Name="core/kernel" />
<Plugin Name="core/config" />
<Plugin Name="core/log" />
<Plugin Name="core/redis" />

<Plugin Name="node/db_proxy/node" />
<Plugin Name="node/db_proxy/logic" />
<Plugin Name="node/db_proxy/mysql" />
<Plugin Name="node/db_proxy/mongo" />
<Plugin Name="node/db_proxy/redis" />
<Plugin Name="node/db_proxy/clickhouse" />
</DbProxy>
</XML>
4 changes: 2 additions & 2 deletions config/plugin/game_mgr.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<XML>
<GameplayManager>
<GameMgr>
<Plugin Name="core/net" />
<Plugin Name="core/kernel" />
<Plugin Name="core/config" />
Expand All @@ -8,5 +8,5 @@
<Plugin Name="node/game_mgr/node" />
<Plugin Name="node/game_mgr/logic" />
<Plugin Name="node/game_mgr/play" />
</GameplayManager>
</GameMgr>
</XML>
4 changes: 2 additions & 2 deletions config/plugin/lobby.xml
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
<XML>
<GameServer>
<Lobby>
<Plugin Name="core/net" />
<Plugin Name="core/kernel" />
<Plugin Name="core/config" />
<Plugin Name="core/log" />
<Plugin Name="core/lua" />

<Plugin Name="node/lobby/node" />
</GameServer>
</Lobby>
</XML>
4 changes: 2 additions & 2 deletions config/plugin/login.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<XML>
<LoginServer>
<Login>
<Plugin Name="core/net" />
<Plugin Name="core/kernel" />
<Plugin Name="core/config" />
Expand All @@ -11,6 +11,6 @@
<Plugin Name="node/login/http" />
<Plugin Name="node/login/redis" />
<Plugin Name="node/login/mysql" />
</LoginServer>
</Login>

</XML>
4 changes: 2 additions & 2 deletions config/plugin/master.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<XML>
<MasterServer>
<Master>
<Plugin Name="core/net" />
<Plugin Name="core/kernel" />
<Plugin Name="core/config" />
Expand All @@ -9,5 +9,5 @@
<Plugin Name="node/master/node" />
<Plugin Name="node/master/http" />

</MasterServer>
</Master>
</XML>
4 changes: 2 additions & 2 deletions config/plugin/test.xml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
<XML>
<GameServer>
<Test>
<Plugin Name="core/log" />
<Plugin Name="core/net" />
<Plugin Name="core/kernel" />
<Plugin Name="core/nosql" />
<Plugin Name="core/config" />
</GameServer>
</Test>
</XML>
5 changes: 2 additions & 3 deletions config/plugin/world.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<XML>
<WorldServer>
<World>
<Plugin Name="core/net" />
<Plugin Name="core/kernel" />
<Plugin Name="core/config" />
Expand All @@ -9,6 +9,5 @@

<Plugin Name="node/world/node" />
<Plugin Name="node/world/logic" />

</WorldServer>
</World>
</XML>
Binary file modified resource/excel/DB.xlsx
Binary file not shown.
1 change: 1 addition & 0 deletions resource/script/multi_start.bat
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ start cmd /c " squick type=master id=1 "
start cmd /c " squick type=login id=2 "
start cmd /c " squick type=world id=100 "
start cmd /c " squick type=db_proxy id=300 "
start cmd /c " squick type=db_proxy id=301 "
start cmd /c " squick type=game id=1000 "
start cmd /c " squick type=game id=1001 "
start cmd /c " squick type=game_mgr id=2000 "
Expand Down
16 changes: 12 additions & 4 deletions src/lua/common/net.lua
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ function Net:Register(msg_id, this, func)
Squick:AddMsgCallBackAsServer(msg_id, this, func)
end

-- function func(guid, msg_data)
function Net:ClientRegister(msg_id, this, func)

-- function func(guid, msg_data, msg_id, fd)
function Net:ClientRegister(server_type, msg_id, this, func)
Squick:AddMsgCallBackAsClient(server_type, msg_id, this, func)
end

function Net:SendByFD(fd, msg_id, msg_data, guid)
Expand All @@ -25,4 +25,12 @@ end

function Net:SendToPlayer(msg_id)

end
end

function Net:SendToServer(server_id, msg_id, msg_data, guid)
Squick:SendToServerByServerID(server_id, msg_id, msg_data, guid)
end

function Net:SendToServers(server_type, msg_id, msg_data, guid)
Squick:SendToAllServerByServerType(server_type, msg_id, msg_data, guid)
end
File renamed without changes.
10 changes: 10 additions & 0 deletions src/lua/lib/db/init.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
-----------------------------------------------------------------------------
-- Author: i0gan
-- Email : [email protected]
-- Date : 2023-09-24
-- Description: db init
-----------------------------------------------------------------------------
require "lib.db.redis"
require "lib.db.mysql"
require "lib.db.mongo"
require "lib.db.clickhouse"
File renamed without changes.
Empty file added src/lua/lib/db/mysql.lua
Empty file.
46 changes: 46 additions & 0 deletions src/lua/lib/db/redis.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
-----------------------------------------------------------------------------
-- Author: i0gan
-- Email : [email protected]
-- Date : 2023-09-24
-- Github: https://github.com/pwnsky/squick
-- Description: async redis cli
-----------------------------------------------------------------------------

RedisServerID = 300;

Redis = {
query_id = 0;
co = {}
}

function Blank()

end

function Redis:Bind()
Net:ClientRegister(ServerType.ST_DB_PROXY, DbProxyRPC.ACK_REDIS_GET, self, self.AckGet)
end

function Redis:Get(co, key)
local req = {
query_id = self.query_id,
key = key,
}
self.co[self.query_id] = co;
Net:SendToServer(RedisServerID, DbProxyRPC.REQ_REDIS_GET, Squick:Encode("rpc.ReqRedisGet", req), "lobby")
local result = coroutine.yield()
self.query_id = self.query_id + 1 % 1000000;
return result.value
end

function Redis:AckGet(guid, msg_data, msg_id, fd)
local data = Squick:Decode("rpc.AckRedisGet", msg_data);
local co = self.co[data.query_id]
coroutine.resume(co, data)
end

function Redis:Set()

end

Redis:Bind();
7 changes: 7 additions & 0 deletions src/lua/lib/init.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
-----------------------------------------------------------------------------
-- Author: i0gan
-- Email : [email protected]
-- Date : 2023-09-24
-- Description: lib init
-----------------------------------------------------------------------------
require "lib.db.init"
1 change: 1 addition & 0 deletions src/lua/main.lua
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ function Load()
Require("common.init");
Require("proto.init");
Require("test.init");
Require("lib.init");
local node_init = {
[ServerType.ST_GAME ] = function()
Require("node.game.init");
Expand Down
70 changes: 38 additions & 32 deletions src/lua/node/lobby/player_mgr.lua
Original file line number Diff line number Diff line change
@@ -1,47 +1,54 @@
local PlayerMgr = Module

function PlayerMgr:Start()
print("PlayerMgr Start")
Net:Register(PlayerEventRPC.PLAYER_ENTER_EVENT, self, self.OnEnter)
Net:Register(PlayerRPC.REQ_PLAYER_DATA, self, self.OnReqPlayerData)
end

function PlayerMgr:Update()

end

function PlayerMgr:Destroy()

end

function PlayerMgr:OnEnter(player_id, msg_data, msg_id, fd)
print("Player Enter")
local data = Squick:Decode("rpc.PlayerEnterEvent", msg_data);
PrintTable(data)

-- 查找玩家是否存在
local co = coroutine.create(function(player_id, msg_data, msg_id, fd)
local co = coroutine.running();
print("Player Enter")
local data = Squick:Decode("rpc.PlayerEnterEvent", msg_data);
PrintTable(data)

-- Check player is exsited

local account_id = data.account_id -- Account GUID
local player_id = "player_" .. data.account_id -- Player GUID
-- -- Async get data from redis
local cache = Redis:Get(co, "test222")
print("cache: ", cache)

-- Init player data
local ack = {
code = 0,
account_id = account_id,
player_id = player_id,
}
local player_data = {
account = data.account,
account_id = data.account_id,
proxy_id = data.proxy_id,
player_id = player_id,
proxy_fd = fd,
}
self:UpdatePlayerData(player_id, player_data)
Net:SendByFD(fd, PlayerEventRPC.PLAYER_BIND_EVENT, Squick:Encode("rpc.PlayerBindEvent", ack))
end)
local status, err = coroutine.resume(co, player_id, msg_data, msg_id, fd)
if(err)then
print(err)
end

--
local account_id = data.account_id -- 账号GUID
local player_id = "player_" .. data.account_id-- 区服游戏数据GUID

-- 初始化玩家数据
local ack = {
code = 0,
account_id = account_id,
player_id = player_id,
}

local player_data = {
account = data.account,
account_id = data.account_id,
proxy_id = data.proxy_id,
player_id = player_id,
proxy_fd = fd,
}
self:UpdatePlayerData(player_id, player_data)

Net:SendByFD(fd, PlayerEventRPC.PLAYER_BIND_EVENT, Squick:Encode("rpc.PlayerBindEvent", ack))
end

function PlayerMgr:SendToPlayer(player_id, msg_id, data)
Expand All @@ -54,10 +61,9 @@ function PlayerMgr:SendToPlayer(player_id, msg_id, data)
end

function PlayerMgr:OnReqPlayerData(player_id, msg_data, msg_id, fd)

local player = self.players[player_id]
if player == nil then
print("No this player " , player_id)
print("No this player ", player_id)
end

print("OnReqPlayerData, player_id: ", player_id)
Expand Down Expand Up @@ -85,4 +91,4 @@ function PlayerMgr:PlayerDataLoaded()

end

return PlayerMgr
return PlayerMgr
Loading

0 comments on commit d7f08ac

Please sign in to comment.