Heim  >  Artikel  >  Backend-Entwicklung  >  Anwendungspraxis von Go-Zero und RabbitMQ

Anwendungspraxis von Go-Zero und RabbitMQ

PHPz
PHPzOriginal
2023-06-23 12:54:101405Durchsuche

Immer mehr Unternehmen beginnen nun, das Microservice-Architekturmodell zu übernehmen, und in dieser Architektur sind Nachrichtenwarteschlangen zu einer wichtigen Kommunikationsmethode geworden, unter denen RabbitMQ weit verbreitet ist. In der Go-Sprache ist Go-Zero ein Framework, das in den letzten Jahren entstanden ist. Es bietet Entwicklern eine einfachere Verwendung von Nachrichtenwarteschlangen. Im Folgenden stellen wir Go-Zero anhand praktischer Anwendungen vor und Anwendungspraxis von RabbitMQ.

1. Überblick über RabbitMQ

RabbitMQ ist eine Open-Source-Software für zuverlässige und effiziente Nachrichtenwarteschlangen. Sie wird häufig in Anwendungen auf Unternehmensebene eingesetzt und verbessert die Skalierbarkeit und Stabilität von Anwendungssystemen erheblich. RabbitMQ verwendet das AMQP-Protokoll, eine Spezifikation, die Betriebsnachrichten definiert, die es verschiedenen Anwendungen ermöglicht, Informationen ohne Sprachbeschränkungen auszutauschen.

In RabbitMQ gibt es vier Konzepte: Produzent, Verbraucher, Warteschlange und Austausch. Der Produzent ist der Absender von Nachrichten, der Verbraucher ist der Empfänger von Nachrichten, die Warteschlange ist der Speicherbehälter für Nachrichten und der Switch ist das Zentrum der Nachrichtenweiterleitung, indem er Nachrichten an die entsprechende Warteschlange weiterleitet.

2. Einführung in Go-Zero

Go-Zero ist ein auf der Go-Sprache basierendes Microservice-Framework, das es Entwicklern ermöglicht, Microservice-Anwendungen mit hoher Leistung und hoher Zuverlässigkeit zu entwerfen und zu entwickeln. Das Go-Zero-Framework übernimmt Leichtbauprinzipien, um den Entwicklungsprozess zu vereinfachen und die Entwicklungseffizienz zu verbessern.

Das Nachrichtenwarteschlangenmodul in Go-Zero verwendet RabbitMQ, das vollständige Unterstützung für Nachrichtenwarteschlangen bietet, einschließlich Produzenten, Verbraucher, Warteschlangen und Switches usw., sodass Entwickler RabbitMQ schnell und einfach für die Nachrichtenkommunikation verwenden können. Gleichzeitig bietet go-zero auch eine eigene Protokollierungsfunktion, mit der der Systembetrieb effektiv verfolgt und analysiert werden kann.

3. Verwendung von Go-Zero und RabbitMQ

Im Folgenden stellen wir die Verwendung von Go-Zero und RabbitMQ anhand eines praktischen Falls vor. Bei diesem Fall handelt es sich um ein einfaches Benutzerregistrierungs- und Anmeldesystem. Wenn sich ein Benutzer registriert, speichert das System die Benutzerinformationen in der Datenbank und sendet gleichzeitig die Nachricht an RabbitMQ, die schließlich zur Verarbeitung an den Verbraucher übergeben wird. Der Verbraucher ist dafür verantwortlich, Benutzerinformationen in Redis zu speichern, um die Systemleistung zu verbessern.

3.1 Produzent

Wir definieren zunächst eine Benutzerinformationsstruktur, um Benutzerregistrierungsinformationen zu speichern.

type User struct {
    Name     string `json:"name"`
    Password string `json:"password"`
    Email    string `json:"email"`
}

Dann definieren wir eine Produzentenschnittstelle zum Senden von Benutzerinformationen an RabbitMQ.

type Producer interface {
    Publish(ctx context.Context, data []byte) error
}

Wir verwenden die RabbitMQ-Implementierung in der „go-zero/messaging“-Bibliothek, um die Producer-Schnittstelle zu implementieren. Der spezifische Code lautet wie folgt.

import (
    "context"
    "encoding/json"
    "time"

    "github.com/gomodule/redigo/redis"
    "github.com/tal-tech/go-zero/core/logx"
    "github.com/tal-tech/go-zero/core/stores/cache"
    "github.com/tal-tech/go-zero/core/stores/redis/redisc"
    "github.com/tal-tech/go-zero/messaging"
    "github.com/tal-tech/go-zero/messaging/rabbitmq"
)

type mqProducer struct {
    publisher messaging.Publisher
    cache     cache.Cache
}

func NewMqProducer(amqpUrl, queueName, exchangeName string) Producer {
    pub := rabbitmq.NewPublisher(amqpUrl, rabbitmq.ExchangeOption(exchangeName))
    cacheConn := redisc.MustNewCache("localhost:6379", "")
    return &mqProducer{
        publisher: pub,
        cache:     cache.NewCache(cacheConn),
    }
}

