Jalankan pengguna dan api di pelabuhan golang

PHPz
Lepaskan: 2024-02-09 12:30:19
ke hadapan
628 orang telah melayarinya

在 golang 端口上运行消费者和 api

Dalam artikel ini, editor PHP Strawberry akan memperkenalkan cara menjalankan pengguna dan API pada port Golang pada masa yang sama. Dalam aplikasi moden, selalunya perlu untuk mengendalikan permintaan pengguna dan API secara serentak untuk memberikan pengalaman dan fungsi pengguna yang lebih baik. Sebagai bahasa pengaturcaraan yang cekap, Golang mempunyai ciri-ciri prestasi konkurensi dan ringan, yang sangat sesuai untuk membina aplikasi sedemikian. Melalui panduan artikel ini, anda akan belajar cara menggunakan Golang untuk menulis pengguna dan API serta menjalankannya pada port yang sama, sekali gus memudahkan penggunaan dan penyelenggaraan aplikasi. Mari mulakan!

Kandungan soalan

Saya mempunyai projek go api dan saya juga menjalankan thread pekerja (rabbitmq). Saya baru sahaja menemui isu di mana pekerja saya dan pendengar dan perkhidmatan http saya tidak berfungsi bersama. Apabila saya menjalankan pekerja, port api tidak dicapai.

Beginilah rupa kod saya.

app.go
Salin selepas log masuk
func (a *app) startworker() {

    connection, err := amqp091.dial(os.getenv("amqp_url"))
    if err != nil {
        panic(err)
    }
    defer connection.close()

    consumer, err := events.newconsumer(connection, database.getdatabase(a.database))
    if err != nil {
        panic(err)
    }
    consumer.listen(os.args[1:])

}

func (a *app) run(addr string) {
    logs := log.new(os.stdout, "my-service", log.lstdflags)

    server := &http.server{
        addr:         addr,
        handler:      a.router,
        errorlog:     logs,
        idletimeout:  120 * time.second, // max time for connections using tcp keep-alive
        readtimeout:  5 * time.second,
        writetimeout: 10 * time.second,
    }

    go func() {
        if err := server.listenandserve(); err != nil {
            logs.fatal(err)
        }
    }()

    // trap sigterm or interrupt and gracefully shutdown the server
    c := make(chan os.signal)
    signal.notify(c, os.interrupt)
    signal.notify(c, os.kill)

    sig := <-c
    logs.println("recieved terminate, graceful shutdown", sig)
    tc, _ := context.withtimeout(context.background(), 30*time.second)
    server.shutdown(tc)
}
Salin selepas log masuk

Ini milik saya

consumer.go
Salin selepas log masuk
// newconsumer returns a new consumer
func newconsumer(conn *amqp.connection, db *mongo.database) (consumer, error) {
    consumer := consumer{
        conn: conn,
        db:   db,
    }
    err := consumer.setup()
    if err != nil {
        return consumer{}, err
    }

    return consumer, nil
}

// listen will listen for all new queue publications
// and print them to the console.
func (consumer *consumer) listen(topics []string) error {

    ch, err := consumer.conn.channel()
    if err != nil {
        return err
    }

    defer ch.close()

    if err != nil {
        return err
    }
    msgs, err := ch.consume("update.package.rating", "", true, false, false, false, nil)

    if err != nil {
        return err
    }

    forever := make(chan bool)
    go func() {
        for msg := range msgs {
            switch msg.routingkey {
            case "update.package.rating":
                worker.ratepackage(packagerepo.newpackagesrepository(consumer.db), msg.body)
            }
            // acknowledege received event
            log.printf("received a message: %s", msg.body)
        }
    }()

    log.printf("[*] waiting for message [exchange, queue][%s, %s]. to exit press ctrl+c", getexchangename(), "update.package.rating")
    <-forever
    return nil
}
Salin selepas log masuk
main.go
Salin selepas log masuk
func main() {
    start := app.App{}
    start.StartApp()
    start.StartWorker()
    start.Run(":3006")
}
Salin selepas log masuk

Port 3006 tidak sampai.

Saya menggunakan gin-gonic untuk melayani permintaan http saya.

Sebarang bantuan dialu-alukan.

Penyelesaian

Saya menghadapi masalah yang sama apabila menggunakan rangka kerja gin. Menyelesaikan masalah dengan menjalankan pengguna saya dalam rutin pergi. Saya menghubungi pengguna saya seperti di bawah.

go notificationCallback.ConsumeBankTransaction()
Salin selepas log masuk

Kedua-dua pelayan dan pengguna rabbitmq berjalan dengan lancar. Masih pantau prestasi untuk melihat sama ada ia cukup teguh dan berdaya tahan.

Atas ialah kandungan terperinci Jalankan pengguna dan api di pelabuhan golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan