golang

Golang实现的高性能HTTP负载工具

岁酱吖の 提交于 2019-12-01 09:51:01
Sniper Sniper是一个功能强大、高性能的HTTP负载工具,采用Golang编写。利用协程并发优势,实现海量并发、超低内存占用、丰富图表展示。是测试、分析、优化服务端性能的绝佳助手! ##体验 提供以下可执行文件,可直接运行 Darwin 64 bit Darwin 32 bit Linux 64 bit Linux 32 bit FreeBSD 64 bit FreeBSD 32 bit ##功能 以实用为原则,实现以下功能 GET / POST keep-alive模式 https 图表展示结果 测试多个目标 支持大文件负载 跨平台,支持Linux,FreeBSD,Darwin ###对比同类工具 ##性能 内存占用低于Apache Benchmark(ab)等主流负载工具 执行速度接近ab,高并发时超过ab 支持10k以上并发 支持超大文件测试 测试的详细情况,与各大负载测试工具的性能对比 在此 ##图表展示 统计分析每个请求 输出建立连接时间 输出服务端响应时间 输出总时间 基于 dygraphs 与html5,详细展现服务端性能情况 从测试结果中等距采样约1000样本,详细展现连接建立,链路传输和服务端执行情况 下图展示了总时间和连接建立时间的对比,Golang是怎样得到连接建立的时间呢? 原来项目基于net库实现了HTTP协议栈,重构而不是官方net

NSQ系列之nsqlookupd代码分析四(详解nsqlookupd中的RegitrationDB)

本小妞迷上赌 提交于 2019-12-01 09:50:34
NSQ系列之nsqlookupd代码分析四(详解nsqlookupd中的RegitrationDB操作方法) 上一章我们大致了解了 nsqlookupd 的 tcpServer 中的 IOLoop 协议的处理逻辑,里面有提到一个存储 nsqd 的 PeerInfo 以及 topic channel 数据信息的 RegitrationDB 的一些操作方法。今天我们就来讲解一下关于 RegitrationDB 的操作方法 废话不多说,直接上代码吧(代码位于nsq/nsqlookupd/regitration_db.go这个文件中) type RegistrationDB struct { sync.RWMutex //读写锁用于并发操作 registrationMap map[Registration]Producers //定义一个一Regitration为key producer指针的slice为value的map } type Registration struct { Category string Key string SubKey string } type Registrations []Registration //用于记录client相关信息 type PeerInfo struct { lastUpdate int64 //client 心跳包最后接收时间 id

NSQ系列之nsqlookupd代码分析三(详解tcpServer 中的IOLoop方法)

女生的网名这么多〃 提交于 2019-12-01 09:50:07
NSQ系列之nsqlookupd代码分析三(详解nsqlookupd tcpServer 中的IOLoop) 上一章我们大致了解了 nsqlookupd 中的 tcpServer 的大致的代码, tcpServer 与client也就 nsqd 之间协议处理在 IOLoop 这个方法中,今天我们就分析一下 IOLoop 这个方法 废话不多说,直接上代码吧(代码位于nsq/nsqlookupd/lookup_protocol_v1.go这个文件中) //这段代码位于nsq/nsqlookupd/client_v1.go这个文件中 type ClientV1 struct { net.Conn //组合net.Conn接口 peerInfo *PeerInfo //client的信息也就是前面所讲的product的信息 } //初始化一个ClientV1 func NewClientV1(conn net.Conn) *ClientV1 { return &ClientV1{ Conn: conn, } } //实现String接口 func (c *ClientV1) String() string { return c.RemoteAddr().String() } //定义ClientV1结束 type LookupProtocolV1 struct { ctx *Context

NSQ系列之nsqlookupd代码分析二(初识nsqlookupd tcpServer)

百般思念 提交于 2019-12-01 09:49:51
NSQ系列之nsqlookupd代码分析二(初识nsqlookupd tcpServer) 在上一章 nsqlookupd 初探中了解到, nsqlookupd 中开启了一个 tcpServer 和一个 httpServer ,那么今天我们来初步了解下 tcpServer 。 废话不多说,直接上代码吧,简单粗暴点比较好。 type tcpServer struct { ctx *Context //上一章中提到的Contexto } func (p *tcpServer) Handle(clientConn net.Conn) { p.ctx.nsqlookupd.logf("TCP: new client(%s)", clientConn.RemoteAddr()) // The client should initialize itself by sending a 4 byte sequence indicating // the version of the protocol that it intends to communicate, this will allow us // to gracefully upgrade the protocol away from text/line oriented to whatever... //这里有注释了,但是我英文不好

NSQ系列之nsqlookupd代码分析一(初探nsqlookup)

梦想与她 提交于 2019-12-01 09:49:40
NSQ系列之nsqlookupd代码分析一(初探nsqlookup) nsqlookupd 是守护进程负责管理拓扑信息。客户端通过查询 nsqlookupd 来发现指定话题( topic )的生产者,并且提供 nsqd 节点广播话题( topic )和通道( channel )信息。 nsqlookupd 有两个接口: TCP 接口, nsqd 用它来广播。 HTTP 接口,客户端用它来发现和管理。 本系列的代码分析均是基于nsq v0.3.5的代码进行的分析,如有不对之处欢迎大家指正指导。 nsqlookup struct分析 代码文件路径为 nsq/nsqlookupd/nsqlookupd.go type NSQLookupd struct { sync.RWMutex //读写锁 opts *Options //nsqlookupd 配置信息 定义文件路径为nsq/nsqlookupd/options.go tcpListener net.Listener httpListener net.Listener waitGroup util.WaitGroupWrapper //WaitGroup 典型应用 用于开启两个goroutine,一个监听HTTP 一个监听TCP DB *RegistrationDB //product 注册数据库 具体分析后面章节再讲 } /

[golang]Go常见问题:# command-line-arguments: ***: undefined: ***

本秂侑毒 提交于 2019-12-01 09:37:26
今天遇见一个很蛋疼的问题,不知道是不是我配置的问题,IDE直接run就报错。 问题描述 在开发代码过程中,经常会因为逻辑处理而对代码进行分类,放进不同的文件里面;像这样,同一个包下的两个文件,点击idea的运行按钮或者运行 go run main.go命令时,就会报错,如图所示。 那就好吧,我直接命令运行咯,go run main.go,一样的结果。 IDE的配置,Run _kind:以file模式启动就报错,以package包模式就不会报错。 酱紫就不会报错了 原因分析 当然通过命令模式也会发现这样蛋疼的问题,go build不报错,直接go run main.go就报错。 这事你得揪其因呀,出现蛋疼问题就得抚平咯,哈哈哈。 在源代码的main函数中,我们发现从base.Commands的切片中获取要执行的命令,然后和传入的args一起执行cmd.Run(cmd, args)这个方法; 然后再回过头看cmd.Run(cmd, args)这个函数,结果发现它只是定义了一种类型,具体实现这里没有指出; 紧接着回头去看run包下的函数,会发现run.go在初始化的时候,会把改文件下的runRun()函数赋值给base.Command{}定义的对象CmdRun,结果会发现runRun函数的的参数类型和个数完全符合cmd.Run(cmd, args)这个函数类型,在go语言中

golang 学习笔记 -- struct interface的使用

女生的网名这么多〃 提交于 2019-12-01 08:52:37
一个 interface 类型定义了一个方法集做接口。 区分goalng的方法和函数 func go() { fmt.Println('go to home') }  这是函数 type car struct{ name string num int } func (g car) move(){ fmt.Println("driver car ,xiaorui.cc ") } car是一个结构,后面的move()函数是car结构体的一个方法。 如果move的方法类型是g *car,那么g是指针。 初始化了car后,可以直接用car的对象调用move方法。 另外在golang里某个函数想调用其他函数有这么几个用法。 方法,基于方法的interface接口,直接传参传对象。 //使用type定义一个interface type Xiaorui interface { Play() Start(msg string) } // 定义a为空接口 var a interface{} var i int = 5 s := "Hello world" // a可以存储任意类型的数值 a = i a = s 一个函数把interface{}作为参数,那么他可以接受任意类型的值作为参数,如果一个函数返回interface{},那么也就可以返回任意类型的值。 这是一个golang

Golang 并发原理 笔记

让人想犯罪 __ 提交于 2019-12-01 08:48:58
whatever 1. 并发 并发concurrency在有限的CPU资源上,尽可能快的执行多线程任务。对I/O密集型的计算可以使用并发提高程序性能。   - 多进程:多进程资源开销大,进程间通信成本高   - 多线程:多线程资源开销小,易于通信,但涉及线程安全、死锁等复杂问题。 2. Goroutine 采用多线程模型,但是为两级线程模型。 封装 系统线程(kernel)为协程Goroutine(用户及线程),调度逻辑对外透明,上下文切换为用户态,不需要线程那样在内核与用户态间进行切换。 3. G.P.M模型 G:协程,M:内核级线程的封装,数量对应真实的CPU数,P:上下文调度,G与M的调度对象,用来调度M与G的关联关系,数量 = gomaxprocs,链表方式存储。GO有一个调度器,用于调度P。 调度时,有全局变量Global Run Queue(存储Goroutine对象),里面对象分配给P的Local Run Queue,P中有多个用户的Goroutine。而G要想执行,必须通过P绑定M。 执行时,当M数量少(空闲M会Sleep),P数量多,G数量多时,会生成新的M(kse)。当M空闲时,会去其他M那里偷走一半的G,如果没什么可偷的,会睡觉。 kse:CPU调度的基本单位(M),执行时,P等待M执行完后主动告知、更新状态在栈上。 md太困了 来源: https://www

golang 学习笔记 ---JSON

荒凉一梦 提交于 2019-12-01 07:43:44
JSON解析到结构体 在介绍这部分之前先简要介绍一下Json语法 JSON 语法是 JavaScript 语法的子集。JSON 语法是 JavaScript 对象表示法语法的子集。 数据在名称/值对中 数据由逗号分隔 大括号保存对象 中括号保存数组 1.JSON名称/值对 "name" : "value" 2.JSON值 可以是: 数字(整数或浮点数) 字符串(在双引号中) 逻辑值(true 或 false) 数组(在中括号中) 对象(在大括号中) null JSON数据 JSON 数字可以是整型或者浮点型 { "age":30 } JSON对象 JSON 对象在大括号({})中书写: 对象可以包含多个名称/值对: { "name": "runoob", "alexa": 10000, "sites": { "site1": "www.runoob.com", "site2": "m.runoob.com", "site3": "c.runoob.com" } }    JSON数组 JSON 数组在中括号中书写: 数组可包含多个对象: { "sites": [{ "name": "菜鸟教程", "url": "www.runoob.com" }, { "name": "google", "url": "www.google.com" }, { "name": "微博", "url

golang 教程,重新编辑了一下入门目录

杀马特。学长 韩版系。学妹 提交于 2019-12-01 07:42:21
1. GO环境配置 1.1. GO安装 1.2. GOPATH 与工作空间 1.3. GO shell命令 1.4. GO开发工具 1.5. 小结 2. GO语言基础 2.1. 你好,GO 2.2. GO基础 2.3. 流程和函数 2.4. struct 2.5. 面向对象 2.6. interface 2.7. 并发 2.8. 小结 3. Web基础 3.1 web工作方式 3.2 GO搭建一个简单的web服务 3.3 Go如何使得web工作 3.4 Go的http包执行原理 3.5 小结 4.表单 4.1 处理表单的输入 4.2 验证表单的输入 4.3 预防跨站脚本 4.4 防止多次递交表单 4.5 处理文件上传 5.访问数据库 5.1 database/sql接口 5.2 使用mysql数据库 5.3 使用sqlite数据库 5.4 使用beedb库进行ORM开发 5.5 NOSQL数据库操作 6.session和数据存储 6.1 session和cookie 6.2 Go如何使用session 6.3 预防session劫持 6.4 session存储 7.Web服务 7.1 webSockets 7.2 REST 7.3 RPC 8.XML和Json处理 8.1 XML处理 8.2 Json处理 9.安全与加密 9.1 预防session 9.2 避免SQL注入 9.3