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的详细内容,更多请关注编程网其它相关文章!