ホームページ  >  記事  >  バックエンド開発  >  go-zeroとRabbitMQの応用実践

go-zeroとRabbitMQの応用実践

PHPz
PHPzオリジナル
2023-06-23 12:54:101405ブラウズ

現在、ますます多くの企業がマイクロサービス アーキテクチャ モデルを採用し始めており、このアーキテクチャではメッセージ キューが重要な通信手段となっており、その中で RabbitMQ が広く使用されています。 Go 言語では、go-zero は近年登場したフレームワークであり、開発者がメッセージ キューをより簡単に使用できるようにするための実用的なツールやメソッドが数多く提供されています。以下では、実際のアプリケーションに基づいて go-zero を紹介します。とRabbitMQの応用実践。

1. RabbitMQ の概要

RabbitMQ は、オープンソースで信頼性が高く、効率的なメッセージ キュー ソフトウェアであり、エンタープライズ レベルのアプリケーションで広く使用されており、アプリケーション システムのスケーラビリティを大幅に向上させます。安定性。 RabbitMQ は、操作メッセージを定義する仕様である AMQP プロトコルを使用します。これにより、さまざまなアプリケーションが言語の制限なく情報を交換できるようになります。

RabbitMQ には、プロデューサー、コンシューマー、キュー、スイッチという 4 つの概念があります。プロデューサはメッセージの送信者、コンシューマはメッセージの受信者、キューはメッセージのストレージ コンテナで、スイッチはメッセージ ルーティングの中心となり、メッセージを対応するキューにルーティングします。

2. go-zero の概要

go-zero は、go 言語に基づいたマイクロサービス フレームワークであり、開発者が高度な設計と開発を容易にする多くの実用的なツールとメソッドを提供します。パフォーマンス、信頼性の高いマイクロサービス アプリケーション。 go-zero フレームワークは軽量設計原則を採用し、開発プロセスを簡素化し、開発効率を向上させます。

go-zero のメッセージ キュー モジュールは RabbitMQ を使用します。これは、プロデューサ、コンシューマ、キュー、スイッチなどを含む完全なメッセージ キュー サポートを提供し、開発者がメッセージング通信に RabbitMQ を迅速かつ簡単に使用できるようにします。同時に、go-zero はシステム動作を効果的に追跡および分析できる独自のログ機能も提供します。

3. go-zero と RabbitMQ の使い方

ここでは、簡単なユーザー登録とログインを行うシステムとして、実際の事例をもとに go-zero と RabbitMQ の使い方を紹介します。 。ユーザーが登録すると、システムはユーザー情報をデータベースに保存し、同時にメッセージを RabbitMQ に送信し、最終的には処理のためにコンシューマーに渡されます。コンシューマは、システムのパフォーマンスを向上させるために、Redis にユーザー情報を保存する責任があります。

3.1 プロデューサー

まず、ユーザー登録情報を格納するためのユーザー情報構造体を定義します。

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

次に、ユーザー情報を RabbitMQ に送信するためのプロデューサー インターフェイスを定義します。

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

「go-zero/messaging」ライブラリの RabbitMQ 実装を使用してプロデューサー インターフェイスを実装します。具体的なコードは次のとおりです。

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,
    })
}

「go-zero/stores」ライブラリの Redis および Cache モジュールを使用して、ユーザー情報を Redis に保存し、ユーザー情報を Cache にキャッシュします。同時に、「go-zero/messaging」ライブラリの RabbitMQ 実装を使用して、ユーザー情報を RabbitMQ に送信します。 「NewMqProducer」関数はプロデューサー インスタンスの作成に使用されます。「amqpUrl」は RabbitMQ の接続 URL、「queueName」はメッセージ キューの名前、「exchangeName」はスイッチの名前です。 「Publish」機能は、ユーザー情報を RabbitMQ に送信するために使用されます。

3.2 コンシューマ

次に、RabbitMQ からメッセージを受信し、そのメッセージを Redis に保存するためのコンシューマ インターフェイスを定義します。

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

type Handler func(data []byte) error

「go-zero/messaging」ライブラリの RabbitMQ 実装を使用してコンシューマ インターフェイスを実装します。具体的なコードは次のとおりです。

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)
    })
}

「go-zero/stores」ライブラリの Redis および Cache モジュールを使用して、ユーザー情報を Redis に保存します。同時に、「go-zero/messaging」ライブラリの RabbitMQ 実装を使用して、RabbitMQ からメッセージを受信します。 「NewMqConsumer」関数はコンシューマ インスタンスの作成に使用されます。「amqpUrl」は RabbitMQ の接続 URL、「queueName」はメッセージ キューの名前、「exchangeName」はスイッチの名前、「routingKey」はルーティング キー。指定されたキューにメッセージをルーティングするために使用されます。 「Consume」関数は、RabbitMQ からメッセージを受信し、メッセージ処理関数「ハンドラー」にメッセージを送信するために使用されます。

4. まとめ

この記事では、go-zeroとRabbitMQの使い方と応用実践を具体的な応用例に基づいて紹介します。 go-zero は完全なメッセージ キュー サポートを提供し、メッセージ通信に RabbitMQ を迅速かつ簡単に使用できます。同時に、「go-zero/stores」ライブラリの Redis および Cache モジュールを使用して、システムのパフォーマンスを新しいレベルに向上させます。 go-zero の普及と応用が徐々に進むにつれ、ますます多くの企業や開発者が go-zero と RabbitMQ を使用して高性能で信頼性の高いマイクロサービス アプリケーションを構築すると考えています。

以上がgo-zeroとRabbitMQの応用実践の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。