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

2024年 2月 9日 60.5k 0

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

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 := 登录后复制

这是我的

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")
登录后复制

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的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论