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中文网其他相关文章!