Skip to content

Navigation Menu

Sign in
Sign up

Commit 06aa01c

Browse files
README.md
1 parent 78083cb commit 06aa01c

3 files changed

Lines changed: 56 additions & 2 deletions

File tree

‎README.md‎

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,4 +84,56 @@ dos2unix *
8484
```
8585
* Logger字段:日志输出的路径,一般是exe所在的目录作为工作目录
8686
* ClusterConfig字段:用于指定集群配置的路径
87-
* ClusterName字段:用于指定被启动的进程,在集群中的进程名称,在跨进程的RPC调用中发挥关键作用
87+
* ClusterName字段:用于指定被启动的进程,在集群中的进程名称,在跨进程的RPC调用中发挥关键作用
88+
89+
# 创建新服务
90+
在SparkServer中,我们将执行业务逻辑的实体,称之为服务。SparkServer提供了一个ServiceContext类作为所有服务的基类,所有用户自定义的服务都需要继承这个类,它为我们提供了消息回调的入口,RPC调用的接口以及定时器设置等基础功能。SparkServer的Game目录,提供了一个Example工程,他包含了我推荐的项目目录组织形式。Framework目录包含了SparkServer的基础框架逻辑,对于基于SparkServer的工程开发,最好的方式是,在工程下与Framework目录同级的目录,新建一个目录,将所有的代码和资源都放置在这里,方便管理,避免侵入框架本身。正如上面所说,Game目录的Example提供了一个范例。
91+
92+
要新建一个服务,首先要创建一个继承ServiceContext的类,如下所示,我们定义了一个用于启动其他服务的Boot服务:
93+
94+
```
95+
using SparkServer.Framework.Service;
96+
using SparkServer.Framework.Utility;
97+
using System;
98+
using System.Collections.Generic;
99+
using System.Linq;
100+
using System.Text;
101+
using System.Threading.Tasks;
102+
103+
namespace SparkServer.Game.Process.TestSender
104+
{
105+
class Boot : ServiceContext
106+
{
107+
protected override void Init()
108+
{
109+
base.Init();
110+
111+
for (int i = 0; i < 100; i ++)
112+
{
113+
SparkServerUtility.NewService("SparkServer.Game.Process.TestSender.Sender");
114+
}
115+
}
116+
}
117+
}
118+
```
119+
120+
定义一个服务,有个非常重要的函数便是负责初始化的Init函数,我们的Init初始化函数分为两类,一种是有参,它传入一个byte[]类型的参数。一种是无参初始化函数,也就是说这种初始化不依赖任何外部参数。Init函数需要重载,为了保证线程安全,SparkServer的服务在创建时,会被push一个消息,这个消息在消费时会调用Init函数执行初始化操作,由于创建服务的线程和执行Init初始化逻辑的线程很可能不一样,这种方式避免了服务在未完成初始化的情况下,开始消费其他服务发送过来的消息。
121+
122+
启动一个定义好的服务也非常简单,我们需要借助SparkServerUtility库的NewService函数去启动服务,比如我们要启动上面定义的Boot服务,那么启动它的逻辑,将是如下所示的代码:
123+
124+
```
125+
SparkServerUtility.NewService("SparkServer.Game.Process.TestSender.Boot");
126+
```
127+
128+
实际上,进程的第一个启动服务是不需要我们自己去调用这个函数的,我们需要在启动命令中,指定要启动的服务,以及配置路径即可,比如我们要启动Game这个Example中Battle进程下的BattleTaskDispatcher服务,则需要执行如下命令:
129+
130+
```
131+
# windows
132+
spark-server.exe SparkServer SparkServer.Game.Process.Battle.BattleTaskDispatcher ../../Game/Startconf/LocalSvr/Battle/BootConfig.json BattleTaskDispatcher
133+
134+
# linux
135+
mono spark-server.exe SparkServer SparkServer.Game.Process.Battle.BattleTaskDispatcher ../../Game/Startconf/LocalSvr/Battle/BootConfig.json BattleTaskDispatcher
136+
```
137+
138+
spark-server.exe是编译好的可执行文件,后面的SparkServer参数指明了,启动这个进程,需要指明初始化服务、启动配置和服务名称。SparkServer.Game.Process.Battle.BattleTaskDispatcher这个参数,指明了第一个被启动的服务是哪个,紧随其后的就是启动配置,最后是第一个被启动服务的名称。
139+
0 Bytes
Binary file not shown.

‎spark-server/server/SparkServer.csproj‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,8 @@
347347
<None Include="Framework\Tools\sproto2cs\sprotodump\serpent.lua" />
348348
<None Include="Framework\Tools\sproto2cs\sprotodump\sprotodump.lua" />
349349
<None Include="Framework\Tools\sproto2cs\sprotodump\util.lua" />
350+
<None Include="Test\Gateway\LinuxShell\BootClient.sh" />
351+
<None Include="Test\Gateway\LinuxShell\BootServer.sh" />
350352
<None Include="Test\Gateway\Resource\Config\Startup.json" />
351353
<None Include="Test\Gateway\WinCmd\BootClient.bat" />
352354
<None Include="Test\Gateway\WinCmd\BootServer.bat" />
@@ -578,4 +580,4 @@
578580
<Target Name="AfterBuild">
579581
</Target>
580582
-->
581-
</Project>
583+
</Project>

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /