【代码篇】从零开始一步步搭建自己的golang框架(七)

这个框架的目标是作为一个通用的框架,我希望它大而全,在日后可以直接作为我其他项目的基础模板,所以我还想继续给他添加一些功能,就当写一些demo进去吧。这篇文章,我将会添加一个队列的功能。

nsq

队列有很多种,我选择nsq。使用nsq需要知道以下几个概念:

  1. nsqd:负责维护队列的组件,接受消息排队和投递;
  2. nsqlookupd:管理nsq集群的组件;
  3. nsqadmin:nsq的web管理组件;
  4. topic:消息的集合。产生消息,需要指定该消息属于哪个topic的;
  5. channel:队列消息的副本。nsq消费者与nsqd或者nsqlookupd建立一个channel,并监听channel中的消息,从而实现消费。

了解了一些nsq的基础概念之后,我们先把nsq环境搭建起来,这里我们还是用docker-compose好了,以下是nsq的docker-compose.yaml。

version: ‘3‘
services:
  nsqlookupd:
    image: nsqio/nsq
    command: /nsqlookupd
    networks:
      - nsq-network
    hostname: nsqlookupd
    ports:
      - "4161:4161"
      - "4160:4160"
  nsqd:
    image: nsqio/nsq
    command: /nsqd --lookupd-tcp-address=nsqlookupd:4160 --broadcast-address=nsqd
    depends_on:
      - nsqlookupd
    hostname: nsqd
    networks:
      - nsq-network
    ports:
      - "4151:4151"
      - "4150:4150"
  nsqadmin:
    image: nsqio/nsq
    command: /nsqadmin --lookupd-http-address=nsqlookupd:4161
    depends_on:
      - nsqlookupd
    hostname: nsqadmin
    ports:
      - "4171:4171"
    networks:
      - nsq-network

networks:
  nsq-network:
    driver: bridge

启动了nsq服务之后,我们简单地验证一下,发布一条消息到nsq中:

curl -d ‘hello awesome‘ ‘http://127.0.0.1:4151/pub?topic=awesome‘

浏览器访问:http://localhost:4171/,我们也可以看到有相应的topic和产生。

接着我们修改一下代码,老规矩,先改配置:

"nsq_config":
  "topic": "awesome"
  "channel": "ch"
  "nsqlookupd_addr": "127.0.0.1:4161"
type NsqConfig struct {
    Topic          string `yaml:"topic"`
    Channel        string `yaml:"channel"`
    NsqLookupdAddr string `yaml:"nsqlookupd_addr"`
}

然后在mq.go中添加一个启动mq消费者的函数:

func StartMqServer() {
    conf := nsq.NewConfig()
    q, _ := nsq.NewConsumer(config.GetConfig().NsqConfig.Topic, config.GetConfig().NsqConfig.Channel, conf)
    q.AddHandler(nsq.HandlerFunc(func(message *nsq.Message) error {
        //do something when you receive a message
        logger.GetLogger().Info("receive", zap.String(config.GetConfig().NsqConfig.Topic, string(message.Body)))
        return nil
    }))
    err := q.ConnectToNSQLookupd(config.GetConfig().NsqConfig.NsqLookupdAddr)
    if err != nil {
        logger.GetLogger().Error("connect to nsqlookupd failed.", zap.Error(err))
        os.Exit(-1)
    }
}

同样在入口文件,启动它:

go mq.StartMqServer()

最后,我们写个生产者,生成一条消息,测试一下:

func TestProducer(t *testing.T)  {
    config := nsq.NewConfig()
    p, err := nsq.NewProducer("127.0.0.1:4150", config)

    if err != nil {
        log.Panic(err)
    }

    err = p.Publish("awesome", []byte("hello awesome"))
    if err != nil {
        log.Panic(err)
    }
}

完整的代码请见:https://github.com/TomatoMr/awesomeframework



欢迎关注我的公众号:onepunchgo,给我留言。

原文地址:https://blog.51cto.com/14664952/2471408

时间: 2024-10-14 11:21:06

【代码篇】从零开始一步步搭建自己的golang框架(七)的相关文章

【代码篇】从零开始一步步搭建自己的golang框架

前言 import cycle not allowed 不知道是不是有很多学习golang的新人会遇到这样的问题.包循环引用这个问题,让人很头疼,尤其是在项目越来越复杂的时候,出现这么一句报错,这意味着你可能需要修改很多代码,这对一个新人来讲压力很大.通常来讲,解决这个错误的办法是将需要引用的那个包抽象成接口,解耦后调用.但这不是我这个篇章想要讲的内容.这个系列主要讲的是如何从代码组织架构方面去避免这个问题.从零开始一步步搭建自己的golang框架.这个篇章将实现以下的功能: 一个通用的基础框架

