Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Jalankan pengguna dan api di pelabuhan golang

Jalankan pengguna dan api di pelabuhan golang

PHPz
PHPzke hadapan
2024-02-09 12:30:19609semak imbas

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

Ini milik saya

consumer.go
// 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
}
main.go
func main() {
    start := app.App{}
    start.StartApp()
    start.StartWorker()
    start.Run(":3006")
}

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

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam