Yivgame
YIVGame ist eine MicroService-Architektur-Spielserver-Lösung, die in der GO-Sprache basierend auf Go-Kit geschrieben wurde. Zusätzlich zum Spielserver (Long Connection) enthält es auch einen API-Schnittstellenserver für Front-End- und Back-End-Vorgänge. Zusätzlich zum Server selbst wird auch eine detaillierte Konfiguration der Docker -Bereitstellung beteiligt.
Merkmal
- Microservice -Architektur
- Der Client und der Spielserver realisieren die Übertragbarkeit über das bidirektionale GRPC -Streaming
- Kunden-server-Seite-Websocket-Kommunikation
- Implementieren Sie HTTP -Endpunkte und WebSocket -Endpunkte und Protokolle
Designpraxis
Microservice -Architektur
- Durch die Microservice -Architektur werden herkömmliche Spielserver in verschiedene Microservices aufgeteilt
- Verschiedene Mikroserver können synchron über GRPC und asynchron über Kafka kommunizieren
Domänengetriebenes Modell
- Um die Entkopplung verschiedener Softwareebenen zu erreichen, ist jeder Dienst gemäß dem domänengesteuerten Modell konzipiert.
- Teilen
- Halten Sie sich streng an die Einwegabhängigkeit von außen nach innen zwischen den verschiedenen Ebenen
Die Geschäftsschicht implementiert hauptsächlich die Kernlogik des Spiels oder Servers, kümmert sich nicht um externe Implementierungen und hängt von Dateisystemen, Datenbanken usw. ab sie in der Hauptdarstellung durch Abhängigkeitsinjektion. Mit Ausnahme einiger grundlegender Standardbibliotheken bezieht sich die Geschäftsschicht daher kaum auf Pakete von Drittanbietern.
Ereignisorientiertes Modell mit Kafka
- Die Kernkommunikationsmethode zwischen dem gesamten Microservice -System ist der GRPC -Synchronaufruf und die asynchrone Ereigniskommunikation mithilfe von Kafka als Streaming -Plattform.
- Alle Aktivitäten, die in Microservices befolgt werden, werden in Kafka in Form von Ereignissen veröffentlicht
Ereignisgesteuerte Modell- und Datenanalyse
- In der Vergangenheit wurden sie bei Spieldatenanalysen über gemeinsame Tabellen durchsucht.
- Nachdem das ereignisgesteuerte Modell verwendet wird, können alle Spielerverhaltensweisen, auf die wir achten, als Ereignisse aufgezeichnet werden, verschiedene Attribute für verschiedene Ereignisse entwerfen und extrem skalierbare Datenanalyse erzielen


Projektverzeichnisstruktur
- Seit der von Go-Kit implementierten MicroService-Architektur versuchen Sie, sie so weit wie möglich mit dem offiziellen Beispiel für Go-Kit in der Verzeichnisstruktur übereinzuhalten.
- Da das domänengesteuerte Modell geschichtet ist, ist es natürlich, das innere Paketverzeichnis in die äußere Schicht zu enthalten, wenn ich die Projektverzeichnisstruktur entworfen habe Verzeichnisstruktur auf Domänenebene, stattdessen wird das Verzeichnis von Paketen unterschiedlicher Ebenen unter das Verzeichnis derselben Ebene gestellt.
Keine globalen Variablen
- Um die Software in der Codelogik klarer zu machen, vermeiden Sie globale Variablen ausschließlich
Datencache, Datenspeicherung und Kafka
- Daher werden Spielerdaten direkt im Servicespeicher gespeichert, was die direkte Datenverarbeitung erleichtert
- Die Änderung der Spielerdaten wird über Wal an Kafka geschrieben, und dann wird der Speicherdienst asynchron in die Datenbank geschrieben.
- Da die WAL -Methode verwendet wird, sind RETO und AUSO der Spielerdaten einfach zu implementieren
Newsql Cockroachdb
- Datenpersistenz verwendet Cockroachdb, eine relationale Datenbank, die verteilte Transaktionen unterstützt
- Die Verwendung von Kakerlachdb kann leicht horizontale Skalierung, Fehlertoleranz, automatische Wiederherstellung und Lastausgleich erzielen
Ich habe von V1.0 von V1.0 bis V1.0.6 verwendet, und Cockroachdb hatte seit der Veröffentlichung von V1.1 immer ein Crash -Problem. war nicht groß. Da sich fast alle Daten von Yivgame im Speicher befinden und nur DB beim Speichern geschrieben werden muss, gibt es für das gesamte Yivgame -System keinen DB -Leistungsgpass.
Modell
Kommunikationsdiagramm