func (producer *mqProducer) Publish(ctx context.Context, data []byte) error {
    defer producer.cache.Close()
    user := new(User)
    err := json.Unmarshal(data, &user)
    if err != nil {
        return err
    }
    err = producer.cache.Remember(user.Name, func() (interface{}, error) {
        return user, time.Second*3600
    })
    if err != nil {
        logx.Errorf("[Producer]remember cache first:%s", err.Error())
        return err
    }
    return producer.publisher.Publish(ctx, messaging.Message{
        Topic: producer.publisher.GetExchange() + "." + producer.publisher.GetQueue(),
        Body:  data,
    })
}

Wir verwenden die Redis- und Cache-Module in der „go-zero/stores“-Bibliothek, um Benutzerinformationen in Redis zu speichern und Benutzerinformationen im Cache zwischenzuspeichern. Gleichzeitig verwenden wir die RabbitMQ-Implementierung in der „go-zero/messaging“-Bibliothek, um Benutzerinformationen an RabbitMQ zu senden. Mit der Funktion „NewMqProducer“ wird eine Producer-Instanz erstellt, wobei „amqpUrl“ die Verbindungs-URL von RabbitMQ, „queueName“ der Name der Nachrichtenwarteschlange und „exchangeName“ der Name des Switches ist. Die Funktion „Veröffentlichen“ wird verwendet, um Benutzerinformationen an RabbitMQ zu senden.

3.2 Consumer

Als nächstes definieren wir eine Consumer-Schnittstelle, um Nachrichten von RabbitMQ zu empfangen und die Nachrichten in Redis zu speichern.

type Consumer interface {
    Consume(ctx context.Context, handler Handler) error
}

type Handler func(data []byte) error

Wir verwenden die RabbitMQ-Implementierung in der „go-zero/messaging“-Bibliothek, um die Verbraucherschnittstelle zu implementieren. Der spezifische Code lautet wie folgt.

type mqConsumer struct {
    consumer messaging.Consumer
    cache    cache.Cache
}

func NewMqConsumer(amqpUrl, queueName, exchangeName, routingKey string) (Consumer, error) {
    sub := rabbitmq.NewSubscriber(amqpUrl, rabbitmq.ExchangeOption(exchangeName))
    err := sub.Subscribe(context.Background(), "", func(msg messaging.Message) error {
        cacheConn := redisc.MustNewCache("localhost:6379", "")
        defer cacheConn.Close()
        user := new(User)
        err := json.Unmarshal(msg.Body, &user)
        if err != nil {
            return err
        }
        err = cacheConn.Remember(user.Name, func() (interface{}, error) {
            return user, time.Second*3600
        })
        if err != nil {
            logx.Errorf("[Consumer]remember cache:%s", err.Error())
            return err
        }
        return nil
    }, rabbitmq.QueueOption(queueName), rabbitmq.QueueDurable())
    if err != nil {
        return nil, err
    }
    return &mqConsumer{
        consumer: sub,
        cache:    cache.NewCache(redisc.MustNewCache("localhost:6379", "")),
    }, nil
}

func (consumer *mqConsumer) Consume(ctx context.Context, handler Handler) error {
    return consumer.consumer.StartConsuming(ctx, func(msg messaging.Message) error {
        return handler(msg.Body)
    })
}

Wir verwenden die Redis- und Cache-Module in der „go-zero/stores“-Bibliothek, um Benutzerinformationen in Redis zu speichern. Gleichzeitig nutzen wir die RabbitMQ-Implementierung in der „go-zero/messaging“-Bibliothek, um Nachrichten von RabbitMQ zu empfangen. Mit der Funktion „NewMqConsumer“ wird eine Consumer-Instanz erstellt, wobei „amqpUrl“ die Verbindungs-URL von RabbitMQ, „queueName“ der Name der Nachrichtenwarteschlange, „exchangeName“ der Name des Switch und „routingKey“ ist Der Routing-Schlüssel, der zum Weiterleiten von Nachrichten an die angegebene Warteschlange verwendet wird. Die Funktion „Consume“ wird verwendet, um Nachrichten von RabbitMQ zu empfangen und die Nachrichten an die Nachrichtenverarbeitungsfunktion „Handler“ zu senden.

4. Zusammenfassung

In diesem Artikel haben wir die Verwendung und Anwendungspraktiken von Go-Zero und RabbitMQ anhand konkreter Anwendungsbeispiele vorgestellt. go-zero bietet vollständige Unterstützung für Nachrichtenwarteschlangen und kann RabbitMQ schnell und einfach für die Nachrichtenkommunikation verwenden. Gleichzeitig werden die Redis- und Cache-Module in der „go-zero/stores“-Bibliothek verwendet, um die Leistung des Systems auf ein neues Niveau zu heben. Mit der zunehmenden Beliebtheit und Anwendung von Go-Zero glaube ich, dass immer mehr Unternehmen und Entwickler Go-Zero und RabbitMQ verwenden werden, um leistungsstarke und zuverlässige Microservice-Anwendungen zu erstellen.

Das obige ist der detaillierte Inhalt vonAnwendungspraxis von Go-Zero und RabbitMQ. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn