php小編草莓在這篇文章中將介紹如何在Golang連接埠上同時運行消費者和API。在現代應用程式中,往往需要同時處理消費者和API請求,以提供更好的使用者體驗和功能。 Golang作為一種高效的程式語言,具有並發效能和輕量級的特點,非常適合用於建立這樣的應用程式。透過本文的指導,您將學習如何使用Golang編寫消費者和API,並在同一個連接埠上運行它們,從而簡化應用程式的部署和維護。讓我們開始吧!
我有一個 go api 項目,我還執行一個工作執行緒 (rabbitmq)。我剛剛發現一個問題,我的工作人員和我的 http 監聽和服務不能一起工作。當我運行worker時,api端口未到達。
這是我的程式碼的樣子。
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) }
這是我的
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") }
未到達連接埠 3006。
我正在使用 gin-gonic 來服務我的 http 請求。
歡迎任何幫助。
我在使用 gin 框架時遇到了類似的問題。透過在 go 例程中運行我的消費者解決了這個問題。我像下面一樣調用了我的消費者。
go notificationCallback.ConsumeBankTransaction()
伺服器和rabbitmq消費者都無縫運作。仍然監視性能,看看它是否足夠健壯和有彈性。
以上是在 golang 連接埠上運行消費者和 api的詳細內容。更多資訊請關注PHP中文網其他相關文章!