发布网友 发布时间:2024-09-05 08:13
共1个回答
热心网友 时间:2024-10-23 08:40
golang使用Nsq1.介绍
最近在研究一些消息中间件,常用的MQ如RabbitMQ,ActiveMQ,Kafka等。NSQ是一个基于Go语言的分布式实时消息平台,它基于MIT开源协议发布,由bitly公司开源出来的一款简单易用的消息中间件。
官方和第三方还为NSQ开发了众多客户端功能库,如官方提供的基于HTTP的nsqd、Go客户端go-nsq、Python客户端pynsq、基于Node.js的JavaScript客户端nsqjs、异步C客户端libnsq、Java客户端nsq-java以及基于各种语言的众多第三方客户端功能库。
1.1Features
1).Distributed
NSQ提供了分布式的,去中心化,且没有单点故障的拓扑结构,稳定的消息传输发布保障,能够具有高容错和HA(高可用)特性。
2).Scalable易于扩展
NSQ支持水平扩展,没有中心化的brokers。内置的发现服务简化了在集群中增加节点。同时支持pub-sub和load-balanced的消息分发。
3).OpsFriendly
NSQ非常容易配置和部署,生来就绑定了一个管理界面。二进制包没有运行时依赖。官方有Dockerimage。
4.Integrated高度集成
官方的Go和Python库都有提供。而且为大多数语言提供了库。
1.2组件
1.3拓扑结构
NSQ推荐通过他们相应的nsqd实例使用协同定位发布者,这意味着即使面对网络分区,消息也会被保存在本地,直到它们被一个消费者读取。更重要的是,发布者不必去发现其他的nsqd节点,他们总是可以向本地实例发布消息。
NSQ
首先,一个发布者向它的本地nsqd发送消息,要做到这点,首先要先打开一个连接,然后发送一个包含topic和消息主体的发布命令,在这种情况下,我们将消息发布到事件topic上以分散到我们不同的worker中。
事件topic会复制这些消息并且在每一个连接topic的channel上进行排队,在我们的案例中,有三个channel,它们其中之一作为档案channel。消费者会获取这些消息并且上传到S3。
nsqd
每个channel的消息都会进行排队,直到一个worker把他们消费,如果此队列超出了内存*,消息将会被写入到磁盘中。Nsqd节点首先会向nsqlookup广播他们的位置信息,一旦它们注册成功,worker将会从nsqlookup服务器节点上发现所有包含事件topic的nsqd节点。
nsqlookupd
2.Internals
2.1消息传递担保
1)客户表示已经准备好接收消息
2)NSQ发送一条消息,并暂时将数据存储在本地(在re-queue或timeout)
3)客户端回复FIN(结束)或REQ(重新排队)分别指示成功或失败。如果客户端没有回复,NSQ会在设定的时间超时,自动重新排队消息
这确保了消息丢失唯一可能的情况是不正常结束nsqd进程。在这种情况下,这是在内存中的任何信息(或任何缓冲未刷新到磁盘)都将丢失。
如何防止消息丢失是最重要的,即使是这个意外情况可以得到缓解。一种解决方案是构成冗余nsqd对(在不同的主机上)接收消息的相同部分的副本。因为你实现的消费者是幂等的,以两倍时间处理这些消息不会对下游造成影响,并使得系统能够承受任何单一节点故障而不会丢失信息。
2.2简化配置和管理
单个nsqd实例被设计成可以同时处理多个数据流。流被称为“话题”和话题有1个或多个“通道”。每个通道都接收到一个话题中所有消息的拷贝。在实践中,一个通道映射到下行服务消费一个话题。
在更底的层面,每个nsqd有一个与nsqlookupd的长期TCP连接,定期推动其状态。这个数据被nsqlookupd用于给消费者通知nsqd地址。对于消费者来说,一个暴露的HTTP/lookup接口用于轮询。为话题引入一个新的消费者,只需启动一个配置了nsqlookup实例地址的NSQ客户端。无需为添加任何新的消费者或生产者更改配置,大大降低了开销和复杂性。
2.3消除单点故障
NSQ被设计以分布的方式被使用。nsqd客户端(通过TCP)连接到指定话题的所有生产者实例。没有中间人,没有消息代理,也没有单点故障。
这种拓扑结构消除单链,聚合,反馈。相反,你的消费者直接访问所有生产者。从技术上讲,哪个客户端连接到哪个NSQ不重要,只要有足够的消费者连接到所有生产者,以满足大量的消息,保证所有东西最终将被处理。对于nsqlookupd,高可用性是通过运行多个实例来实现。他们不直接相互通信和数据被认为是最终一致。消费者轮询所有的配置的nsqlookupd实例和合并response。失败的,无法访问的,或以其他方式故障的节点不会让系统陷于停顿。
2.4效率
对于数据的协议,通过推送数据到客户端最大限度地提高性能和吞吐量的,而不是等待客户端拉数据。这个概念,称之为RDY状态,基本上是客户端流量控制的一种形式。
efficiency
2.5心跳和超时
组合应用级别的心跳和RDY状态,避免头阻塞现象,也可能使心跳无用(即,如果消费者是在后面的处理消息流的接收缓冲区中,操作系统将被填满,堵心跳)为了保证进度,所有的网络IO时间上限势必与配置的心跳间隔相关联。这意味着,你可以从字面上拔掉之间的网络连接nsqd和消费者,它会检测并正确处理错误。当检测到一个致命错误,客户端连接被强制关闭。在传输中的消息会超时而重新排队等待传递到另一个消费者。最后,错误会被记录并累计到各种内部指标。
2.6分布式
因为NSQ没有在守护程序之间共享信息,所以它从一开始就是为了分布式操作而生。个别的机器可以随便宕机随便启动而不会影响到系统的其余部分,消息发布者可以在本地发布,即使面对网络分区。
这种“分布式优先”的设计理念意味着NSQ基本上可以永远不断地扩展,需要更高的吞吐量?那就添加更多的nsqd吧。唯一的共享状态就是保存在lookup节点上,甚至它们不需要全局视图,配置某些nsqd注册到某些lookup节点上这是很简单的配置,唯一关键的地方就是消费者可以通过lookup节点获取所有完整的节点集。清晰的故障事件——NSQ在组件内建立了一套明确关于可能导致故障的的故障权衡机制,这对消息传递和恢复都有意义。虽然它们可能不像Kafka系统那样提供严格的保证级别,但NSQ简单的操作使故障情况非常明显。
2.7noreplication
不像其他的队列组件,NSQ并没有提供任何形式的复制和集群,也正是这点让它能够如此简单地运行,但它确实对于一些高保证性高可靠性的消息发布没有足够的保证。我们可以通过降低文件同步的时间来部分避免,只需通过一个标志配置,通过EBS支持我们的队列。但是这样仍然存在一个消息被发布后马上死亡,丢失了有效的写入的情况。
2.8没有严格的顺序
虽然Kafka由一个有序的日志构成,但NSQ不是。消息可以在任何时间以任何顺序进入队列。在我们使用的案例中,这通常没有关系,因为所有的数据都被加上了时间戳,但它并不适合需要严格顺序的情况。
2.9无数据重复删除功能
NSQ对于超时系统,它使用了心跳检测机制去测试消费者是否存活还是死亡。很多原因会导致我们的consumer无法完成心跳检测,所以在consumer中必须有一个单独的步骤确保幂等性。
3.实践安装过程
本文将nsq集群具体的安装过程略去,大家可以自行参考官网,比较简单。这部分介绍下笔者实验的拓扑,以及nsqadmin的相关信息。
3.1拓扑结构
topology
实验采用3台NSQD服务,2台LOOKUPD服务。
采用官方推荐的拓扑,消息发布的服务和NSQD在一台主机。一共5台机器。
NSQ基本没有配置文件,配置通过命令行指定参数。
主要命令如下:
LOOKUPD命令
NSQD命令
工具类,消费后存储到本地文件。
发布一条消息
3.2nsqadmin
对Streams的详细信息进行查看,包括NSQD节点,具体的channel,队列中的消息数,连接数等信息。
nsqadmin
channel
列出所有的NSQD节点:
nodes
消息的统计:
msgs
lookup主机的列表:
hosts
4.总结
NSQ基本核心就是简单性,是一个简单的队列,这意味着它很容易进行故障推理和很容易发现bug。消费者可以自行处理故障事件而不会影响系统剩下的其余部分。
事实上,简单性是我们决定使用NSQ的首要因素,这方便与我们的许多其他软件一起维护,通过引入队列使我们得到了堪称完美的表现,通过队列甚至让我们增加了几个数量级的吞吐量。越来越多的consumer需要一套严格可靠性和顺序性保障,这已经超过了NSQ提供的简单功能。
结合我们的业务系统来看,对于我们所需要传输的*消息,相对比较敏感,无法容忍某个nsqd宕机,或者磁盘无法使用的情况,该节点堆积的消息无法找回。这是我们没有选择该消息中间件的主要原因。简单性和可靠性似乎并不能完全满足。相比Kafka,ops肩负起更多负责的运营。另一方面,它拥有一个可复制的、有序的日志可以提供给我们更好的服务。但对于其他适合NSQ的consumer,它为我们服务的相当好,我们期待着继续巩固它的坚实的基础。
GitHubGo项目推荐|Golang下的命令行颜色渲染工具库|支持windowsGolang下的命令行色彩使用库,拥有丰富的色彩渲染输出,通用的API方法,兼容Windows系统
仓库名称:color
标星(star):221(不错哦,潜力股项目)
标星趋势
拷贝(fork):21
贡献人数:3
仓库大小:1MB
主要开发语言:Go
语言分布:Go:99.75%、Batchfile:0.25%
代码提交周期分布:
作者动态:
2星
Golang下的命令行色彩使用库,拥有丰富的色彩渲染输出,通用的API方法,兼容Windows系统
功能特色
程序员新视界:分享有趣、有料的程序员话题,每天进步一点点。
知识分享之Golang——精选的组件库、组件列表,各种golang组件都可找到知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。
知识分享系列目前包含Java、Golang、Linux、Docker等等。
awesome-go这个组件包含了各种golang中常用的组件,说白了就是一个精选的Go框架、库和软件的汇总表。
我们日常需要寻找各种golang组件时在这个列表中基本都可以快速找到。
golang命令行库Cobra的使用
写了2次才写完,内容很长,翻译了很久,内容来源于Cobragithub介绍。翻译完也更全面的了解了Cobra,功能相当强大完善,各种使用的场景都考虑到了。另外也扩展了一些其它知识,比如命令行玩法,Levenshteindistance等等。以下是正文:
Cobra提供简单的接口来创建强大的现代化CLI接口,比如git与go工具。Cobra同时也是一个程序,用于创建CLI程序
Cobra是建立在结构的命令、参数和标志之上。
命令代表操作,参数和标志是这些行动的修饰符。
最好的应用程序就像读取句子。用户会知道如何使用本机应用程序,因为他们将理解如何使用它。
比如下面的例子,server是命令,port是标志:
在下面的命令,我们告诉Git克隆url地址bare
使用Cobra很简单。首先,使用goget安装最新版本
然后在你项目里引用Cobra
通常基于Cobra的应用程序将遵循下面的组织结构,当然你也可以遵循自己的接口:
在Cobra应用程序中,通常main.go文件非常空洞。它主要只干一件事:初始化Cobra。
Cobra提供自己的程序来创建你的程序并且添加你想要的命令。这是最简单的方式把Cobra添加到你的程序里。
这里你能找到相关信息
使用Cobra,需要创建一个空的main.go文件和一个rootCmd文件。你可以选择在合适的地方添加额外的命令。
Cobra不需要特殊的构造函数。简单的就可以创建你的命令。
理想情况下你把这个放在在app/cmd/root.go
你会另外定义标志和处理配置init()函数。
比如cmd/root.go
你需要在main函数里执行root命令。
通常main.go文件非常空洞。它主要只干一件事:初始化Cobra。
其它的命令通常定义在cmd/目录下的自己文件内
如果你想创建一个version命令,你可以创建cmd/version.go文件,并在文件里这么写:
标志提供修饰符控制动作命令如何操作
当标志定义好了,我们需要定义一个变量来关联标志
'持久'表示每个在那个命令下的命令都将能分配到这个标志。对于全局标志,'持久'的标志绑定在root上。
Cobra默认只在目标命令上解析标志,父命令忽略任何局部标志。通过打开Command.TraverseChildrenCobra将会在执行任意目标命令前解析标志
你同样可以通过viper绑定标志:
在这个例子中,永久的标记author被viper绑定,注意,当用户没有给--author提供值,author不会被赋值。
标记默认是可选的,如果你希望当一个标记没有设置时,命令行报错,你可以标记它为必须的
验证位置参数可以通过Command的Args字段。
内置下列验证方法
一个设置自定义验证的例子
在下面的例子,我们定义了3个命令。2个在顶级,一个(cmdTimes)是其中一个顶级命令的子命令。在这个例子里,由于没有给rootCmd提供Run,单独的root是不能运行的,必须要有子命令。
我们仅为一个命令定义了标记。
更多关于flags的文档可以在找到
更完整大型程序的例子,可以查看Hugo.
当你的程序有子命令时,Cobra会自动给你程序添加help命令。当你运行‘apphelp’,会调用help命令。另外,help同样支持其它输入命令。例如,你有一个没有任何其它配置的命令叫‘create’,当你调用‘apphelpcreate’Corbra将会起作用。
下面的输入是Cobra自动生成的。除了命令和标志的定义,其它不再需要。
help就跟其它命令一样,并没有特殊的逻辑或行为。事实上,你也可以提供你自己help如果你想的话。
你能为默认的命令,提供你自己的help命令或模板。使用下面的方法:
后2个也将适用于任何子命令
当用户提供无效的标记或命令,Cobra将会返回用法。
你可能从上面的帮助意识到,默认的帮助将被嵌入到用法里然后作为输出。
你能提供你自己的用法函数或模板给Cobra使用。
比如帮助,方法和模板都可以重写。
如果Version字段设置到了根命令,Cobra会提供了一个顶层‘--version’标记。运行带上‘--version’标记的程序,将会按照模板版本信息。模板可以通过cmd.SetVersionTemplate(sstring)方法修改
在命令运行前或运行后,再运行方法非常容易。PersistentPreRun和PreRun方法将会在Run之前执行。PersistentPostRun和PostRun方法将会在Run之后执行。Persistent*Run方法会被子命令继承,如果它们自己没有定义的话。这些方法将按照下面的属性执行:
下面的例子,2个命令都使用了上面的特性。当子命令执行的时候,它将执行根命令的PersistentPreRun,但不会执行根命令的PersistentPostRun:
输出:
Cobra会自动输出建议,当遇到“unknowncommand”错误时。这使得当输入错误时,Cobra的行为类似git命令。例如:
建议会基于注册的子命令自动生成。使用了Levenshteindistance的实现。每一个注册的命令会匹配2个距离(忽略大小写)来提供建议。
如果你希望在你的命令里,禁用建议或虚弱字符串的距离,使用:
或
你可以通过SuggestFor来给命令提供明确的名词建议。这个特性允许当字符串不相近,但是意思与你的命令相近,别切你也不想给该命令设置别名。比如:
Cobra可以基于子命令,标记,等生成文档。以以下格式:
Cobra可以生成一个bash-completion文件。如果你给命令添加更多信息,这些completions可以非常强大和灵活。更多介绍在BashCompletions。
golangci-line工具介绍在ci过程中,经常有一些可以通过静态分析或者白盒检测去避免一些问题以及规范代码格式!使用Go语言一般是使用golangci-line作为代码检测工具!
参考官网:
安装:curl-sSfL|sh-s---b$(goenvGOPATH)/binv1.43.0
版本信息:golangci-lint--version
目前我司是自己二开的golangci-line,所以这里使用的开源版本,其实大同小异,就是开发了一些插件!
这个就是一个工具,集成了各类自动检测代码的工具,所以不需要本地安装太多的工具,只需要这个工具即可!
由于它需要一个go的项目,这里以我自己的项目去介绍,项目地址:,如果有同学想自己尝试下可以直接下载我这个项目!项目也比较规范!
其实执行golangci-lintrun-h就可以获取以下帮助
例如我经常使用的:我日常就是开启format功能!
1、默认使用的插件
2、默认没用的
3、presets分类:
具体可以参考我的:
主要是做一些无用代码检测,简化代码,格式化代码!然后执行golangci-lintrun--fix即可
热心网友 时间:2024-10-24 06:05
golang使用Nsq1.介绍
最近在研究一些消息中间件,常用的MQ如RabbitMQ,ActiveMQ,Kafka等。NSQ是一个基于Go语言的分布式实时消息平台,它基于MIT开源协议发布,由bitly公司开源出来的一款简单易用的消息中间件。
官方和第三方还为NSQ开发了众多客户端功能库,如官方提供的基于HTTP的nsqd、Go客户端go-nsq、Python客户端pynsq、基于Node.js的JavaScript客户端nsqjs、异步C客户端libnsq、Java客户端nsq-java以及基于各种语言的众多第三方客户端功能库。
1.1Features
1).Distributed
NSQ提供了分布式的,去中心化,且没有单点故障的拓扑结构,稳定的消息传输发布保障,能够具有高容错和HA(高可用)特性。
2).Scalable易于扩展
NSQ支持水平扩展,没有中心化的brokers。内置的发现服务简化了在集群中增加节点。同时支持pub-sub和load-balanced的消息分发。
3).OpsFriendly
NSQ非常容易配置和部署,生来就绑定了一个管理界面。二进制包没有运行时依赖。官方有Dockerimage。
4.Integrated高度集成
官方的Go和Python库都有提供。而且为大多数语言提供了库。
1.2组件
1.3拓扑结构
NSQ推荐通过他们相应的nsqd实例使用协同定位发布者,这意味着即使面对网络分区,消息也会被保存在本地,直到它们被一个消费者读取。更重要的是,发布者不必去发现其他的nsqd节点,他们总是可以向本地实例发布消息。
NSQ
首先,一个发布者向它的本地nsqd发送消息,要做到这点,首先要先打开一个连接,然后发送一个包含topic和消息主体的发布命令,在这种情况下,我们将消息发布到事件topic上以分散到我们不同的worker中。
事件topic会复制这些消息并且在每一个连接topic的channel上进行排队,在我们的案例中,有三个channel,它们其中之一作为档案channel。消费者会获取这些消息并且上传到S3。
nsqd
每个channel的消息都会进行排队,直到一个worker把他们消费,如果此队列超出了内存*,消息将会被写入到磁盘中。Nsqd节点首先会向nsqlookup广播他们的位置信息,一旦它们注册成功,worker将会从nsqlookup服务器节点上发现所有包含事件topic的nsqd节点。
nsqlookupd
2.Internals
2.1消息传递担保
1)客户表示已经准备好接收消息
2)NSQ发送一条消息,并暂时将数据存储在本地(在re-queue或timeout)
3)客户端回复FIN(结束)或REQ(重新排队)分别指示成功或失败。如果客户端没有回复,NSQ会在设定的时间超时,自动重新排队消息
这确保了消息丢失唯一可能的情况是不正常结束nsqd进程。在这种情况下,这是在内存中的任何信息(或任何缓冲未刷新到磁盘)都将丢失。
如何防止消息丢失是最重要的,即使是这个意外情况可以得到缓解。一种解决方案是构成冗余nsqd对(在不同的主机上)接收消息的相同部分的副本。因为你实现的消费者是幂等的,以两倍时间处理这些消息不会对下游造成影响,并使得系统能够承受任何单一节点故障而不会丢失信息。
2.2简化配置和管理
单个nsqd实例被设计成可以同时处理多个数据流。流被称为“话题”和话题有1个或多个“通道”。每个通道都接收到一个话题中所有消息的拷贝。在实践中,一个通道映射到下行服务消费一个话题。
在更底的层面,每个nsqd有一个与nsqlookupd的长期TCP连接,定期推动其状态。这个数据被nsqlookupd用于给消费者通知nsqd地址。对于消费者来说,一个暴露的HTTP/lookup接口用于轮询。为话题引入一个新的消费者,只需启动一个配置了nsqlookup实例地址的NSQ客户端。无需为添加任何新的消费者或生产者更改配置,大大降低了开销和复杂性。
2.3消除单点故障
NSQ被设计以分布的方式被使用。nsqd客户端(通过TCP)连接到指定话题的所有生产者实例。没有中间人,没有消息代理,也没有单点故障。
这种拓扑结构消除单链,聚合,反馈。相反,你的消费者直接访问所有生产者。从技术上讲,哪个客户端连接到哪个NSQ不重要,只要有足够的消费者连接到所有生产者,以满足大量的消息,保证所有东西最终将被处理。对于nsqlookupd,高可用性是通过运行多个实例来实现。他们不直接相互通信和数据被认为是最终一致。消费者轮询所有的配置的nsqlookupd实例和合并response。失败的,无法访问的,或以其他方式故障的节点不会让系统陷于停顿。
2.4效率
对于数据的协议,通过推送数据到客户端最大限度地提高性能和吞吐量的,而不是等待客户端拉数据。这个概念,称之为RDY状态,基本上是客户端流量控制的一种形式。
efficiency
2.5心跳和超时
组合应用级别的心跳和RDY状态,避免头阻塞现象,也可能使心跳无用(即,如果消费者是在后面的处理消息流的接收缓冲区中,操作系统将被填满,堵心跳)为了保证进度,所有的网络IO时间上限势必与配置的心跳间隔相关联。这意味着,你可以从字面上拔掉之间的网络连接nsqd和消费者,它会检测并正确处理错误。当检测到一个致命错误,客户端连接被强制关闭。在传输中的消息会超时而重新排队等待传递到另一个消费者。最后,错误会被记录并累计到各种内部指标。
2.6分布式
因为NSQ没有在守护程序之间共享信息,所以它从一开始就是为了分布式操作而生。个别的机器可以随便宕机随便启动而不会影响到系统的其余部分,消息发布者可以在本地发布,即使面对网络分区。
这种“分布式优先”的设计理念意味着NSQ基本上可以永远不断地扩展,需要更高的吞吐量?那就添加更多的nsqd吧。唯一的共享状态就是保存在lookup节点上,甚至它们不需要全局视图,配置某些nsqd注册到某些lookup节点上这是很简单的配置,唯一关键的地方就是消费者可以通过lookup节点获取所有完整的节点集。清晰的故障事件——NSQ在组件内建立了一套明确关于可能导致故障的的故障权衡机制,这对消息传递和恢复都有意义。虽然它们可能不像Kafka系统那样提供严格的保证级别,但NSQ简单的操作使故障情况非常明显。
2.7noreplication
不像其他的队列组件,NSQ并没有提供任何形式的复制和集群,也正是这点让它能够如此简单地运行,但它确实对于一些高保证性高可靠性的消息发布没有足够的保证。我们可以通过降低文件同步的时间来部分避免,只需通过一个标志配置,通过EBS支持我们的队列。但是这样仍然存在一个消息被发布后马上死亡,丢失了有效的写入的情况。
2.8没有严格的顺序
虽然Kafka由一个有序的日志构成,但NSQ不是。消息可以在任何时间以任何顺序进入队列。在我们使用的案例中,这通常没有关系,因为所有的数据都被加上了时间戳,但它并不适合需要严格顺序的情况。
2.9无数据重复删除功能
NSQ对于超时系统,它使用了心跳检测机制去测试消费者是否存活还是死亡。很多原因会导致我们的consumer无法完成心跳检测,所以在consumer中必须有一个单独的步骤确保幂等性。
3.实践安装过程
本文将nsq集群具体的安装过程略去,大家可以自行参考官网,比较简单。这部分介绍下笔者实验的拓扑,以及nsqadmin的相关信息。
3.1拓扑结构
topology
实验采用3台NSQD服务,2台LOOKUPD服务。
采用官方推荐的拓扑,消息发布的服务和NSQD在一台主机。一共5台机器。
NSQ基本没有配置文件,配置通过命令行指定参数。
主要命令如下:
LOOKUPD命令
NSQD命令
工具类,消费后存储到本地文件。
发布一条消息
3.2nsqadmin
对Streams的详细信息进行查看,包括NSQD节点,具体的channel,队列中的消息数,连接数等信息。
nsqadmin
channel
列出所有的NSQD节点:
nodes
消息的统计:
msgs
lookup主机的列表:
hosts
4.总结
NSQ基本核心就是简单性,是一个简单的队列,这意味着它很容易进行故障推理和很容易发现bug。消费者可以自行处理故障事件而不会影响系统剩下的其余部分。
事实上,简单性是我们决定使用NSQ的首要因素,这方便与我们的许多其他软件一起维护,通过引入队列使我们得到了堪称完美的表现,通过队列甚至让我们增加了几个数量级的吞吐量。越来越多的consumer需要一套严格可靠性和顺序性保障,这已经超过了NSQ提供的简单功能。
结合我们的业务系统来看,对于我们所需要传输的*消息,相对比较敏感,无法容忍某个nsqd宕机,或者磁盘无法使用的情况,该节点堆积的消息无法找回。这是我们没有选择该消息中间件的主要原因。简单性和可靠性似乎并不能完全满足。相比Kafka,ops肩负起更多负责的运营。另一方面,它拥有一个可复制的、有序的日志可以提供给我们更好的服务。但对于其他适合NSQ的consumer,它为我们服务的相当好,我们期待着继续巩固它的坚实的基础。
GitHubGo项目推荐|Golang下的命令行颜色渲染工具库|支持windowsGolang下的命令行色彩使用库,拥有丰富的色彩渲染输出,通用的API方法,兼容Windows系统
仓库名称:color
标星(star):221(不错哦,潜力股项目)
标星趋势
拷贝(fork):21
贡献人数:3
仓库大小:1MB
主要开发语言:Go
语言分布:Go:99.75%、Batchfile:0.25%
代码提交周期分布:
作者动态:
2星
Golang下的命令行色彩使用库,拥有丰富的色彩渲染输出,通用的API方法,兼容Windows系统
功能特色
程序员新视界:分享有趣、有料的程序员话题,每天进步一点点。
知识分享之Golang——精选的组件库、组件列表,各种golang组件都可找到知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。
知识分享系列目前包含Java、Golang、Linux、Docker等等。
awesome-go这个组件包含了各种golang中常用的组件,说白了就是一个精选的Go框架、库和软件的汇总表。
我们日常需要寻找各种golang组件时在这个列表中基本都可以快速找到。
golang命令行库Cobra的使用
写了2次才写完,内容很长,翻译了很久,内容来源于Cobragithub介绍。翻译完也更全面的了解了Cobra,功能相当强大完善,各种使用的场景都考虑到了。另外也扩展了一些其它知识,比如命令行玩法,Levenshteindistance等等。以下是正文:
Cobra提供简单的接口来创建强大的现代化CLI接口,比如git与go工具。Cobra同时也是一个程序,用于创建CLI程序
Cobra是建立在结构的命令、参数和标志之上。
命令代表操作,参数和标志是这些行动的修饰符。
最好的应用程序就像读取句子。用户会知道如何使用本机应用程序,因为他们将理解如何使用它。
比如下面的例子,server是命令,port是标志:
在下面的命令,我们告诉Git克隆url地址bare
使用Cobra很简单。首先,使用goget安装最新版本
然后在你项目里引用Cobra
通常基于Cobra的应用程序将遵循下面的组织结构,当然你也可以遵循自己的接口:
在Cobra应用程序中,通常main.go文件非常空洞。它主要只干一件事:初始化Cobra。
Cobra提供自己的程序来创建你的程序并且添加你想要的命令。这是最简单的方式把Cobra添加到你的程序里。
这里你能找到相关信息
使用Cobra,需要创建一个空的main.go文件和一个rootCmd文件。你可以选择在合适的地方添加额外的命令。
Cobra不需要特殊的构造函数。简单的就可以创建你的命令。
理想情况下你把这个放在在app/cmd/root.go
你会另外定义标志和处理配置init()函数。
比如cmd/root.go
你需要在main函数里执行root命令。
通常main.go文件非常空洞。它主要只干一件事:初始化Cobra。
其它的命令通常定义在cmd/目录下的自己文件内
如果你想创建一个version命令,你可以创建cmd/version.go文件,并在文件里这么写:
标志提供修饰符控制动作命令如何操作
当标志定义好了,我们需要定义一个变量来关联标志
'持久'表示每个在那个命令下的命令都将能分配到这个标志。对于全局标志,'持久'的标志绑定在root上。
Cobra默认只在目标命令上解析标志,父命令忽略任何局部标志。通过打开Command.TraverseChildrenCobra将会在执行任意目标命令前解析标志
你同样可以通过viper绑定标志:
在这个例子中,永久的标记author被viper绑定,注意,当用户没有给--author提供值,author不会被赋值。
标记默认是可选的,如果你希望当一个标记没有设置时,命令行报错,你可以标记它为必须的
验证位置参数可以通过Command的Args字段。
内置下列验证方法
一个设置自定义验证的例子
在下面的例子,我们定义了3个命令。2个在顶级,一个(cmdTimes)是其中一个顶级命令的子命令。在这个例子里,由于没有给rootCmd提供Run,单独的root是不能运行的,必须要有子命令。
我们仅为一个命令定义了标记。
更多关于flags的文档可以在找到
更完整大型程序的例子,可以查看Hugo.
当你的程序有子命令时,Cobra会自动给你程序添加help命令。当你运行‘apphelp’,会调用help命令。另外,help同样支持其它输入命令。例如,你有一个没有任何其它配置的命令叫‘create’,当你调用‘apphelpcreate’Corbra将会起作用。
下面的输入是Cobra自动生成的。除了命令和标志的定义,其它不再需要。
help就跟其它命令一样,并没有特殊的逻辑或行为。事实上,你也可以提供你自己help如果你想的话。
你能为默认的命令,提供你自己的help命令或模板。使用下面的方法:
后2个也将适用于任何子命令
当用户提供无效的标记或命令,Cobra将会返回用法。
你可能从上面的帮助意识到,默认的帮助将被嵌入到用法里然后作为输出。
你能提供你自己的用法函数或模板给Cobra使用。
比如帮助,方法和模板都可以重写。
如果Version字段设置到了根命令,Cobra会提供了一个顶层‘--version’标记。运行带上‘--version’标记的程序,将会按照模板版本信息。模板可以通过cmd.SetVersionTemplate(sstring)方法修改
在命令运行前或运行后,再运行方法非常容易。PersistentPreRun和PreRun方法将会在Run之前执行。PersistentPostRun和PostRun方法将会在Run之后执行。Persistent*Run方法会被子命令继承,如果它们自己没有定义的话。这些方法将按照下面的属性执行:
下面的例子,2个命令都使用了上面的特性。当子命令执行的时候,它将执行根命令的PersistentPreRun,但不会执行根命令的PersistentPostRun:
输出:
Cobra会自动输出建议,当遇到“unknowncommand”错误时。这使得当输入错误时,Cobra的行为类似git命令。例如:
建议会基于注册的子命令自动生成。使用了Levenshteindistance的实现。每一个注册的命令会匹配2个距离(忽略大小写)来提供建议。
如果你希望在你的命令里,禁用建议或虚弱字符串的距离,使用:
或
你可以通过SuggestFor来给命令提供明确的名词建议。这个特性允许当字符串不相近,但是意思与你的命令相近,别切你也不想给该命令设置别名。比如:
Cobra可以基于子命令,标记,等生成文档。以以下格式:
Cobra可以生成一个bash-completion文件。如果你给命令添加更多信息,这些completions可以非常强大和灵活。更多介绍在BashCompletions。
golangci-line工具介绍在ci过程中,经常有一些可以通过静态分析或者白盒检测去避免一些问题以及规范代码格式!使用Go语言一般是使用golangci-line作为代码检测工具!
参考官网:
安装:curl-sSfL|sh-s---b$(goenvGOPATH)/binv1.43.0
版本信息:golangci-lint--version
目前我司是自己二开的golangci-line,所以这里使用的开源版本,其实大同小异,就是开发了一些插件!
这个就是一个工具,集成了各类自动检测代码的工具,所以不需要本地安装太多的工具,只需要这个工具即可!
由于它需要一个go的项目,这里以我自己的项目去介绍,项目地址:,如果有同学想自己尝试下可以直接下载我这个项目!项目也比较规范!
其实执行golangci-lintrun-h就可以获取以下帮助
例如我经常使用的:我日常就是开启format功能!
1、默认使用的插件
2、默认没用的
3、presets分类:
具体可以参考我的:
主要是做一些无用代码检测,简化代码,格式化代码!然后执行golangci-lintrun--fix即可