Preise

Projektüberblick

Quelldateien

Diese Seite wurde aus den folgenden Quelldateien erstellt:

gochat ist ein leichtgewichtiges Instant-Messaging-System, das vollständig in Go implementiert wurde. Das System unterstützt sowohl private Nachrichten als auch Raum-Broadcasts und ermöglicht eine horizontale Skalierung durch RPC-basierte Kommunikation zwischen den einzelnen Ebenen. Besonders hervorzuheben ist die Unterstützung von WebSocket- und TCP-Verbindungen, die in der neuesten Version vollständig interoperabel sind – Nachrichten können nahtlos zwischen beiden Protokollen ausgetauscht werden readme.md:19-26.

Das Projekt zeichnet sich durch eine klare Architektur mit separaten Schichten für Verbindungsaufbau, Geschäftslogik, API und Task-Verarbeitung aus. Durch den Einsatz von etcd für Service Discovery und Redis als Nachrichten-Carrier wird eine flexible und erweiterbare Infrastruktur geschaffen, die sich leicht in verschiedenen Umgebungen deployen lässt readme.en.md:20-27.

Projektziele und Kernfunktionen

Hauptmerkmale des Systems

gochat wurde als reine Go-Implementierung eines Instant-Messaging-Systems konzipiert, mit folgenden zentralen Eigenschaften:

  • Dual-Protokoll-Unterstützung: Das System akzeptiert sowohl WebSocket- als auch TCP-Verbindungen, wobei beide Protokolle in der aktuellen Version vollständig interoperabel sind. Benutzer, die über unterschiedliche Protokolle verbunden sind, können nahtlos miteinander kommunizieren readme.md:21-22.
  • Horizontale Skalierbarkeit: Alle Ebenen des Systems können unabhängig voneinander horizontal skaliert werden. Die Kommunikation erfolgt über RPC, was eine flexible Verteilung der Last ermöglicht readme.md:20.
  • Service Discovery: Durch den Einsatz von etcd für die Service-Erkennung wird die dynamische Aktualisierung von IP-Adressen bei Hinzufügen oder Entfernen von Instanzen unterstützt. Andere Ebenen können diese Änderungen automatisch wahrnehmen readme.md:34.
  • Leichtgewichtige Nachrichtenübertragung: Redis dient als Carrier für Nachrichtenspeicherung und -zustellung. In Produktionsumgebungen kann Redis durch schwerere Lösungen wie Kafka oder RabbitMQ ersetzt werden readme.md:23.

Nachrichtentypen und Kommunikationsmuster

Das System unterstützt zwei primäre Nachrichtentypen:

  1. Private Nachrichten: Direkte Kommunikation zwischen zwei Benutzern. Die Task-Schicht lokalisiert die entsprechende Connect-Schicht anhand der userId und führt einen direkten RPC-Aufruf durch readme.en.md:100-102.
  2. Raum-Broadcasts: Nachrichten werden an alle Benutzer in einem bestimmten Raum gesendet. Die Task-Schicht ruft über RPC die Connect-Schicht auf, welche die Nachricht an alle relevanten Räume und deren Benutzer verteilt readme.en.md:96-99.

Aktuelle Entwicklungen und Verbesserungen

Die jüngsten Updates haben signifikante Verbesserungen gebracht:

  • Golang 1.18 Upgrade: Das Projekt erfordert nun Go 1.18 oder höher, mit Vendor-Support für einfachere Installation. Das gesamte Projekt inklusive Vendor ist etwa 66 MB groß readme.md:31-33.
  • Neue Benutzeroberfläche: Eine moderne React/TypeScript-basierte UI wurde entwickelt und ist unter einem separaten Repository verfügbar readme.md:29.
  • Flexible Modulstartreihenfolge: Seit November 2025 unterstützen alle Module eine beliebige Startreihenfolge, was die Betrieb und Wartung erheblich vereinfacht readme.md:36-37.

Systemarchitektur und Module

Architekturübersicht

gochat folgt einer modularen Microservice-Architektur mit klarer Trennung der Verantwortlichkeiten. Das System besteht aus sechs Hauptmodulen, die über einen zentralen Programmeinstieg in main.go gestartet werden:

go
1switch module {
2case "logic":
3    logic.New().Run()
4case "connect_websocket":
5    connect.New().Run()
6case "connect_tcp":
7    connect.New().RunTcp()
8case "task":
9    task.New().Run()
10case "api":
11    api.New().Run()
12case "site":
13    site.New().Run()
14}

main.go:26-38

Modulbeschreibungen

ModulVerantwortlichkeitSkalierbarkeit
logicEmpfängt RPC-Anfragen von Connect- und API-Schicht; pusht Nachrichten in WarteschlangenHorizontal
connect_websocketHält WebSocket-Long-Polling-Verbindungen; Echtzeit-Nachrichten-PushHorizontal
connect_tcpHält TCP-Long-Connections; Echtzeit-Nachrichten-PushHorizontal
taskKonsumiert Nachrichten aus Warteschlangen; RPC-Aufrufe an Connect-SchichtHorizontal
apiREST-API-Dienste; RPC-Aufrufe an Logic-SchichtHorizontal
siteStatische Webseiten; HTTP-Anfragen an API-SchichtHorizontal

readme.md:128-146

Architekturdiagramm

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

Bucket-Architektur für reduzierte Lock-Konkurrenz

Um die Performance bei hoher Nebenläufigkeit zu optimieren, implementiert die Connect-Schicht eine Bucket-basierte Architektur:

Connect-Schicht:
    Bucket: (Reduziert Lock-Konkurrenz)
        Room: (Chatraum)
            Channel: (Benutzersitzung)

