Ein verteiltes System ist ein System, das aus mehreren unabhängigen Computern besteht, deren Daten und Aufgaben gemeinsam genutzt werden. Diese Computer kommunizieren über das Netzwerk miteinander, um gemeinsam eine Aufgabe zu erledigen. In diesem System ist jeder Computer unabhängig und kann unterschiedliche Betriebssysteme und Programmiersprachen verwenden. Damit diese Computer zusammenarbeiten können, benötigen wir einen Rahmen, um ihren Betrieb zu koordinieren. In diesem Artikel stellen wir vor, wie Sie das Buffalo-Framework von Golang zur Implementierung eines verteilten Systems verwenden.
Golang ist eine effiziente Programmiersprache und die Verwendung von Golang in verteilten Systemen ist besser als in anderen Sprachen. Deshalb haben wir Golang als unsere Entwicklungssprache gewählt. Das Buffalo-Framework ist ein beliebtes Golang-Webframework, das die Vorteile einer schnellen Entwicklung und kollaborativen Entwicklung bietet. In diesem Rahmen können wir seine Automatisierungsdienste nutzen, um Anwendungen zu erstellen und zu verwalten.
Beim Erstellen eines verteilten Systems müssen wir die folgenden Faktoren berücksichtigen:
Lassen Sie uns nun einen Blick darauf werfen, wie Sie das Buffalo-Framework verwenden, um diese Funktionen zu implementieren.
Erstellen einer Buffalo-Anwendung
Wir müssen zunächst eine Buffalo-Anwendung auf dem Server erstellen. Wir können Buffalo CLI verwenden, um diese Aufgabe zu erfüllen. Installieren Sie die Buffalo CLI und erstellen Sie eine neue Buffalo-Anwendung über die folgende Befehlszeile:
$ go get -u -v github.com/gobuffalo/buffalo/cli/v2 $ buffalo new appname
Buffalo generiert eine grundlegende Anwendungsstruktur. Wir können den folgenden Befehl verwenden, um den Server zu starten:
$ buffalo dev
Dieser Befehl startet einen Webserver, und dann können wir http://127.0.0.1:3000 im Browser aufrufen, um die Anwendung anzuzeigen.
RESTful API erstellen
Als nächstes müssen wir eine RESTful API erstellen, damit Computer in einem verteilten System miteinander kommunizieren können. Um diese Aufgabe zu erfüllen, können wir die automatisierten Dienste im Buffalo-Framework nutzen.
Zuerst müssen wir einen Controller erstellen, der API-Anfragen verarbeitet. Wir können den folgenden Befehl verwenden, um einen Controller zu erstellen:
$ buffalo generate resource user name email
Dieser Befehl generiert einen Controller mit dem Namen „Benutzer“, und der Controller enthält zwei Parameter: „Name“ und „E-Mail“. Wir können dem Controller Logik hinzufügen, damit er auf verschiedene Arten von Anfragen reagieren kann.
Damit Computer in einem verteilten System miteinander kommunizieren können, müssen wir POST- und GET-Anfragen erstellen. Wir können den folgenden Code im Controller hinzufügen, um diese Anfragen zu verarbeiten:
func (v *UsersResource) Create(c buffalo.Context) error { user := &models.User{} if err := c.Bind(user); err != nil { return err } // Add validation logic here! tx := c.Value("tx").(*pop.Connection) if err := tx.Create(user); err != nil { return err } return c.Render(201, r.JSON(user)) } func (v *UsersResource) List(c buffalo.Context) error { users := &models.Users{} tx := c.Value("tx").(*pop.Connection) if err := tx.All(users); err != nil { return err } return c.Render(200, r.JSON(users)) }
Diese Codes verarbeiten POST- und GET-Anfragen und geben JSON-formatierte Antwortdaten an den Client zurück.
Verwendung des gRPC-Protokolls
Zusätzlich zur RESTful-API können wir auch das gRPC-Protokoll verwenden, um die Kommunikation zwischen Computern zu erreichen. Das Buffalo-Framework unterstützt das gRPC-Protokoll und wir können das Buffalo-gRPC-Plugin mit dem folgenden Befehl installieren:
$ buffalo plugins install buffalo-grpc
Als nächstes müssen wir den gRPC-Dienstcode für unsere Anwendung generieren. Wir können den folgenden Befehl verwenden, um Code zu generieren:
$ buffalo generate grpc user
Dieser Befehl generiert einen gRPC-Dienst mit dem Namen „user“.
Im serverseitigen Code müssen wir die im gRPC-Dienst definierten Methoden implementieren. Wir können diese Methoden im folgenden Code implementieren:
type UserServer struct{} func (s *UserServer) GetUser(ctx context.Context, req *user.GetUserRequest) (*user.GetUserResponse, error) { // Insert user retrieval logic here } func (s *UserServer) CreateUser(ctx context.Context, req *user.CreateUserRequest) (*user.User, error) { // Insert user creation logic here }
Im Client-Code können wir den folgenden Code verwenden, um den gRPC-Dienst aufzurufen:
conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure()) if err != nil { log.Fatalf("failed to connect: %s", err) } defer conn.Close() client := user.NewUserClient(conn) res, err := client.GetUser(context.Background(), &user.GetUserRequest{Id: "123"}) if err != nil { log.Fatalf("failed to get user: %s", err) } log.Printf("user: %v", res)
Verwenden von Redis als Cache in einem verteilten System
In einem verteilten System, in Um den Datenzugriff zu beschleunigen, verwenden wir normalerweise Caching. Redis ist ein beliebtes Caching-Tool, das verteilte Systeme unterstützt und es uns ermöglicht, Daten schnell zu speichern und abzurufen. Wir können Redis mit dem folgenden Befehl installieren:
$ brew install redis
Als nächstes können wir Redis als Cache in unserer Anwendung verwenden. Wir können den folgenden Befehl verwenden, um das Redis-Plugin zu installieren:
$ buffalo plugins install buffalo-redis
Als nächstes können wir den folgenden Code in der Anwendung verwenden, um Redis zu konfigurieren:
var ( RedisClient *redis.Client ) func init() { RedisClient = redis.NewClient(&redis.Options{ Addr: "localhost:6379", }) } func main() { app := buffalo.New(buffalo.Options{}) app.Use(midware.Redis(RedisClient)) // ... }
Als nächstes können wir den folgenden Code im Controller verwenden, um Daten im Redis Center zu speichern :
func (v *UsersResource) Create(c buffalo.Context) error { user := &models.User{} if err := c.Bind(user); err != nil { return err } // Add validation logic here! if err := RedisClient.Set("user_"+user.ID.String(), user, 0).Err(); err != nil { return err } // Add logic to store user in database return c.Render(201, r.JSON(user)) }
In diesem Beispiel speichern wir den Benutzer in einem Redis-Cache mit der ID des Benutzers als Schlüssel. Dadurch können wir die Benutzerdaten später schnell abrufen.
Lastausgleich erreichen
Abschließend müssen wir die Lastausgleichsfunktion implementieren. In einem verteilten System möchten wir in der Lage sein, Computern mit freien Rechenressourcen Rechenaufgaben zuzuweisen. Um diese Aufgabe zu erfüllen, können wir einen Reverse-Proxy-Server verwenden.
Nginx ist ein beliebter Reverse-Proxy-Server, der Lastausgleich und HTTPS-Verschlüsselung unterstützt. Wir können Nginx auf dem Server installieren und die folgende Konfigurationsdatei verwenden, um einen Lastausgleich zu erreichen:
http { upstream app_servers { server 127.0.0.1:3001; server 127.0.0.1:3002; server 127.0.0.1:3003; } server { listen 80; server_name example.com; location / { proxy_pass http://app_servers; } } }
Diese Konfigurationsdatei verteilt Anfragen an drei verschiedene Server und verwendet einen Round-Robin-Algorithmus, um zu entscheiden, an welchen Server die Anfrage verteilt werden soll.
Fazit
Durch die Verwendung des Buffalo-Frameworks können wir verteilte Systeme schnell implementieren und mehrere Kommunikationsprotokolle unterstützen, einschließlich RESTful API und gRPC. Wir können Redis auch verwenden, um den Datenzugriff zu beschleunigen und einen Lastausgleich zu erreichen, indem wir einen Reverse-Proxy-Server verwenden. Durch diese Methoden können wir verteilte Systeme effizienter machen und schnellere Rechengeschwindigkeiten erreichen.
Das obige ist der detaillierte Inhalt vonImplementierung verteilter Systeme mithilfe des Buffalo-Frameworks von Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!