登录功能

关于ET这个框架,我想的是先不深入学习这个框架的设计思路以及原理,先跟着从功能做起,再从功能中涉及到的代码去探究原理

登录功能

服务器架构

如上图所示,服务器由多个进程组成(可以去了解下分布式,这边就不记录分布式这个概念了),玩家在登录时首先会访问到网关服,那为什么不直接连接到游戏服务器呢?对此我的理解是,游戏服务器一般需要处理很多逻辑运算操作,如果请求数量过多时,会造成请求处理过慢等问题。所以如果在玩家到服务器这段连接中加入一个网关服务器,这个网关服务器负责接受玩家请求以及将游戏服务器处理完的结果下发给玩家,这样游戏服务器就能专心处理逻辑运算功能。
游戏服务器和DB数据库之间又有一层游戏数据库代理进程,这是因为如果游戏服务器直接连到数据库的话会造成大量的IO操作,也会影响到运算速度。而加入游戏数据库代理进程后,这个进程会将数据进行缓存,玩家访问时游戏服务器可以从数据库代理进程直接读取不需要有IO操作,玩家存储数据时则先存在数据库代理进程,代理进程将定时把这些数据持久化到DB数据库中。

ET中的登录流程部分代码(并非完整代码,只截取了主要部分)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static async ETTask Login(Scene zoneScene, string address,  string account,  string password)
{

// 创建一个ETModel层的Session
R2C_Login r2CLogin;
Session session = zoneScene.GetComponent<NetKcpComponent>().Create(NetworkHelper.ToIPEndPoint(address));
{
// 这边的处理是首先通过配置的随机获取一个网关服,此时会生成一个Token作为连接许可的令牌,并将网关IP以及令牌返回给客户端
r2CLogin = (R2C_Login) await session.Call(new C2R_Login() {Account = account, Password = password });
}

//
session?.Dispose();

// 创建一个gate Session,并且保存到SessionComponent中
Session gateSession = zoneScene.GetComponent<NetKcpComponent().Create(NetworkHelper.ToIPEndPoint(r2CLogin.Address));
gateSession.AddComponent<PingComponent>();
zoneScene.AddComponent<SessionComponent>().Session = gateSession;

// 网关进程跟客户端正式连接
G2C_LoginGate g2CLoginGate = (G2C_LoginGate)await gateSession.Call(new C2G_LoginGate() { Key = r2CLogin.Key, GateId = r2CLogin.GateId});
Game.EventSystem.Publish(new EventType.LoginFinish() {ZoneScene = zoneScene});
}

上述代码具体流程是

1.客户端请求后端分配一个空闲的网关(分配由一个Realm网关负载均衡服务器完成,这个服务器这边先不深入其功能,知道有这个东西就行)
2.这个被分配的网关会生成一个Token(可以理解为令牌),客户端会取到这个Token并作为后续请求的验证手段
3.连接完网关后,网关会建立一个客户端与游戏服务器的Unit映射关系,通过这个映射,网关可以转发客户端到游戏服务器之间的消息
4.连接过程中需要一个Location定位服务器,这个服务器为网关提供客户端的Unit映射所在的游戏服务器进程

Scene

以下内容参考链接 ET框架的基础逻辑
上面的代码中,出现了Scene这个参数。这个Scene在ET中是作为一个根节点的Entity:

客户端中的Scene:

1.GameScene:
游戏客户端全局的Scene根节点,可用做客户端基础功能组件(例如资源管理、计时器管理等等)
2.ZoneScene
用于提供玩家游戏业务功能逻辑组件(例如基础UI、任务、背包组件等),重连的时候可以重新加载这些组件
3.CurrentScene
用于代表玩家当前所在的地图(关卡)场景,一般用于挂载当前场景相关的组件,切换或者释放场景时回收此Scene以及
其所有子实体和组件

服务端中的Scene:

1.GameScene:
类似客户端,用来挂载全局服务端所需要的基础公共功能组件(如图中的NetKcpComponent,用于通讯的)
2.ZoneScene
1)可以创建多个不同功能的ZoneScene,每个不同功能的ZoneScene下挂载其应该具有的功能组件,例如网关下
   的NetKcpComponent,定位服务器的LocationComponent等,一般通过SceneType的枚举对其进行逻辑分发
   
2)不同ZoneScene可以存在一个进程上面,也可以每个ZoneScene运行在一个单独的进程上,不同ZoneScene进程
   甚至可以分布在服务器集群上,大大提高了运行效率
   
3)可以动态创建和销毁(类似创建临时副本场景)

登录功能
http://example.com/2023/03/25/登录功能/
Author
John Doe
Posted on
March 25, 2023
Licensed under