Spectra

Ein nativer Desktop-Client für das Spectra-Panel unter Windows und Linux, geschrieben in C#/.NET. Eine echte Binärdatei mit Systemzugriff, kein verpacktes Chromium. Dieselbe Ansicht wie im Web, aber mit nativer Leistung und Desktop-Integration.

TypDesktop-Anwendung
StackC# / .NET, Avalonia
PlattformenWindows, Linux
VertriebEigenständiges Binary
KernGemeinsam mit dem Web-Panel
Spectra
TL;DR

Ein nativer Administrationsclient für das Spectra-Gameserver-Hosting unter Windows und Linux, gebaut in C#/.NET auf Avalonia. Dieselbe Ansicht wie das Web-Panel, aber als echtes Binary, das direkt in den Plattformkern und dessen riesige frozcore/frozmod-API eingebunden ist - mit Systemzugriff, nativer Geschwindigkeit und Logik, die mit dem Rest von Spectra geteilt und nicht ein zweites Mal neu geschrieben wird.

Einleitung

Spectra ist eine Marke für Gameserver-Hosting, für die wir das komplette Panel-Backend gebaut haben. Diese Fallstudie behandelt ein einzelnes, aber entscheidendes Teil dieses Puzzles: den nativen Desktop-Client für Administratoren. Es ist keine separate App, die neben dem Panel lebt - es ist eine weitere Hülle über demselben Kern, die mit demselben Backend spricht wie die Web-Version. Um zu verstehen, warum das eine Herausforderung war, muss man zuerst sehen, wie groß das System darunter ist.

Der Desktop-Client rendert keine hübschen Bildschirme über der Leere. Er steht auf einer vollständigen Plattform: Server-Provisioning, Leistungsverwaltung, Dateien, Datenbanken, Telemetrie, Abrechnung und Berechtigungen. Unsere Aufgabe war es, dem Administrator ein natives Fenster auf all das zu geben - ohne einen verpackten Browser und ohne Logik zu duplizieren, die ohnehin schon im Web-Panel lebte.

Ein Panel, in dem man den ganzen Tag sitzt

Ein Administrator von Gameservern schaut nicht einmal pro Woche ins Panel. Er hat es acht Stunden lang offen, neben der Konsole, dem Spiel-Client und dem Messenger. In diesem Modus ist ein weiterer Browser-Tab keine Bequemlichkeit, sondern ein fünftes Rad am Wagen: Er geht im Gedränge der Tabs verloren, hat kein eigenes Symbol in der Taskleiste, reagiert nicht auf Systemkürzel und sieht keine lokalen Dateien.

Wir wollten dieselbe Ansicht wie im Web geben, aber als App, die sich wie der Rest der Programme auf dem Desktop verhält. Eine harte Bedingung: kein verpacktes Chromium. Ein Client, der beim Start 200 MB Speicher hinzufügt, nur um genau dasselbe anzuzeigen, verfehlt sein Ziel, bevor er überhaupt fertig gestartet ist. Wenn der Administrator hier den größten Teil des Tages verbringen soll, muss die App leicht, sofort da und auf seinem System "zu Hause" sein und nicht ein weiteres Browserfenster, das ein Programm vortäuscht.

In Zahlen

MetrikWert
Systeme aus einer CodebasisWindows und Linux
Typischer Speicher-Fußabdruck~40 MB
Gemeinsamer Kern mit dem Web-Paneleiner
An die API angebundene AnsichtenDutzende

Was Spectra darunter wirklich ist

Das größte Missverständnis bei einem solchen Projekt ist der Gedanke, "es ist nur ein Panel". In Wirklichkeit ist das Panel eine dünne Schicht über einem Backend, das die schwere Arbeit erledigt: Es startet und stoppt Gameserver, weist Ressourcen zu, hält Datenbanken, streamt Logs und die Konsole live und überwacht Limits und Abrechnung. Dieses Backend ist die umfangreiche frozcore/frozmod-API - Dutzende von Endpunkten, Echtzeit-Ereignisse und ein Berechtigungsmodell, das entscheidet, wer was sieht und was er tun darf.

Der Desktop-Client muss mit genau derselben API sprechen wie das Web-Panel. Es gibt hier keine "vereinfachte Desktop-Version": Wenn der Administrator ein Speicherlimit eines Servers ändert oder eine Instanz neu startet, tut er das über denselben Vertrag, über den es auch das Web tut. Deshalb mussten wir, bevor auch nur ein einziger Bildschirm existierte, den Umfang dieser API verstehen und beherrschen - und das war der eigentliche Teil der Herausforderung, nicht das Aussehen des Fensters.

i
Hinweis

Die Konsole und der Log-Stream laufen live. Das ist keine Aktualisierung alle paar Sekunden, sondern ein kontinuierlicher Ereignisstrom vom Backend - der Desktop-Client abonniert ihn genauso wie das Web, sodass der Administrator die Ausgabe eines Servers in dem Moment sieht, in dem sie entsteht.

Ein Kern, zwei Hüllen

Die Domänenlogik - Autorisierung, das Servermodell, Leistungsbefehle, der Log-Stream, das Abbilden von Berechtigungen auf diese API - lebt in einer einzigen .NET-Bibliothek. Das Web-Panel und der Desktop-Client sind zwei Hüllen über diesem einen Kern, sodass eine Korrektur in einer Berechtigungsregel oder in der Behandlung eines Endpunkts an beiden Stellen gleichzeitig landet. Eine ganze Klasse von "im Web funktioniert es, auf dem Desktop kaputt"-Fehlern verschwindet einfach.

Avalonia zeichnet die Ansichtsschicht. Es ist kein Webview - die Steuerelemente rendern direkt über Skia, denselben Weg unter Windows und Linux, sodass die App auf beiden identisch aussieht. Nebenbei erhält sie echten Zugriff auf das Dateisystem, die Zwischenablage und Benachrichtigungen, den eine verpackte Seite nie hatte.

Stack

SchichtWahlWozu so
Sprache und RuntimeC# / .NETeine Sprache für Logik und UI, gute Werkzeuge
AnsichtsschichtAvalonia (Skia)natives Rendering, identisch unter Windows und Linux
Domänenkerngemeinsame .NET-Bibliothekdieselbe Logik und derselbe API-Client wie das Web-Panel
Netzwerkschichttypisierter frozcore/frozmod-Clientein Vertrag, Web und Desktop sprechen dasselbe
Distributionself-contained publishein Binary, keine Runtime-Installation beim Kunden

Integration mit einer riesigen API

Das war der schwerste Teil. Das Spectra-Backend stellt Dutzende von Operationen bereit: Server-Lebenszyklus, Konsole, Dateien, Datenbanken, Aufgabenpläne, Backups, Benutzer und Berechtigungen, Ressourcentelemetrie. Damit der Desktop-Client nicht zu einem Gewirr von Aufrufen wird, haben wir die gesamte API in einen einzigen typisierten Client im Kern gehüllt - mit einer Stelle für Autorisierung, Wiederholungen und Fehlerbehandlung.

1
Ein typisierter API-Client

jeder frozcore/frozmod-Endpunkt hinter einer einzigen Schnittstelle, mit Autorisierung und Wiederholungen an einer Stelle, sodass weder Web noch Desktop diese Logik wiederholt.

2
Live-Streams

Konsole, Logs und Telemetrie als Ereignisabonnements, kein Polling in einer Schleife; derselbe Mechanismus wie im Web-Panel.

3
Berechtigungsmodell an der Tür

was ein Administrator sehen und tun kann, ergibt sich aus denselben Regeln wie im Web, berechnet im Kern und nicht "nach Augenmaß" in der UI.

4
Abbildung auf native Ansichten

API-Antworten landen direkt in nativen Avalonia-Steuerelementen, ohne DOM als Vermittler.

➜
Tipp

Die gesamte API in einen Client im Kern zu hüllen, hat sich doppelt ausgezahlt: eine Vertragsänderung auf der Backend-Seite ist eine einzige Korrektur in der Bibliothek, die Web und Desktop im selben Commit erhalten. Kein Versionsauseinanderdriften, kein "bei mir funktioniert es".

Leistung und Nativität

