Photon 5 更新与改变
主要变化
名称服务器/NameServer
NameServer在光子云PhotonCloud上已经存在了一段时间,我们决定在v5中把它带到独立的Photon服务器上。使用NameServer作为LoadBalancing实例的默认应用,在切换到MasterServer之前,客户应首先连接到NameServer,这是现在部署Photon的首选方式。
NameServer对于配置不同的部署区域或集群非常有用。因此,负载平衡是在另一个层面上完成的。这一方式已经被我们的企业客户使用,且反响很好。
内置的验证提供者
NameServer上的自定义验证功能带来了四个开箱即用的验证提供者,这些功能以前只在光子云PhotonCloud上可用,他们包括:Facebook、Steam、Oculus和Vive。这也是广受我们企业客户好评和使用的另一项功能。
PhotonSocketServer
配置全面更新
配置系统已经完全改变。它现在依靠.NET Core的配置提供者来加载、解析和绑定。服务器应用程序现在需要Microsoft.Extensions.Configuration.Abstractions
NuGet包,以便使用Microsoft.Extensions.Configuration.IConfiguration
接口,该接口将通过一个新的构造函数注入到应用程序中。
PhotonServer.config
文件现在在服务器启动时也具有XML模式验证功能。
一些新的限制
我们一直都有本地设置(通过PhotonServer.config
配置)来设置数据传输限制(消息大小,缓冲区大小,数据传输率)。
因此,为了给Photon服务器增加一层保护,我们引入了新的设置,您可以通过微调来定义这些使用限制。
MessageRate:
每个对等体每秒允许的最大传入信息数量。默认值为5000。MessageDataRate
: 允许每个peer每秒缓冲传入数据的最大尺寸。默认为2147483647(int.MaxValue
)。MaxMessageSize
: 允许传入的消息的最大尺寸。默认值为512000。
阅读更多关于如何在 “管理的SocketServer设置 “配置(英文官网)。
序列化协议 V1.8
服务器现在支持1.8版本的序列化协议,这也是最新客户端SDK的默认状态。新的协议为大多数常用的类型,带来了新的优化和紧凑的数据传输技术。
安全证书/验证设置
在安全连接的验证格式和配置的方面,我们已经从安全通道(Schannel)转换为OpenSSL。你可以在这里(英文官网)找到设置证书的新方法。
Photon Server v5现在也支持TLS 1.2和TLS 1.3。
定时断开连接
在v5中,我们增加了一种定时或延迟断开连接的方法,将客户端的ConnectionState
设置为ScheduledForDisconnect
,并让服务器能够在断开连接前向客户端发送DisconnectMessage
。默认的延迟是5000毫秒。同时服务器有更多的理由断开服务器的连接,断开原因可能是一个错误。
当一个peer被安排断开连接时,服务器将丢弃从该peer传入的任何数据。
32位的支持终止
PhotonSocketServer现在只有64位的版本。”deploy\bin_Win32 “目录已经不在保留。
负载平衡
配置全面更新
配置文件已被改变,因此每个应用程序都有自己的文件,并有一个简化的新结构。插件的配置也移到了它自己单独的配置文件中。此外,HttpQueueSettings
现在有自己单独的部分,并且可以在使用HttpQueue
的部分中进行配置。
新的限制选项
对于LoadBalancing服务器应用程序,我们之前总是有各种可配置限制。但这似乎并不足以保护Photon服务器免受恶意客户或黑客的攻击或滥用。
操作限制
通用:
我们为每个操作代码增加了操作请求和参数限制。
特定:
对于最常用的操作同样也有一些限制:加入、创建和SetProperties
。
游戏服务器/GameServer:
JoinGameRate
:每个peer每秒的最大Join请求数。CreateGameRate
:每个peer每秒最大的创建请求数。SetPropertiesRate
:每个peer每秒最大的SetProperties请求数。
主服务器/MasterServer:
MaxConcurrentJoinRequests
:每个peer的待处理(排队的未处理请求)的最大联合操作数量。MaxTotalJoinRequests
:每个peer的最大联合操作总数。MaxJoinedGames
:同一个peer同时加入的房间的最大数量。
HTTP限制
除了 “常规 “的HTTP队列设置外,你可以通过LimitHttpResponseMaxSize
来限制传入的HTTP响应的有效载荷大小。这可以应用于自定义认证、WebRPCs或自定义插件(包括Webhooks)。
事件缓存的限制
SlicesCount
:每个房间的事件缓存slices的最大数量。EventsCount
:每个房间的最大缓存事件数(所有角色和全局缓存)。ActorEventsCount
:每个房间每个角色的最大缓存事件数。
属性限制
游戏服务器/GameServer:
MaxUniqPropertyKeysPerPeer
:每个角色在每个房间内的不同属性键的最大数量。MaxPropertiesPerRequest
:每个SetProperties请求的最大不同属性数量。MaxPropertiesSizePerGame
:每个房间所有属性的最大总数/总和。MaxPropertiesSizePerRequest
:每个SetProperties请求的任何单一属性的最大尺寸。
大厅限制
MaxGamesOnJoin
:当客户端加入大厅时,在GameList
事件中发送的房间列表条目的最大数量。MaxGamesInUpdates
:在GameListUpdate
事件中发送的房间列表条目的最大数量。MaxGamesInGetGamesListResponse
:作为GetGameList
请求的结果,SQL房间列表条目的最大数量。Total
:每个应用程序的大厅的最大数量。
.NET目标
为了准备完全支持.NET核心的v6版本,服务器源代码的.NET项目风格在v5中发生了变化,我们增加了构建文件来准备。
构建目标配置(还有目标构建输出文件夹等)是通过MSBuild文件(csproj,csproj.includes)和自定义定义和宏来处理的。参见 “build/include “文件夹。构建流程和部署过程主要通过 “dotnet “命令完成。这就是为什么你需要安装.NET Core运行库才能构建和部署,尽管.NET Core还不是一个支持的构建目标。
除此之外,目标的.NET框架版本从4.0更新到4.6.1。但你也用高于4.6.1的.NET框架版本进行构建。
本地NuGet资源库
在v5 SDK中,用于服务器应用程序开发的主要库现在可以作为本地NuGet包使用。
- ExitGamesLibs (ExitGamesLibs.dll)
- ExitGames.PhotonHostRuntimes (PhotonHostRuntimesInterfaces.dll)
- ExitGames.Logging (ExitGames.Logging.dll)
- ExitGames.Logging.Log4Net (ExitGames.Logging.Log4Net.dll)
这通过 “nuget.config
“和SDK文件夹根部的Nuget包完成。如果你的解决方案没有自动完成,也可以从 “nuget.config
“文件中手动添加包源 “WorkspaceNuget
“。
改进的反馈控制系统(LoadBalancer
LoadBalancer使用的反馈控制系统得到了增强。它现在包含双倍反馈级别(过去是5级,现在是10级)。我们还引入了优先权/Priorities和储备/Reserve。
新的服务器错误代码
HttpLimitReached
: 32745,这意味着HTTP请求失败,因为已经达到了一个限制。ExternalHttpCallFailed
: 32744,这意味着HTTP请求由于与目标Web服务有关的问题而失败。OperationLimitReached
: 32743,这意味着操作被阻止了,因为已经达到了一个限制。SlotError
:32742,这意味着更新预期用户时出现了错误。SecureConnectionRequired
:32740,这意味着peer被断开,因为服务器要求安全连接,而此安全连接是通过LoadBalancing部分的 “RequireSecureConnection
“设置启用的。EventCacheExceeded
: 32739,这意味着事件缓存被取消了,因为已经达到了一个限制。ExpectedGSCheckFailure
:32738,这意味着加入操作失败,因为客户端没有连接到由主服务器提供并在授权令牌中加密的正确游戏服务器。这需要游戏服务器设置 “TokenCheckExpectedHostAndGame
“生效。ExpectedGameCheckFailure
:32737,这意味着加入操作失败,因为客户端没有提供正确的预期GameId/RoomName
,其由MasterServer
提供并在auth token
中加密。这需要游戏服务器设置 “TokenCheckExpectedHostAndGame
“设置启用。AuthRequestWaitTimeout
:32736,一个断开连接的原因,而不是一个错误代码。这意味着peer被断开连接,因为它在服务器上待的太久却并没有认证。此只发生在主服务器上。超时时间可以在主服务器设置 “AuthTimeout
“中设置。默认是1200000毫秒(20分钟)。ConnectionSwitch
: 32735,一个断开原因,而不是一个错误代码。它意味着断线的peer快速重联(使用相同的会话令牌)重新联入房间里的活动角色。ActorRemoved
:32734,一个断开的原因而不是错误代码。它意味着peer因为相应的角色被从房间中移除而断开。
其他变化
修正部分
- 服务器现在按照预期,在所有情况下作为认证操作的结果而返回
UserId
。如果客户端或认证提供者没有设置UserId
,将返回服务器上生成的GUID
。在v4中,服务器在这种情况下不返回UserId
。 - 另外,在认证过程中,如果认证提供者没有设置
Nickname
,则服务器将不会返回任何值。在v4中,服务器在这种情况下会返回一个空的Nickname
。 - 服务器现在不允许同一个角色多次被添加到同一个兴趣小组/interest group中。在v4中,这操作是有可能的,它导致了多次收到该角色发送到该兴趣小组的相同事件。
- 服务器现在支持session tokens,因此,快速重联的功能可以按预期工作。
- 可以通过广泛房间属性创建房间后设置预期用户/Setting Expected Users。
新增功能
- PlayerTTL和EmptyRoomTTL被添加为广泛房间属性,可以在房间创建后设置(或更改)。
- 房间标志/Room flags在房间创建时被添加。
- “
Delete Null Properties
“:为空值的属性将在服务器上被删除。
- “
Broadcast Properties Change
“:调用SetProperties
的客户端也将收到PropertiesChanged
事件。 - “
SuppressPlayerInfo
“:在加入过程中,我们将抑制获取任何有关已加入用户的信息的操作,但仍有可以通过GetProperties
操作获得这些信息,这个标志覆盖了SuppressRoomEvents
标志的值。 - “
CheckUserOnJoin
“, “SuppressRoomEvents
“, “PublishUserId
” 和 “DeleteCacheOnLeave
” (也叫 “CleanupCacheOnLeave
“) 现在都是房间标志/room flags。用来请求参数或广泛房间属性。
- “
- 为
SQL
大厅新增 “GetGameList
“操作。 - 通过保护匹配过滤器(SQL查询)免受SQL注入,为SQL大厅提供额外的安全性。
- 更多的性能计数器。在这里查看完整列表。
JoinRandomRoom
允许你有多个 “连接的 “逗号分隔的SQL过滤器(最多三个)。JoinRandomRoom
允许你在没有找到匹配的情况下创建一个房间。
功能改变
v5中的认证应该在NameServer上完成,而不再是在MasterServer上。虽然目前在MasterServer上仍然可用,但我们将在未来将其废弃。有了Steam、Facebook、Oculus和Vive作为NameServer上内置的认证供应商,你就有了另一个理由把它移到那里。
其他调整
终止部分
- CounterPublisher已经停用。其相关的源代码和二进制文件(文件和配置)已从SDK中删除。你可以使用Telegraf或Windows PerfMon代替。
- MMO项目。
- StarDust测试控制台客户端。
光子控制的变化
- “MMO演示 “实例子菜单移除。
- “运行TestClient(LoadBalancing)”从 “LoadBalancing(MyCloud)”子菜单中删除。
- 添加了 “编辑 Nameserver.json “快捷方式。
相关资源