readme.en.md:104-109

Diese Struktur verteilt Benutzer auf mehrere Buckets, wodurch die Lock-Konkurrenz bei gleichzeitigen Zugriffen signifikant reduziert wird. Jeder Bucket verwaltet seine eigenen Räume und Kanäle unabhängig.

Technologie-Stack und Abhängigkeiten

Kerntechnologien

Das Projekt basiert auf einem modernen und bewährten Technologie-Stack:

KomponenteTechnologieVersionZweck
SpracheGolang1.18+Kernimplementierung
DatenbankSQLite3/MySQL-Benutzerspeicherung
ORMGORM1.9.16Datenbankabstraktion
Service Discoveryetcd3.4.3Diensteregistrierung
RPC-Frameworkrpcx1.7.4Inter-Service-Kommunikation
Message QueueRedis5.0.9Nachrichtenübertragung
CacheRedis5.0.9Session-Speicherung

go.mod:1-22, readme.md:150-168

Abhängigkeitsanalyse

Die direkten Abhängigkeiten in go.mod umfassen:

go
1require (
2    github.com/bwmarrin/snowflake v0.3.0    // ID-Generierung
3    github.com/gin-gonic/gin v1.7.7          // HTTP-Framework
4    github.com/go-redis/redis v6.15.9        // Redis-Client
5    github.com/google/uuid v1.3.0            // UUID-Generierung
6    github.com/gorilla/websocket v1.5.0      // WebSocket-Unterstützung
7    github.com/jinzhu/gorm v1.9.16           // ORM
8    github.com/pkg/errors v0.9.1             // Fehlerbehandlung
9    github.com/spf13/viper v1.11.0           // Konfigurationsmanagement
10)
11
12require (
13    github.com/rpcxio/rpcx-etcd v0.1.0       // etcd-Integration für rpcx
14    github.com/smallnest/rpcx v1.7.4         // RPC-Framework
15)

go.mod:5-22

Datenfluss zwischen Komponenten

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

Dieser Sequenzdiagramm zeigt den vollständigen Nachrichtenfluss von Benutzer A zu Benutzer B. Die Nachricht durchläuft mehrere Schichten, wobei Redis als zentrale Queue für die asynchrone Verarbeitung dient readme.en.md:87-99.

Deployment und Betrieb

Docker-basierte Bereitstellung

Das Projekt bietet eine vollständige Docker-Unterstützung für einfache Installation und Betrieb:

dockerfile
1FROM golang:1.18
2WORKDIR /go/src/gochat
3COPY . .
4RUN apt-get update && apt-get install -y gcc automake autoconf libtool make supervisor
5# Installation von etcd und Redis
6ENV RUN_MODE dev

docker/Dockerfile:1-29

Build-Prozess

Der Build wird über ein Makefile automatisiert:

makefile
1build:
2    cd ./docker && docker build -t lockgit/gochat:${TAG} .

Makefile:1-4

Laufzeitumgebungen

Das System unterstützt verschiedene Laufzeitmodi:

  • dev: Entwicklungsumgebung (Standard)
  • prod: Produktionsumgebung

Die Umgebung wird über die Umgebungsvariable RUN_MODE konfiguriert docker/Dockerfile:27.

Infrastruktur-Komponenten

Die Docker-Installation umfasst alle notwendigen Infrastruktur-Komponenten:

  • etcd v3.4.3: Für Service Discovery und verteilte Konfiguration
  • Redis 5.0.9: Als Message Queue und Cache
  • Supervisor: Für Prozessmanagement

docker/Dockerfile:11-24

Verzeichnisstruktur

gochat/
├── api/                  # REST API-Schicht
├── architecture/         # Architektur-Diagramme
├── bin/                  # Kompilierte Binärdateien
├── config/               # Konfigurationsdateien
├── connect/              # Verbindungsschicht (WebSocket/TCP)
├── db/                   # Datenbank-Initialisierung
├── docker/               # Docker-Konfiguration
├── logic/                # Geschäftslogik-Schicht
├── main.go               # Programmeinstieg
├── proto/                # RPC-Protokolldefinitionen
├── site/                 # Statische Webseiten
├── task/                 # Task-Verarbeitungsschicht
├── tools/                # Hilfsprogramme
└── vendor/               # Abhängigkeiten

readme.md:127-148

Quantifizierte Projektkennzahlen

MetrikWert
Anzahl Hauptmodule6
Unterstützte Protokolle2 (WebSocket, TCP)
Go-Version1.18+
Projektgröße (mit Vendor)~66 MB
Direkte Abhängigkeiten10+
Skalierbare EbenenAlle (100%)

readme.md:31-32, go.mod:5-16

Anwendungsgebiete

gochat eignet sich für folgende Szenarien:

  • Echtzeit-Chat-Anwendungen: Private Nachrichten und Gruppenchats mit geringer Latenz
  • Live-Benachrichtigungssysteme: Push-Benachrichtigungen für Web- und Mobile-Anwendungen
  • Kollaborative Plattformen: Echtzeit-Zusammenarbeit mit WebSocket- und TCP-Unterstützung
  • IoT-Kommunikation: Machine-to-Machine-Kommunikation über TCP-Protokoll
  • Entwicklung und Testing: Durch Docker-Unterstützung schnell aufsetzbar

Bericht-Lesereihenfolge

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

Die empfohlene Lesereihenfolge beginnt mit diesem Überblick, gefolgt von der detaillierten Architektur- und Datenflussanalyse. Anschließend können entweder das API-Design oder das Datenmodell studiert werden, bevor der Deployment-Leitfaden abschließend die praktische Umsetzung behandelt.