Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Amalan aplikasi go-zero dan RabbitMQ

Amalan aplikasi go-zero dan RabbitMQ

PHPz
PHPzasal
2023-06-23 12:54:101405semak imbas

Kini semakin banyak perusahaan mula menggunakan model seni bina perkhidmatan mikro, dan dalam seni bina ini, baris gilir mesej telah menjadi kaedah komunikasi yang penting, antaranya RabbitMQ digunakan secara meluas. Dalam bahasa Go, go-zero ialah rangka kerja yang telah muncul dalam beberapa tahun kebelakangan ini. Ia menyediakan banyak alat dan kaedah praktikal untuk membolehkan pembangun menggunakan baris gilir mesej dengan lebih mudah Di bawah ini kami akan memperkenalkan go-zero berdasarkan aplikasi praktikal dan amalan aplikasi RabbitMQ.

1. Gambaran Keseluruhan RabbitMQ

RabbitMQ ialah perisian baris gilir mesej sumber terbuka dan cekap Ia digunakan secara meluas dalam aplikasi peringkat perusahaan, meningkatkan skala sistem aplikasi dan kestabilan. RabbitMQ menggunakan protokol AMQP, yang merupakan spesifikasi yang mentakrifkan mesej operasi, yang membolehkan aplikasi berbeza bertukar maklumat tanpa sekatan bahasa.

Terdapat empat konsep dalam RabbitMQ: pengeluar, pengguna, baris gilir dan suis. Pengeluar ialah penghantar mesej, pengguna ialah penerima mesej, baris gilir adalah bekas penyimpanan mesej, dan suis adalah pusat penghalaan mesej, penghalaan mesej ke baris gilir yang sepadan.

2. Pengenalan kepada go-zero

go-zero ialah rangka kerja mikro berasaskan bahasa go Ia menyediakan banyak alat dan kaedah praktikal untuk memudahkan pembangun mereka bentuk dan membangunkan tinggi. prestasi, aplikasi perkhidmatan mikro kebolehpercayaan tinggi. Rangka kerja go-zero mengguna pakai prinsip reka bentuk yang ringan untuk memudahkan proses pembangunan dan meningkatkan kecekapan pembangunan.

Modul baris gilir mesej dalam go-zero menggunakan RabbitMQ, yang menyediakan sokongan baris gilir mesej yang lengkap, termasuk pengeluar, pengguna, baris gilir dan suis, dsb., membolehkan pembangun menggunakan RabbitMQ dengan cepat dan mudah untuk komunikasi pemesejan. Pada masa yang sama, go-zero juga menyediakan fungsi pengelogannya sendiri, yang boleh mengesan dan menganalisis operasi sistem dengan berkesan.

3. Cara menggunakan go-zero dan RabbitMQ

Di bawah ini kami akan memperkenalkan penggunaan go-zero dan RabbitMQ berdasarkan kes sebenar Kes ini adalah sistem pendaftaran dan log masuk pengguna yang mudah. Apabila pengguna mendaftar, sistem akan menyimpan maklumat pengguna dalam pangkalan data dan menghantar mesej kepada RabbitMQ pada masa yang sama, yang akhirnya akan diserahkan kepada pengguna untuk diproses. Pengguna bertanggungjawab untuk menyimpan maklumat pengguna dalam Redis untuk meningkatkan prestasi sistem.

3.1 Pengeluar

Kami mula-mula menentukan struktur maklumat pengguna untuk menyimpan maklumat pendaftaran pengguna.

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

Kemudian, kami mentakrifkan antara muka pengeluar untuk menghantar maklumat pengguna kepada RabbitMQ.

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

Kami menggunakan pelaksanaan RabbitMQ dalam pustaka "go-zero/messaging" untuk melaksanakan antara muka pengeluar Kod khusus adalah seperti berikut.

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

Kami menggunakan modul Redis dan Cache dalam pustaka "go-zero/stores" untuk menyimpan maklumat pengguna dalam Redis dan cache maklumat pengguna dalam Cache. Pada masa yang sama, kami menggunakan pelaksanaan RabbitMQ dalam perpustakaan "go-zero/message" untuk menghantar maklumat pengguna kepada RabbitMQ. Fungsi "NewMqProducer" digunakan untuk mencipta contoh pengeluar, dengan "amqpUrl" ialah URL sambungan RabbitMQ, "queueName" ialah nama baris gilir mesej dan "exchangeName" ialah nama suis. Fungsi "Terbitkan" digunakan untuk menghantar maklumat pengguna kepada RabbitMQ.

3.2 Pengguna

Seterusnya, kami mentakrifkan antara muka pengguna untuk menerima mesej daripada RabbitMQ dan menyimpan mesej dalam Redis.

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

type Handler func(data []byte) error

Kami menggunakan pelaksanaan RabbitMQ dalam pustaka "go-zero/messaging" untuk melaksanakan antara muka pengguna Kod khusus adalah seperti berikut.

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

Kami menggunakan modul Redis dan Cache dalam perpustakaan "go-zero/stores" untuk menyimpan maklumat pengguna dalam Redis. Pada masa yang sama, kami menggunakan pelaksanaan RabbitMQ dalam pustaka "go-zero/message" untuk menerima mesej daripada RabbitMQ. Fungsi "NewMqConsumer" digunakan untuk mencipta contoh pengguna, dengan "amqpUrl" ialah URL sambungan RabbitMQ, "queueName" ialah nama baris gilir mesej, "exchangeName" ialah nama suis dan "routingKey" ialah kekunci penghalaan, digunakan untuk menghalakan mesej ke baris gilir yang ditentukan. Fungsi "Consume" digunakan untuk menerima mesej daripada RabbitMQ dan menghantar mesej ke fungsi pemprosesan mesej "pengendali".

4. Ringkasan

Dalam artikel ini, kami memperkenalkan amalan penggunaan dan aplikasi go-zero dan RabbitMQ berdasarkan contoh aplikasi tertentu. go-zero menyediakan sokongan baris gilir mesej yang lengkap dan boleh menggunakan RabbitMQ dengan cepat dan mudah untuk komunikasi mesej. Pada masa yang sama, modul Redis dan Cache dalam perpustakaan "go-zero/stores" digunakan untuk meningkatkan prestasi sistem ke tahap yang baharu. Dengan populariti dan aplikasi go-zero secara beransur-ansur, saya percaya semakin banyak perusahaan dan pembangun akan menggunakan go-zero dan RabbitMQ untuk membina aplikasi perkhidmatan mikro yang berprestasi tinggi dan boleh dipercayai.

Atas ialah kandungan terperinci Amalan aplikasi go-zero dan RabbitMQ. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn