文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-02-09 13:26

关注

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