diff --git a/.github/images/tc9.svg b/.github/images/tc9.svg index 1fce1c9..474521c 100644 --- a/.github/images/tc9.svg +++ b/.github/images/tc9.svg @@ -1,4 +1,4 @@ - + -
NATS Message Bus 
NATS Message Bus 
TrinityCore DB
TrinityCore DB
Requests
game-load-balancer
with least connections
Requests...
authserver
authserver
servers registry
servers registry
Registers itself
Registers itself
Requests world server
(TrinityCore) for map
Requests world server...
Reads auth DB to validate session
Reads auth DB to validate session
TCP connection per player
TCP connection per player
Game load balancer
Game load balancer
Registers itself
Registers itself
TrinityCore
TrinityCore
TrinityCore
TrinityCore
TrinityCore
TrinityCore
Requests Character and Item GUIDs buffer
Requests Character and Item GUIDs buffer
TC9 sidecar
TC9 sidec...
Redis
Redis
GUID server
GUID server
GUID server
GUID server
GUID server
GUID server
Guild Server
Guild Server
Characters server
Characters server
Chat server
Chat server
Connects to
game load balancer
with least connections
returned by authserver
Connects to...
WoW
Game Client
WoW...
Text is not SVG - cannot display
\ No newline at end of file +
Gameserver
(TrinityCore/
AzerothCore)
Gameserver...
GUID
server
GUID...
Requests game load balancer
with least connections
Requests game load balancer...
Requests relamlist with
address to Game load balancer
with least connections
Requests relamlist with...
Game Client
Game...
TCP connection
per client +
gRPC
TCP connection...
Game load balancer
(aka Gateway)
Game load balancer...
Servers Registry
Servers Registry
Authserver
Authserver
Servers Registry
Servers Registry
Charserver
(characters server)
Charserver...
Chatserver
Chatserver
Mailserver
Mailserver
Guildserver
Guildserver
Groupserver
Groupserver
Gameserver
(TrinityCore/
AzerothCore)
Gameserver...
TC9
Sidecar
TC9...
GUID
server
GUID...
NATS
NATS
Requests
gameserver
for map
Requests...
Redis
Redis
Text is not SVG - cannot display
\ No newline at end of file diff --git a/README.md b/README.md index 2ac8850..fd1d6d1 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,44 @@ # ToCloud9 -**ToCloud9** is an attempt to make [TrinityCore](https://github.com/TrinityCore/TrinityCore) and its forks scalable and cloud-native. -The project is at the beginning of development and has limited functionality. +**ToCloud9** provides a variety of microservices that operate alongside AzerothCore/TrinityCore and enable clustering support, making the system scalable and highly available. + +## Architecture +The primary concept underlying the current architecture is to enhance the scalability of TrinityCore/AzerothCore with minimal modifications on their end. + +To fulfill these objectives, a game-load-balancer microservice has been developed. +Functioning akin to an API Gateway, the game-load-balancer analyzes packets and strategically routes them to the Gameserver or generates requests to other services for handling. + +The simplified architecture described below. -The current architecture described (in simplified form) in the image bellow: ![](.github/images/tc9.svg "architecture") -Since project is at beginning of development more components would be added and modified. - -At the moment, it supports 3.3.5 client and has the next applications: -* __authserver__ authorizes players, provides realmlist and connects a game client to the "smart" game load balancer with the least active connections; -* __game-load-balancer__ holds game client TCP connection, offloads encryption, reads packets and routes requests to other services. -For every character creates connection to the game server (TrinityCore) that Servers Registry provides. -Also intercepts some packets and uses information from them to sync some states between services. -* __servers-registry__ holds information about every running instance of Game Load Balancer and Game Server (TrinityCore world server). - Makes health checks and collects necessary metrics (active connections at the moment). Assigns maps to Game Server instances. -* __chatserver__ at the moments holds characters online and handles "whisper" messages; -* __charserver__ provides information to handle SMsgCharEnum opcode. Holds information about connected players. Handles Who opcode. -* __gameserver__ is modified TrinityCore world server with `sidecar` library, that registers GameServer in Servers Registry and handles health checks. -* __guildserver__ handles some guild opcodes. Still misses guild creation and guildbank functionality. -* __guidserver__ provides pool of guids of items and characters to the gameservers. -* __mailserver__ handles mail opcodes. + +If you'd like to read more, you can take a look at the pillars that form the foundation of ToCloud9 **[here](https://github.com/azerothcore/azerothcore-wotlk/discussions/16748)**. + +## Current state +Currently, it is possible to play the game, but some functionalities still do not support a distributed architecture (clustering). Here is a list of features/tasks that, once completed, will enable it to replace the widely used unscalable monolith (vanilla TrinityCore/AzerothCore). The status is relevant for integration with AzerothCore. + +| Feature/Task | Status | Comment | +|---------------------------------------------------------------|---------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:| +| Gameservers and other services discovery | ✅ | | +| Services communication with NATS and gRPC | ✅ | | +| Redirect players from one gameserver to another on map change | ✅ | | +| Gameservers crash recovery | ✅ | Players would be redirected
to the another available gameserver | +| Automatic load balancing maps between gameservers | ✅ | | +| Shared pool of GUIDs | ✅ | Sharing Players, Items, Instance GUIDs | +| "Who" opcode handling | ✅ | | +| Whispering in cluster support | ✅ | | +| Guilds in cluster support | 90% | Guild creation functionality is missing | +| Guild bank in cluster support | 0% | | +| Mail in cluster support | ✅ | | +| Auction house in cluster support | 0% | | +| Friends list in cluster support | 0% | | +| Global channels in cluster support | 0% | | +| Parties and raids in cluster support | 80% | **Not implemented:**
ready checks, instances reset on player request,
prolonging instance bind,
moving raid members between groups,
and updating group members state
like health when on different maps | +| Battlegrounds in cluster support | 0% | | +| Arenas in cluster support | 0% | | +| LFG in cluster support | 0% | | +| Sync transports between gameservers | ✅ | | +| Helm chart support | ✅ | | ## Deployment diff --git a/chart/templates/groupserver.yaml b/chart/templates/groupserver.yaml index 12c0fcb..f97a38f 100644 --- a/chart/templates/groupserver.yaml +++ b/chart/templates/groupserver.yaml @@ -23,6 +23,11 @@ spec: value: "{{ .Values.groupserver.service.internalPort | int }}" - name: NATS_URL value: nats://{{ .Release.Name }}-nats:4222 + - name: CHAR_DB_CONNECTION + valueFrom: + secretKeyRef: + name: {{ .Release.Name }}-databases-config + key: CHAR_DB_CONNECTION - name: CHAR_SERVICE_ADDRESS value: {{ .Release.Name }}-charserver:{{ .Values.charserver.service.externalPort}} ports: diff --git a/chart/values.yaml b/chart/values.yaml index f8e2007..e9bb221 100644 --- a/chart/values.yaml +++ b/chart/values.yaml @@ -31,8 +31,8 @@ servers_registry: replicaCount: 1 image: repository: ghcr.io/walkline/servers-registry - pullPolicy: IfNotPresent - tag: "v0.0.1" + pullPolicy: Always + tag: "v0.0.2" service: type: ClusterIP internalPort: 8999 @@ -42,8 +42,8 @@ authserver: replicaCount: 1 image: repository: ghcr.io/walkline/authserver - pullPolicy: IfNotPresent - tag: "v0.0.1" + pullPolicy: Always + tag: "v0.0.2" service: type: NodePort internalPort: 3724 @@ -53,8 +53,8 @@ guildserver: replicaCount: 1 image: repository: ghcr.io/walkline/guildserver - pullPolicy: IfNotPresent - tag: "v0.0.1" + pullPolicy: Always + tag: "v0.0.2" service: type: ClusterIP internalPort: 8995 @@ -64,8 +64,8 @@ guidserver: replicaCount: 1 image: repository: ghcr.io/walkline/guidserver - pullPolicy: IfNotPresent - tag: "v0.0.1" + pullPolicy: Always + tag: "v0.0.2" service: type: ClusterIP internalPort: 8996 @@ -75,8 +75,8 @@ chatserver: replicaCount: 1 image: repository: ghcr.io/walkline/chatserver - pullPolicy: IfNotPresent - tag: "v0.0.1" + pullPolicy: Always + tag: "v0.0.2" service: type: ClusterIP internalPort: 8992 @@ -86,8 +86,8 @@ charserver: replicaCount: 1 image: repository: ghcr.io/walkline/charserver - pullPolicy: IfNotPresent - tag: "v0.0.1" + pullPolicy: Always + tag: "v0.0.2" service: type: ClusterIP internalPort: 8087 @@ -97,8 +97,8 @@ groupserver: replicaCount: 1 image: repository: ghcr.io/walkline/groupserver - pullPolicy: IfNotPresent - tag: "v0.0.1" + pullPolicy: Always + tag: "v0.0.2" service: type: ClusterIP internalPort: 8998 @@ -108,8 +108,8 @@ mailserver: replicaCount: 1 image: repository: ghcr.io/walkline/mailserver - pullPolicy: IfNotPresent - tag: "v0.0.1" + pullPolicy: Always + tag: "v0.0.2" service: type: ClusterIP internalPort: 8997 @@ -124,8 +124,8 @@ game_lb: port: 32766 image: repository: ghcr.io/walkline/game-load-balancer - pullPolicy: IfNotPresent - tag: "v0.0.1" + pullPolicy: Always + tag: "v0.0.2" service: type: NodePort @@ -146,8 +146,8 @@ gameserver_ac: port_health: 9604 image: repository: ghcr.io/walkline/gameserver-ac - pullPolicy: IfNotPresent - tag: "v0.0.1" + pullPolicy: Always + tag: "v0.0.2" service: type: ClusterIP internalPort: 9509 diff --git a/doc/RunNonDockerWinWSLAzerothCore.md b/doc/RunNonDockerWinWSLAzerothCore.md index 41a190b..fef47b7 100644 --- a/doc/RunNonDockerWinWSLAzerothCore.md +++ b/doc/RunNonDockerWinWSLAzerothCore.md @@ -23,9 +23,10 @@ go build -o bin/game-load-balancer.exe apps/game-load-balancer/cmd/game-load-bal go build -o bin/servers-registry.exe apps/servers-registry/cmd/servers-registry/main.go go build -o bin/guidserver.exe apps/guidserver/cmd/guidserver/main.go go build -o bin/guildserver.exe apps/guildserver/cmd/guildserver/main.go +go build -o bin/groupserver.exe apps/guildserver/cmd/groupserver/main.go go build -o bin/mailserver.exe apps/mailserver/cmd/mailserver/main.go ``` -4. Now in `bin` directory you should see 8 .exe files. We will get back to them on Setup & Run steps. +4. Now in `bin` directory you should see 9 .exe files. We will get back to them on Setup & Run steps. ### Build AzerothCore @@ -88,6 +89,7 @@ Then run the rest of exe files: * chatserver.exe * game-load-balancer.exe * guildserver.exe + * groupserver.exe * mailserver.exe At this point, you should be able to log in to your account (if you have any in the database) and see the list of your characters.