Preise

Schnellstart

Quelldateien

Diese Seite wurde aus den folgenden Quelldateien erstellt:

Gochat ist ein verteiltes Chat-System, das auf einer modularen Microservice-Architektur basiert. Das System verwendet Docker als primäre Laufzeitumgebung und kombiniert mehrere Technologien wie Go, etcd, Redis und SQLite, um eine skalierbare Echtzeit-Kommunikationsplattform bereitzustellen.

Voraussetzungen und Umgebung

Das Projekt benötigt Docker als primäre Laufzeitumgebung. Das Docker-Image basiert auf golang:1.18 und enthält alle notwendigen Abhängigkeiten für den Betrieb (docker/Dockerfile:1-29).

Erforderliche Abhängigkeiten:

KomponenteVersionZweck
Go1.18Laufzeitumgebung und Kompilierung
etcdv3.4.3Service Discovery und Koordination
Redis5.0.9Caching und Session-Verwaltung
SQLite3-Lokale Datenbank (Standardkonfiguration)
Supervisor-Prozessmanagement innerhalb des Containers

Das Projekt verwendet mehrere Go-Abhängigkeiten, darunter gin-gonic/gin für HTTP-Routing, gorilla/websocket für WebSocket-Unterstützung, jinzhu/gorm für Datenbankoperationen sowie rpcx für RPC-Kommunikation zwischen den Microservices (go.mod:1-22).

Systemanforderungen:

  • Docker muss installiert und ausgeführt sein
  • Ausreichend Speicherplatz für Docker-Images (ca. 1 GB)
  • Netzwerkzugriff für das Herunterladen von Abhängigkeiten

Projekt starten mit Docker

Der empfohlene Weg zum Starten des Projekts ist die Verwendung des mitgelieferten run.sh-Skripts. Dieses Skript automatisiert die Container-Erstellung und -Konfiguration für verschiedene Umgebungen (run.sh:1-95).

Startbefehle:

bash
1# Entwicklungsumgebung starten
2sh run.sh dev 127.0.0.1
3
4# Produktionsumgebung starten
5sh run.sh prod <IP-ADRESSE>

Das Skript führt eine Validierung der IP-Adresse durch, bevor der Container gestartet wird. Bei ungültigen Eingaben wird eine Fehlermeldung angezeigt (run.sh:8-37).

Port-Mapping:

Externer PortInterner PortDienst
80808080Website (Frontend)
70707070API-Server
70007000WebSocket-Verbindungen
70017001Zusätzliche Dienste
70027002Zusätzliche Dienste

Das Docker-Image lockgit/gochat:1.18 wird standardmäßig für beide Umgebungen verwendet (run.sh:42-47).

Eigenes Docker-Image erstellen:

Falls eine angepasste Version benötigt wird, kann ein eigenes Image erstellt werden:

bash
1# Image mit spezifischem Tag erstellen
2make build TAG=1.18
3# oder
4make build TAG=latest

Der Build-Prozess verwendet das Dockerfile im docker/-Verzeichnis (Makefile:1-4).

Initialisierung und Hot-Reload

Nach dem Start des Containers wird automatisch das reload.sh-Skript ausgeführt. Dieses Skript übernimmt die Initialisierung der Anwendung und die Konfiguration der Netzwerkadressen (reload.sh:1-18).

Initialisierungsschritte:

  1. IP-Adress-Konfiguration: Das Skript ersetzt die IP-Adressen in den Frontend-JavaScript-Dateien durch die beim Start übergebene Adresse (reload.sh:5-10)

  2. Kompilierung: Die Go-Binary wird mit CGO-Flags kompiliert, um SQLite3-Warnungen zu unterdrücken (reload.sh:12-14)

  3. Prozess-Neustart: Supervisor startet alle Dienste neu (reload.sh:15-16)

Container-Konfiguration:

Der Docker-Container wird mit mehreren Volume-Mounts konfiguriert, um die Entwicklung zu erleichtern (run.sh:51-72):

  • Quellcode-Mount für Live-Entwicklung
  • Supervisor-Konfigurationsdateien
  • Redis-Konfiguration

Umgebungsvariablen:

VariableBeschreibung
TZZeitzone (Asia/Shanghai)
RUN_MODEBetriebsmodus (dev/prod)
HOST_IPIP-Adresse für Netzwerkkommunikation
ETCD_DATA_DIRDatenverzeichnis für etcd

Anwendungsarchitektur verstehen

Die Anwendung folgt einer modularen Architektur mit klar getrennten Komponenten. Der Einstiegspunkt in main.go ermöglicht die Auswahl verschiedener Betriebsmodi über Kommandozeilenparameter (main.go:1-48).

Verfügbare Module:

ModulBeschreibung
logicGeschäftslogik-Verarbeitung
connect_websocketWebSocket-Verbindungsserver
connect_tcpTCP-Verbindungsserver
taskHintergrundverarbeitung
apiHTTP-API-Server
siteStatische Website

Die Modulauswahl erfolgt über das -module Flag:

bash
1# Beispiel: API-Server starten
2./gochat.bin -module api

Jedes Modul wird als eigenständiger Prozess ausgeführt und kann unabhängig skaliert werden (main.go:26-42).

Architektur-Übersicht:

正在加载图表渲染器...

Der API-Server verwendet das Gin-Framework und implementiert einen HTTP-Server mit konfigurierbarem Port (api/chat.go:1-67).

Datenbank und RPC-Kommunikation