Da die Randbedingung "kein verpacktes Chromium" lautete, war Leistung kein Zusatz, sondern das Ziel. Avalonia zeichnet die Oberfläche direkt, ohne Browser-Engine im Inneren, sodass ein Binary mit dem vollständigen Panel einen Bruchteil dessen wiegt, was dieselbe Ansicht in Electron wiegen würde, und in einem Bruchteil einer Sekunde startet.

Speicher-Fußabdruck beim Start (orientierend, MB)

Avalonia-Client
40
Dieselbe Ansicht in Electron
240

Hinzu kommt das, was ein Browser nie gegeben hat: echter Zugriff auf das Dateisystem (Serverdateien zeigen Sie direkt von der Festplatte an, ohne sie zuerst in einen Browser hochzuladen), Systemkürzel, native Benachrichtigungen und ein Symbol in der Taskleiste. Für jemanden, der den ganzen Tag im Panel sitzt, ist das keine Kosmetik, sondern eine tägliche Zeitersparnis.

Wie wir das alles zusammengefügt haben

Mit einem Kern, der den API-Client enthält, und einer Hülle auf Avalonia fügte sich das Ganze auf wiederholbare Weise zusammen. Entscheidend war, dass eine Quelle zwei eigenständige Binaries liefert, die auf beiden Systemen wirklich getestet wurden und nicht nur für beide kompilieren.

1
Herauslösen des Kerns aus dem Panel

Autorisierung, das Servermodell, Befehle und der API-Client wurden von der Web-Ansicht abgetrennt und in eine separate Bibliothek verlagert, die nichts darüber weiß, wer sie zeichnet.

2
Hülle auf Avalonia

dasselbe Bildschirmlayout wie im Web, aber in nativen Steuerelementen, über gewöhnliche Aufrufe an den Kern angebunden, nicht über HTTP zu sich selbst.

3
Zwei Ziele in einem Durchlauf

publish auf win-x64 und linux-x64 aus derselben Quelle, jedes als eigenständiges Binary.

4
Test auf beiden Systemen

dasselbe wird real unter Windows und unter Linux ausgeführt, mit Anbindung an das echte Backend, nicht nur für beide kompilierend.

bash
dotnet publish -c Release -r win-x64 --self-contained true
dotnet publish -c Release -r linux-x64 --self-contained true

Was die Zusammenarbeit letztlich gebracht hat

Der Administrator erhält ein Programm, das in einem Bruchteil einer Sekunde startet, sich wie jede andere App an die Taskleiste hält und genau die Daten zeigt, die das Web-Panel zeigt - denn darunter ist es derselbe Code und dieselbe API. Systemkürzel funktionieren, Dateien auf der Festplatte lassen sich auswählen, ohne sie zuerst in einen Browser hochzuladen, Konsole und Logs laufen live, und das Fenster geht nicht im Dickicht der Tabs verloren. Statt einer "Seite in einem Fenster" erhält der Administrator ein Werkzeug, das sich wie ein Teil seines Systems anfühlt.

Auf Spectras Seite ist der Gewinn ebenso konkret und langfristig. Eine Logik und ein API-Client statt zweier von Hand in Einklang gehaltener bedeuten, dass die Entwicklung der Plattform sich nicht mit der Anzahl der Hüllen multipliziert. Eine neue Berechtigungsregel, ein neuer Endpunkt im Backend oder eine Änderung im Servermodell landet im selben Commit im Web und auf dem Desktop. Eine ganze Klasse von Synchronisationsfehlern verschwindet, und der Desktop-Client hört auf, ein separates Projekt zur Pflege zu sein.

Am wichtigsten ist jedoch, dass der Desktop keine "Light-Version" ist. Er spricht mit derselben vollständigen frozcore/frozmod-API wie das Web-Panel, sodass der Administrator nie in den Browser zurückkehren muss, um eine Funktion zu erhalten, die der App gefehlt hat - denn es fehlte keine. Das ist der Unterschied zwischen einer verpackten Seite und einem echten, nativen Plattform-Client: Letzterer wächst mit dem Backend, anstatt hinterherzuhinken.

Weitere Projekte

Weitere Projekte aus derselben Kategorie - sehen Sie, wie wir ähnliche Herausforderungen angehen.

Haben Sie ein ähnliches Projekt?

Melden Sie sich - ein Angebot ist kostenlos und kommt innerhalb einer Stunde.