- Kommunikationsmethode
- HTTP: HTTP ist eine kurze Verbindung, die hauptsächlich für die Kommunikation im Hintergrundbetriebssystem verwendet wird.
- WebSocket: Der Kunde wird mit Cocos Creator entwickelt, und die Long-Connect-Kommunikation unterstützt WebSocket.
- GRPC: Basierend auf HTTP/2-Protokoll-GRPC kann die Mehrstream-Kommunikation auf einer Socket-Verbindung realisieren.
- Datenformat
- JSON: Aufgrund der Selbstinterpretation des JSON-Formats wird es hauptsächlich für den Datenaustausch zwischen kurzen Verbindungen und Backend-Betriebssystemschnittstellen im Spiel verwendet.
- Protobuf: Hauptsächlich für den Datenaustausch zwischen Client und Server WebSocket und Micro-Service verwendet
Service -Komponenten -Diagramm

- Agent: Es wird hauptsächlich für den Kundenzugriff verwendet. und leicht zu erweitern zu erweitern
- UserCenter: Alle Spielerdaten werden im User Center verwaltet, und das Benutzerzentrum ist für das Lesen, Schreiben, Löschen, Ändern und Überprüfen von Spieldaten verantwortlich. .
- Game Server: Hauptsächlich verantwortlich für die Verarbeitung der Spiele Geschäftslogik
Identitätsauthentifizierung und Authentifizierung

- Verwenden Sie JWT, um zwischen Diensten zu authentifizieren
- Einzelanmeldung durch das API-Gateway
- Machen Sie weltweit Authentifizierung und Autorisierung in jedem Microservice
Abhängigkeit von Einrichtungen
- Docker: Alle Abhängigkeitseinrichtungen und Spielinstanzen werden über die Docker Community -Version eingesetzt
- Rockcoach: Als anhaltende Datenbank
- Kafka: Als Message Warteschlange und Stream -Plattform
- etcd: Für die Service -Entdeckung
- GOGs: Verwenden Sie GOGs für das Versionsverwaltung
- Bind9: Domänenname -Server, nahtloses Wechsel von Entwicklungs- und Testnetzwerken durch Schalten der Domänennamenauflösung
Go-Kit-Generator
- YIV/GK: Go-Kit-Codegenerator ist eine handelektrische Bohrung. Um eine Service -Schnittstelle zu schreiben, muss jeder einen vollständigen Satz von Endpunkten, Set und Transport schreiben. Sie haben das Gefühl, dass Sie sich wiederholt und dass Sie nach mehrmals gesucht haben. war noch nicht perfekt, und es war nicht vollständig für mich anwendbar, also habe ich es selbst geändert und selbst geändert und es automatisch Code generiert, wodurch der Duplikat Code um 60% reduziert wird, wenn es wichtig ist. Wahrscheinlichkeit von Fehlern.
Systemumgebung
beziehen sich auf
- Gonet/2: Yivgame hat viele Designs von Gonet absorbiert, z. B. die Verwendung von Stream für transparente Übertragung, Einführung von Kafka usw.
- Go-Kit: Yivgame wird basierend auf Go-Kit entwickelt
- Goddd: Eine Beispiel -App, die auf Domänenmodell basiert, die in Go geschrieben wurden
- Praktische Persistenz in Go: Organisieren des Datenbankzugriffs
- Die saubere Architektur
- Anwenden der sauberen Architektur für Anwendungen
- Ein Beitrag, um die hierarchische Struktur zu verstehen
Einige Gedanken zum Design
- Die Komplexität des Systems verschiebt sich nur und verschwindet nicht. .
- Go-Kit ist nicht geeignet, um einfach zu verwendende, kurze, flache und schnelle Ziele zu verfolgen. hilft logische Entkopplung.
- Go-Kit beginnt mit der Service-Schnittstelle, konzentriert sich auf Geschäftsbereiche.
- Verfolgen Sie keine Freiheit, sondern verfolgen Sie die Freiheit der Software ist nicht kostenlos, da es das Ergebnis definiert, dass die mit ihm geschriebenen Dienste ähnlich aussehen. Es ist so großartig, dass der Code wie ein Gemälde geschrieben ist und kompiliert und ausgeführt werden kann.
- Die Codec und die Kommunikation von Microservice -Aufrufen beträgt etwa 2 Millisekunden, und die inländische gegenseitige Ping -Verzögerung beträgt normalerweise 40 ms.
- Egal, ob es sich um einen Rahmen oder eine Sprache handelt, die nur Werkzeuge sind Wenn die Werkzeuge die besten sind, werden sie schlecht sein, wenn sie nicht gut verwendet werden.