Das Projekt verwendet SQLite als Standarddatenbank mit GORM als ORM-Schicht. Die Datenbankverbindung wird beim Start initialisiert und mit Verbindungspooling konfiguriert (db/db.go:1-57).

Datenbankkonfiguration:

go
1// Verbindungsparameter (aus db/db.go)
2MaxIdleConns: 4
3MaxOpenConns: 20
4ConnMaxLifetime: 8 * time.Second

Die Datenbankdatei wird unter ./db/gochat.sqlite3 gespeichert. Im Entwicklungsmodus ist das Logging aktiviert (db/db.go:28-37).

RPC-Kommunikation:

Die Microservices kommunizieren über RPC mit etcd als Service-Discovery-Mechanismus. Der Task-Service initialisiert RPC-Clients für die Verbindung zur Connect-Ebene (task/rpc.go:1-110).

RPC-Client-Initialisierung:

go
1// etcd Discovery Konfiguration
2etcdConfig := config.Conf.Common.CommonEtcd
3d, e := etcdV3.NewEtcdV3Discovery(
4    etcdConfig.BasePath,
5    etcdConfig.ServerPathConnect,
6    []string{etcdConfig.Host},
7    true,
8    etcdConfigOption,
9)

Der RPC-Client verwaltet eine Map von Server-Instanzen und implementiert Round-Robin-Load-Balancing für die Verteilung von Anfragen (task/rpc.go:42-57).

Laufzeitüberprüfung und Validierung

Nach erfolgreichem Start kann die Anwendung über verschiedene Endpunkte überprüft werden.

Erfolgsanzeichen:

Das reload.sh-Skript gibt bei erfolgreicher Initialisierung eine Bestätigungsmeldung aus:

Beautiful ! Now, You can visit http://127.0.0.1:8080 , start the world.

(reload.sh:17-18)

Überprüfungsbefehle:

bash
1# Container-Status prüfen
2docker ps | grep gochat
3
4# Container-Logs anzeigen
5docker logs gochat-dev
6
7# Laufende Prozesse im Container
8docker exec gochat-dev supervisorctl status

Verfügbare Endpunkte nach dem Start:

URLBeschreibung
http://127.0.0.1:8080Web-Frontend
http://127.0.0.1:7070API-Endpunkte
ws://127.0.0.1:7000/wsWebSocket-Verbindungen

Datenbankverbindung testen:

bash
1# SQLite-Datenbank im Container prüfen
2docker exec gochat-dev ls -la /go/src/gochat/db/

Häufige Probleme und Lösungen

Problem 1: IP-Adress-Validierungsfehler

Symptom: Das Skript bricht mit der Meldung "ip address error !!!" ab.

Ursache: Die angegebene IP-Adresse entspricht nicht dem erwarteten Format.

Lösung: Sicherstellen, dass eine gültige IPv4-Adresse im Format x.x.x.x angegeben wird, wobei jeder Wert zwischen 0 und 255 liegt (run.sh:12-22).

bash
1# Korrekte Verwendung
2sh run.sh dev 192.168.1.100

Problem 2: Docker-Container startet nicht

Symptom: Der Container wird erstellt, aber die Dienste sind nicht erreichbar.

Ursache: Ports werden bereits von anderen Diensten verwendet.

Lösung: Prüfen, ob die Ports 8080, 7070, 7000-7002 verfügbar sind:

bash
1# Port-Belegung prüfen
2netstat -tlnp | grep -E '8080|7070|700[0-2]'
3
4# Laufende Container stoppen
5docker stop gochat-dev
6docker rm gochat-dev

Problem 3: Modul-Parameterfehler

Symptom: Die Anwendung startet mit der Meldung "exiting,module param error!" und beendet sich sofort.

Ursache: Kein oder ein ungültiger Modulname wurde angegeben.

Lösung: Nur gültige Modulnamen verwenden: logic, connect_websocket, connect_tcp, task, api, site (main.go:39-41).

Problem 4: etcd-Verbindungsfehler

Symptom: RPC-Clients können keine Verbindung zum etcd-Server herstellen.

Ursache: etcd ist nicht gestartet oder nicht erreichbar.

Lösung: Die etcd-Konfiguration in der Supervisor-Konfiguration prüfen. etcd wird automatisch im Container gestartet (需要确认: genaue Supervisor-Konfigurationsdatei nicht in den Quelldateien enthalten).

Problem 5: Datenbankfehler

Symptom: "connect db fail" Fehlermeldung in den Logs.

Ursache: Die SQLite-Datenbankdatei kann nicht erstellt oder geöffnet werden.

Lösung: Dateiberechtigungen und Verzeichnisstruktur prüfen (db/db.go:39-41).

bash
1# Verzeichnisberechtigungen prüfen
2docker exec gochat-dev ls -la /go/src/gochat/db/

Nächste Schritte

Nach erfolgreicher Inbetriebnahme können folgende Aspekte vertieft werden:

  1. API-Dokumentation: Die verfügbaren API-Endpunkte und deren Verwendung sind im Abschnitt zur API-Referenz dokumentiert.

  2. Konfiguration: Anpassung der Umgebungsvariablen und Konfigurationsdateien für spezifische Einsatzszenarien.

  3. Skalierung: Deployment mehrerer Instanzen der verschiedenen Module für Hochverfügbarkeit.

  4. Produktionsbereitstellung: Änderung der Datenbank von SQLite zu MySQL für Produktionsumgebungen (Hinweis in db/db.go:27).

  5. Monitoring: Integration von Metriken und Logging für die Überwachung der verteilten Komponenten.