golang kafka
golang kafka https://github.com/Shopify/sarama https://github.com/bsm/sarama-cluster
golang kafka https://github.com/Shopify/sarama https://github.com/bsm/sarama-cluster
golang flag 获取命令行参数 flag.String("port", ":8080", "http listen port") 像flag.Int、flag.Bool、flag.String这样的函数格式都是一样的,第一个参数表示参数名称,第二个参数表示默认值,第三个参数表示使用说明和描述。flag.StringVar这样的函数第一个参数换成了变量地址,后面的参数和flag.String是一样的。 flag.Parse() 解析函数将会在碰到第一个非 flag 命令行参数时停止,非flag命令行参数是指不满足命令行语法的参数,如命令行参数为cmd -flag=true abc 则第一个非 flag 命令行参数为 “abc” 使用flag来操作命令行参数,支持的格式如下: -id=1 --id=1 -id 1 --id 1 package main import ( "flag" "fmt" ) func main() { ok := flag.Bool("ok", false, "is ok") id := flag.Int("id", 0, "id") port := flag.String("port", ":8080", "http listen port") var name string flag.StringVar(&name, "name", "123", "name") flag.Parse() fmt.Println("ok:", *ok) fmt.Println("id:", *id) fmt.Println("port:", *port) fmt.Println("name:", name) } 还是非常方便的。 ...
golang tcp socket Golang的主要 设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不可少也是至关重要的一部分。在日常应用中,我们也可以看到Go中的net以及其subdirectories下的包均是"高频+刚需",而TCP socket则是网络编程的主流,即便您没有直接使用到net中有关TCP Socket方面的接口,但net/http总是用到了吧,http底层依旧是用tcp socket实现的。 网络编程方面,我们最常用的就是tcp socket编程了,在posix标准出来后,socket在各大主流OS平台上都得到了很好的支持。关于tcp programming,最好的资料莫过于W. Richard Stevens 的网络编程圣经《UNIX网络 编程 卷1: socket 联网API》 了,书中关于tcp socket接口的各种使用、行为模式、异常处理讲解的十分细致。Go是自带runtime的跨平台编程语言,Go中暴露给语言使用者的tcp socket api是建立OS原生tcp socket接口之上的。由于Go runtime调度的需要,golang tcp socket接口在行为特点与异常处理方面与OS原生接口有着一些差别。这篇博文的目标就是整理出关于Go tcp socket在各个场景下的使用方法、行为特点以及注意事项。 模型 从tcp socket 诞生后, 网络编程架构模型也几经演化, 大致是: “每进程一个连接” –> “每线程一个连接” –> “Non-Block + I/O多路复用 (linux epoll/windows iocp/freebsd darwin kqueue/solaris Event Port)"。伴随着模型的演化,服务程序愈加强大,可以支持更多的连接,获得更好的处理性能。 目前主流web server一般均采用的都是"Non-Block + I/O多路复用” (有的也结合了多线程、多进程) 。不过I/O多路复用也给使用者带来了不小的复杂度,以至于后续出现了许多高性能的I/O多路复用框架, 比如libevent、libev、libuv等,以帮助开发者简化开发复杂性,降低心智负担。不过Go的设计者似乎认为I/O多路复用的这种通过回调机制割裂控制流的方式依旧复杂,且有悖于"一般逻辑"设计,为此Go语言将该"复杂性"隐藏在Runtime中了: Go开发者无需关注socket是否是 non-block的,也无需亲自注册文件描述符的回调,只需在每个连接对应的goroutine中以"block I/O"的方式对待socket处理即可,这可以说大大降低了开发人员的心智负担。一个典型的Go server端程序大致如下: //go-tcpsock/server.go func handleConn(c net.Conn) { defer c.Close() for { // read from the connection ...