【代码篇】从零开始一步步搭建自己的golang框架(四)

上篇文章讲到配置和日志已经初始化了,这篇文章接着把数据库和redis初始化完成. 初始化数据库 数据库orm我选用xorm.首先在config.json和config.go添加对应的数据库配置.config.json: "db_config": { "db_host": "127.0.0.1", "db_port": "3306", "db_user": "root"

【代码篇】从零开始一步步搭建自己的golang框架(六)

基本上这个基础框架拿到手之后就可以做一些自己想要做的改动了,比如你想添加个队列的插件,你可以在相应的目录里面进行修改了,但我想让它更通用一些,本篇文章将会启动一个websocket服务,并且把配置文件改成yaml格式. 修改配置 之所以想要把配置从json改为yaml,有以下几点原因: json主要是用于信息传输,而yaml更适合作为配置文件的格式来使用,两者的用途不一样: yaml格式看起来比json更加清晰: 在yaml文件中可以添加注释,让配置更加易懂. 在此,解析yaml文件用的包是"g

【代码篇】从零开始一步步搭建自己的golang框架(三)

上一篇文章里,我们定了项目基本目录结构.现在来回顾一下我的思路: 创建入口文件: 指定配置.日志目录: 指定数据库.队列.缓存组件目录: 创建数据处理的controller目录: 指定公共函数等杂项. 接下来,我们还是按照这个顺序填充代码. 入口文件 func main() { config.InitConfig() logger.InitLogger() } 暂且忽略一些实现细节,我们需要先初始化配置和日志,先来看看日志,我选用Uber的zap日志库.来看看日志模块怎么写? 日志 packag

不使用 vue-cli 与 vue 模版,使用 Vue2.x + webpack4.x 从零开始一步步搭建项目框架

说明 这是我根据慕课网上的一个课程 Vue+Webpack打造todo应用 过程一步步搭下来的框架,去掉了业务相关的逻辑. 项目最终的效果包括了引入vue框架:使用CSS预处理器:使用babel:引用图片等静态资源:区分开发环境与生成环境,并做相应优化等.基本接近真正做项目时候的配置. 但是!! 毕竟是我个人根据练习课程搭的框架,跟真实工作可能有区别,请谨慎直接用于工作环境!!! 项目的最终成果看这里:https://gitee.com/Dandelion_/vue-webpack-scaffo

一步步搭建 Spring Boot maven 框架的工程

摘要:让Spring应用从配置到运行更加快速,演示DIY Spring Boot 框架时,如何配置端口号,如何添加日志. Spring Boot 框架帮助开发者更容易地创建基于Spring的应用程序和服务,使得开发者能够快速地获得所需要的Spring功能. 提供了非功能性的大型项目类特性,如(如内嵌服务器.安全.度量.健康检查.外部化配置),内部封装了tomcat的一些核心jar包,将发布封装了,因此不需要将项目(war包)发布到外部tomcat上. 搭建一个简单的.基于Restfull 风格的

一步步搭建自己的博客 .NET版(3、注册登录功能)

前言 这次开发的博客主要功能或特点:    第一:可以兼容各终端,特别是手机端.    第二:到时会用到大量html5,炫啊.    第三:导入博客园的精华文章,并做分类.(不要封我)    第四:做个插件,任何网站上的技术文章都可以转发收藏 到本博客. 所以打算写个系类:<一步步搭建自己的博客> 一.一步步搭建自己的博客  .NET版(1.页面布局.blog迁移.数据加载) 二.一步步搭建自己的博客  .NET版(2.评论功能) 三.一步步搭建自己的博客  .NET版(3.注册登录功能) 四

一步步搭建物联网系统——GNU/Linux 强大且Free

GNU/Linux 强大且Free 什么是Linux Linux是一种自由和开放源码的类UNIX操作系统内核.目前存在着许多不同的Linux发行版,可安装在各种各样的电脑硬件设备,从手机.平 板电脑.路由器和影音游戏控制台,到桌上型电脑,大型电脑和超级电脑.Linux是一个领先的操作系统内核,世界上运算最快的10台超级电脑运行的都是基 于Linux内核的操作系统. Linux操作系统也是自由软件和开放源代码发展中最著名的例子.只要遵循GNU通用公共许可证,任何人和机构都可以自由地使用Linux的

android流媒体之硬编码【代码篇】

转载此处:http://www.apkbus.com/blog-86476-43829.html 上一篇文章进行了思路和16进制文件的分析.这篇该代码实现了.目前没有在真实手机上测试, android4.0之后的模拟器可以用模拟摄像头或者叫做webcam的[其实就是笔记本摄像头].之后会在程序安装包data/data/edu.ustb.videoencoder/下面会有h264.3gp,sps[存放sps数据].pps[存放pps数据].media.xml[存放找到mdat的位置],/sdcar