开源软件

开源软件

gnet: 一个轻量级且高性能的 Go 网络库

开源程序panjf2000 发表了文章 • 1 个评论 • 572 次浏览 • 2019-09-18 16:08 • 来自相关话题


gnet












# 博客原文
https://taohuawu.club/go-event-loop-networking-library-gnet

# Github 主页
https://github.com/panjf2000/gnet

欢迎大家围观~~,目前还在持续更新,感兴趣的话可以 star 一下暗中观察哦。

# 简介

`gnet` 是一个基于 Event-Loop 事件驱动的高性能和轻量级网络库。这个库直接使用 [epoll](https://en.wikipedia.org/wiki/Epoll) 和 [kqueue](https://en.wikipedia.org/wiki/Kqueue) 系统调用而非标准 Golang 网络包:[net](https://golang.org/pkg/net/) 来构建网络应用,它的工作原理类似两个开源的网络库:[libuv](https://github.com/libuv/libuv) 和 [libevent](https://github.com/libevent/libevent)。

这个项目存在的价值是提供一个在网络包处理方面能和 [Redis](http://redis.io)、[Haproxy](http://www.haproxy.org) 这两个项目具有相近性能的Go 语言网络服务器框架。

`gnet` 的亮点在于它是一个高性能、轻量级、非阻塞的纯 Go 实现的传输层(TCP/UDP/Unix-Socket)网络库,开发者可以使用 `gnet` 来实现自己的应用层网络协议,从而构建出自己的应用层网络应用:比如在 `gnet` 上实现 HTTP 协议就可以创建出一个 HTTP 服务器 或者 Web 开发框架,实现 Redis 协议就可以创建出自己的 Redis 服务器等等。

**`gnet` 衍生自另一个项目:`evio`,但是性能更好。**

# 功能

- [高性能](#性能测试) 的基于多线程模型的 Event-Loop 事件驱动
- 内置 Round-Robin 轮询负载均衡算法
- 简洁的 APIs
- 基于 Ring-Buffer 的高效内存利用
- 支持多种网络协议:TCP、UDP、Unix Sockets
- 支持两种事件驱动机制:Linux 里的 epoll 以及 FreeBSD 里的 kqueue
- 支持异步写操作
- 允许多个网络监听地址绑定在一个 Event-Loop 上
- 灵活的事件定时器
- SO_REUSEPORT 端口重用

# 核心设计

## 多线程模型

`gnet` 重新设计开发了一个新内置的多线程模型:『主从 Reactor 多线程』,这也是 `netty` 默认的线程模型,下面是这个模型的原理图:


multi_reactor



它的运行流程如下面的时序图:


reactor



现在我正在 `gnet` 里开发一个新的多线程模型:『带线程/go程池的主从 Reactors 多线程』,并且很快就能完成,这个模型的架构图如下所示:


multi_reactor_thread_pool



它的运行流程如下面的时序图:


multi-reactors



## 通信机制

`gnet` 的『主从 Reactors 多线程』模型是基于 Golang 里的 Goroutines的,一个 Reactor 挂载在一个 Goroutine 上,所以在 `gnet` 的这个网络模型里主 Reactor/Goroutine 与从 Reactors/Goroutines 有海量通信的需求,因此 `gnet` 里必须要有一个能在 Goroutines 之间进行高效率的通信的机制,我没有选择 Golang 里的主流方案:基于 Channel 的 CSP 模型,而是选择了性能更好、基于 Ring-Buffer 的 Disruptor 方案。

所以我最终选择了 [go-disruptor](https://github.com/smartystreets-prototypes/go-disruptor):高性能消息分发队列 LMAX Disruptor 的 Golang 实现。

## 自动扩容的 Ring-Buffer

`gnet` 利用 Ring-Buffer 来缓存 TCP 流数据以及管理内存使用。







# 开始使用

## 安装

```sh
$ go get -u github.com/panjf2000/gnet
```

## 使用示例

```go
// ======================== Echo Server implemented with gnet ===========================

package main

import (
"flag"
"fmt"
"log"
"strings"

"github.com/panjf2000/gnet"
"github.com/panjf2000/gnet/ringbuffer"
)

func main() {
var port int
var loops int
var udp bool
var trace bool
var reuseport bool

flag.IntVar(&port, "port", 5000, "server port")
flag.BoolVar(&udp, "udp", false, "listen on udp")
flag.BoolVar(&reuseport, "reuseport", false, "reuseport (SO_REUSEPORT)")
flag.BoolVar(&trace, "trace", false, "print packets to console")
flag.IntVar(&loops, "loops", 0, "num loops")
flag.Parse()

var events gnet.Events
events.NumLoops = loops
events.OnInitComplete = func(srv gnet.Server) (action gnet.Action) {
log.Printf("echo server started on port %d (loops: %d)", port, srv.NumLoops)
if reuseport {
log.Printf("reuseport")
}
return
}
events.React = func(c gnet.Conn, inBuf *ringbuffer.RingBuffer) (out []byte, action gnet.Action) {
top, tail := inBuf.PreReadAll()
out = append(top, tail...)
inBuf.Reset()

if trace {
log.Printf("%s", strings.TrimSpace(string(top)+string(tail)))
}
return
}
scheme := "tcp"
if udp {
scheme = "udp"
}
log.Fatal(gnet.Serve(events, fmt.Sprintf("%s://:%d", scheme, port)))
}

```

## I/O 事件

`gnet` 目前支持的 I/O 事件如下:

- `OnInitComplete` 当 server 初始化完成之后调用。
- `OnOpened` 当连接被打开的时候调用。
- `OnClosed` 当连接被关闭的时候调用。
- `OnDetached` 当主动摘除连接的时候的调用。
- `React` 当 server 端接收到从 client 端发送来的数据的时候调用。(你的核心业务代码一般是写在这个方法里)
- `Tick` 服务器启动的时候会调用一次,之后就以给定的时间间隔定时调用一次,是一个定时器方法。
- `PreWrite` 预先写数据方法,在 server 端写数据回 client 端之前调用。

# 性能测试

## Linux (epoll)

### 系统参数

```powershell
Go Version: go1.12.9 linux/amd64
OS: Ubuntu 18.04
CPU: 8 Virtual CPUs
Memory: 16.0 GiB
```

### Echo Server

![echolinux.png](https://img.hacpai.com/file/2019/09/echolinux-fca6e6e5.png)


### HTTP Server

![httplinux.png](https://img.hacpai.com/file/2019/09/httplinux-663a0318.png)


## FreeBSD (kqueue)

### 系统参数

```powershell
Go Version: go version go1.12.9 darwin/amd64
OS: macOS Mojave 10.14.6
CPU: 4 CPUs
Memory: 8.0 GiB
```

### Echo Server

![echomac.png](https://img.hacpai.com/file/2019/09/echomac-7a29e0d1.png)


### HTTP Server

![httpmac.png](https://img.hacpai.com/file/2019/09/httpmac-cb6d26ea.png)


# 证书

`gnet` 的源码允许用户在遵循 MIT [开源证书](https://github.com/panjf2000/gnet/blob/master/LICENSE) 规则的前提下使用。

# 待做事项

> gnet 还在持续开发的过程中,所以这个仓库的代码和文档会一直持续更新,如果你对 gnet 感兴趣的话,欢迎给这个开源库贡献你的代码~~

分享一个纯 Go 编写的内嵌型 KV 数据库 NutsDB,支持事务以及多种数据结构

开源程序xujiajun 发表了文章 • 0 个评论 • 396 次浏览 • 2019-03-11 21:52 • 来自相关话题

大家好,分享一个我最近开源的用纯GO编写的内嵌型数据库。是对nosql的一个阶段性的实践。 ## Feature: * 支持 ACID 事务 (从v 0.3.0开始) * 支持基本的 ...查看全部
大家好,分享一个我最近开源的用纯GO编写的内嵌型数据库。是对nosql的一个阶段性的实践。


## Feature:

* 支持 ACID 事务 (从v 0.3.0开始)
* 支持基本的 Put、Delete、Get 操作
* 支持前缀扫描
* 支持范围扫描
* 除了基本的 String,还支持多种数据结构类似Redis的APi,如列表(list)、集合(set)、有序集合(sorted set)。

## 项目地址

https://github.com/xujiajun/nutsdb

> 欢迎大家给我提issue、star关注、提交PR。

终于有一个靠谱的Go写GUI的库了

文章分享buscoop 回复了问题 • 28 人关注 • 20 个回复 • 47584 次浏览 • 2018-09-12 13:42 • 来自相关话题

开源高性能 web 缓存服务器 nuster

开源程序kehokoduru 发表了文章 • 0 个评论 • 1644 次浏览 • 2018-02-22 11:09 • 来自相关话题

nuster, 一个基于 HAProxy 的高性能 web 缓存服务器 。 完全兼容 HAProxy,并且利用 HAProxy 的 ACL 功能来提供非常细致的缓存规则。 项目地址 https://github.com/jiangwe ...查看全部
nuster, 一个基于 HAProxy 的高性能 web 缓存服务器 。 完全兼容 HAProxy,并且利用 HAProxy 的 ACL 功能来提供非常细致的缓存规则。

项目地址 https://github.com/jiangwenyuan/nuster

可以根据 url, path, query, header, cookie,请求速率等等来动态生成缓存,并设置有效期。支持 purge,支持前后端 HTTPS。

* 完全兼容 HAProxy,支持所有 HAProxy 的特性和功能
* 强大的动态缓存功能
* 根据 HTTP method, uri, path, query, header, cookie 等等进行缓存
* 根据 HTTP 请求和响应内容等等进行缓存
* 根据环境变量服务器状态等等进行缓存
* 根据 SSL 版本, SNI 等等进行缓存
* 根据连接数量,请求速率等等进行缓存
* 等等
* 非常快
* 删除缓存
* 前后端 HTTPS
* HTTP 压缩
* HTTP 重写重定向
* 等等

性能

非常快, 单进程模式下是 nginx 的 3 倍,多进程下 nginx 的 2 倍,varnish 的 3 倍。

详见[https://github.com/jiangwenyuan/nuster/wiki/Web-cache-server-performance-benchmark:-nuster-vs-nginx-vs-varnish-vs-squid](https://github.com/jiangwenyuan/nuster/wiki/Web-cache-server-performance-benchmark:-nuster-vs-nginx-vs-varnish-vs-squid)

版本更新 | Mesos调度器Swan v0.2来啦

开源程序数人云 发表了文章 • 0 个评论 • 1470 次浏览 • 2016-12-13 19:22 • 来自相关话题

>[数人云](http://www.shurenyun.com)Mesos调度器 [Swan](https://github.com/Dataman-Cloud/swan)开源已经一个月啦,在社区和大家的共同呵护下成长了许多。今天小数带来了Swan v0.2的 ...查看全部
>[数人云](http://www.shurenyun.com)Mesos调度器 [Swan](https://github.com/Dataman-Cloud/swan)开源已经一个月啦,在社区和大家的共同呵护下成长了许多。今天小数带来了Swan v0.2的新版本,添加了很多新功能,大家快来看看吧——

![](https://i.v2ex.co/wercsh2o.jpeg)

##Feature List

* Uri 支持:支持自定义资源,支持多资源下载
* PortIndex:支持端口命名,健康检测支持portIndex,portName和portValue
* Cli:命令行工具
* Heathcheck:支持mesos自带的healthcheck,http和tcp两种
* Raft:高可用,分布式数据复制和leader选举
* Proxy:自带proxy功能,支持负载均衡
* DNS:自带DNS功能,支持域名解析
* 一容器一IP:支持IP地址固定分配,一容器一IP
* Constraints:支持约束条件,UNIQUE和LIKE



Fork me on GitHub!
https://github.com/Dataman-Cloud/swan


###关于数人云Mesos调度器Swan

Swan是基于Mesos Restful API编写的应用调度框架,可以帮助用户轻松发布应用,实现应用的滚动更新,并根据用户指定的策略做应用的健康检测和故障转移。



json 解析器哪家强?

开源程序taowen 发表了文章 • 8 个评论 • 4996 次浏览 • 2016-12-07 12:42 • 来自相关话题

全文链接: [`https://github.com/json-iterator/go-benchmark`][1] 目的不是推销 json-iterator 。而是证明 json-iterator 不比其他的库更慢,从而使得大家可以 ...查看全部
全文链接: [`https://github.com/json-iterator/go-benchmark`][1]

目的不是推销 json-iterator 。而是证明 json-iterator 不比其他的库更慢,从而使得大家可以把吐槽点放到其他方面:比如特性是不是齐全, api 是不是友好。重新发明 json 解析器是因为经常需要处理奇怪格式的 json ,而又不想把数据转两遍。市面上没有 api 满足我的需求的,后面我会专门写一篇 api 介绍的文章来演示 json-iterator 的独特性。( https://github.com/json-iterator/go/blob/master/README.md )

* jsonparser: `https://github.com/buger/jsonparser`
* jsoniter pull-api: [`https://github.com/json-iterator/go`][2]
* jsoniter reflect-api: `https://github.com/json-iterator/go/blob/master/jsoniter_reflect.go`
* encoding/json: golang standard lib
* easy json: `https://github.com/mailru/easyjson`

测试设备

* CPU: i7-6700K @ 4.0G
* Level 1 cache size: 4 x 32 KB 8-way set associative instruction caches
* Level 2 cache size: 4 x 256 KB 4-way set associative caches
* Level 3 cache size: 8 MB 16-way set associative shared cache
* Go: 1.8beta1

# small payload

https://github.com/json-iterator/go-benchmark/blob/master/src/github.com/json-iterator/go-benchmark/benchmark_small_payload_test.go

| jsonparser | jsoniter pull-api | jsoniter reflect-api | encoding/json | easyjson |
| --- | --- | --- | --- | --- |
| 599 ns/op | 515 ns/op | 684 ns/op | 2453 ns/op | 687 ns/op |
| 64 B/op | 64 B/op | 256 B/op | 864 B/op | 64 B/op |
| 2 allocs/op | 2 allocs/op | 4 allocs/op | 31 allocs/op | 2 allocs/op |

encoding/json 在 i7-6700K 上性能还不错,但是在缓存小一些的 cpu 上性能要比这慢更多。

![small](https://github.com/json-iterator/go-benchmark/raw/master/small.png)

# medium payload

| jsonparser | jsoniter pull-api | jsoniter reflect-api | encoding/json | easyjson |
| --- | --- | --- | --- | --- |
| 5238 ns/op | 4111 ns/op | 4708 ns/op | 24939 ns/op | 7361 ns/op |
| 104 B/op | 104 B/op | 368 B/op | 808 B/op | 248 B/op |
| 4 allocs/op | 4 allocs/op | 14 allocs/op | 18 allocs/op | 8 allocs/op |

https://github.com/json-iterator/go-benchmark/blob/master/src/github.com/json-iterator/go-benchmark/benchmark_medium_payload_test.go

json-iterator 的反射 api 也是相当快的。

![medium](https://github.com/json-iterator/go-benchmark/raw/master/medium.png)

# large payload
https://github.com/json-iterator/go-benchmark/blob/master/src/github.com/json-iterator/go-benchmark/benchmark_large_payload_test.go

| jsonparser | jsoniter pull-api | encoding/json |
| --- | --- | --- |
| 38334 ns/op | 38463 ns/op | 290778 ns/op |
| 0 B/op | 0 B/op | 2128 B/op |
| 0 allocs/op | 0 allocs/op | 46 allocs/op |

jsonparser 在大部分字段不使用的时候,要快那么一丁点。

![large](https://github.com/json-iterator/go-benchmark/raw/master/large.png)

# large file

test file used: https://github.com/json-iterator/test-data/blob/master/large-file.json

| jsonparser | jsoniter pull-api | encoding/json |
| --- | --- | --- |
| 42698634 ns/op | 37760014 ns/op | 235354502 ns/op |
| 67107104 B/op | 4248 B/op | 71467896 B/op |
| 19 allocs/op | 5 allocs/op | 272477 allocs/op |

jsonparser 等其他一大票 json 解析器都是以 []byte 作为输入的,简直是为跑分而生。关于这一点 jackson 的作者也有吐槽( https://www.infoq.com/news/2014/05/jackson-founder-responds )。而 jsoniter 可以支持 io.Reader 作为输入,对于大文件处理非常友好。

![large-file](https://github.com/json-iterator/go-benchmark/raw/master/large-file.png)


[1]: https://github.com/json-iterator/go-benchmark
[2]: https://github.com/json-iterator/go

视频教程:玩转数人云Mesos调度器Swan

开源程序数人云 发表了文章 • 0 个评论 • 1396 次浏览 • 2016-11-17 11:25 • 来自相关话题

数人云开源第二弹! [数人云](http://www.shurenyun.com)Mesos调度器[Swan](https://github.com/Dataman-Cloud/swan)开源已经一周多了,收到很多小伙伴的帮助和反馈, ...查看全部
数人云开源第二弹!

[数人云](http://www.shurenyun.com)Mesos调度器[Swan](https://github.com/Dataman-Cloud/swan)开源已经一周多了,收到很多小伙伴的帮助和反馈,小数在这里表示感谢^_^
数人云工程师为Swan的使用录制了视频,帮助大家更好更快地了解Swan。

视频地址:http://v.qq.com/x/page/r0346559nfx.html



Fork me on GitHub!!https://github.com/Dataman-Cloud/swan


**关于Swan**

Swan基于Mesos Restful API编写的应用调度框架,可以帮助用户轻松发布应用,实现应用的滚动更新,并根据用户指定的策略做应用的健康检测和故障转移。未来,数人云Swan团队还将努力实现调度策略、高可用服务发现、网络管理、编排,以及任务抢占等功能。

golang内存检测工具

文章分享sheepbao 回复了问题 • 8 人关注 • 4 个回复 • 6520 次浏览 • 2016-11-09 19:22 • 来自相关话题

动手造轮 | 一款Bash 脚本 +HTTP 请求工具 +JSON 解析工具组成的测试小工具

开源程序数人云 发表了文章 • 2 个评论 • 1981 次浏览 • 2016-11-03 12:23 • 来自相关话题

>[数人云](http://www.shurenyun.com)开源一款容器管理工具[Crane](http://),Crane开发过程中,为了保证API的健壮性和稳定性, 数人云开发团队自制了一套适合Crane API测试的小工具。它也适用于其他接口测试,小 ...查看全部
>[数人云](http://www.shurenyun.com)开源一款容器管理工具[Crane](http://),Crane开发过程中,为了保证API的健壮性和稳定性, 数人云开发团队自制了一套适合Crane API测试的小工具。它也适用于其他接口测试,小数发现很多朋友对它感兴趣,就勤劳地搬运过来,希望能为大家提供一个参考和思路。

针对Crane团队只向外输出API的特点, 选择测试工具是秉着以下原则的:

* 第一, 功能不要太复杂,学习曲线不能太陡, 功能够用就行;
* 第二, 可编程要好, 最好不要有界面,程序员友好。

于是一款简单的Bash脚本+HTTP 请求工具+JSON解析工具组成的测试小工具雏形出现了。

下面给大家展现这款工具的构成

Bash脚本: 测试工具的粘合剂, 不是Java也不是Python, 用Bash简单易用,功能强大。
Httpie: 一款类似curl的http工具, 不过比curl简单的多, 尤其是想发个JSON请求时候, 更简单。
jq: jq是一款命令行解析JSON文本的工具, 支持非常多的语法解析构造重组JSON文本。

下面依次给大家介绍一下httpie和jq的基本用法

##1. 例子说明如何使用httpie

httpie在terminal下的命令是http, 先来几个简单的例子给演示一下用法。

http get http://httpbin.org/get header:header-content

![](https://i.v2ex.co/VjeF3tnj.png)

其中, http是命令, get是请求method, http://httpbin.org 是请求地址, httpbin是一个http的测试服务; 用冒号相连的参数代表着HTTP请求头, 用等号连接为请求body中的JSON键和值。 httpie默认的请求为json请求, 所以不用过多指明,header已经加上了Content-Type:application/json。

http post http://httpbin.org/post header:header-content json-key=json-value

![](https://i.v2ex.co/i1nMzj4C.png)


http支持很多命令行选项, 介绍一个有意思的是 --check-status, check-status是把http response的非200值设置成进程的exit code, 比如:


![](https://i.v2ex.co/F797CyX4.png)

如上所示, 请求一个不存在的地址时候进程退出符号变成了4。 我们将大量使用这个feature来判断返回值。

##2. 例子说明如何使用jq

下面我们用几个例子介绍一下jq的用法。

![](https://i.v2ex.co/415y3RI0.png)

上图演示如何提取一个json的key。

![](https://i.v2ex.co/7q88R6k5.png)


如何提取一个嵌套的key。

![](https://i.v2ex.co/vf8y9VLZ.png)

提取数组中的元素。

篇幅关系我们不过多展示jq的高级功能, 除了基本的解析和构造以外,jq支持大量的filter, 如有兴趣可参考https://stedolan.github.io/jq/manual/#Builtinoperatorsandfunctions。

##3. Crane测试工具的几个场景

###场景一: 我期望测试API的HTTP测试的返回状态比如200, 404, 500

首先bash造了几个基本的函数来输出错误, 和判断状态

![](https://i.v2ex.co/s2juJ7ER.png)


使用方法

![](https://i.v2ex.co/8r55TCeV.png)

###场景二: 登录过程测试

![](https://i.v2ex.co/j8DN5dBq.png)


更多的测试例子可参考https://github.com/Dataman-Cloud/crane/tree/master/api_test 。

至此,一款可用的测试工具出炉了, 虽然简单,不过功能恰到好处,非常适合我们的场景, 再也不怕API出错发现不了了。 聪明的同事们把这工具配到了jenkins和单元测试一起执行, 出错了还能得到邮件通知, 酷极了。

go+lua的分布式计算工具--Gleam

文章分享themoonstone 发表了文章 • 0 个评论 • 3901 次浏览 • 2016-10-29 21:04 • 来自相关话题

此处是一个通过Go和LuaJIT编写的快速和可扩展的分布式映射/缩减系统,很好的将Go的高并发性与Luajit高性能相结合,可独立运行或用于分布式计算。 Gleam是一个高性能和高效的分布式执行系统,具备高性能、简单,通用,灵活和易于定制的特点。它 ...查看全部
此处是一个通过Go和LuaJIT编写的快速和可扩展的分布式映射/缩减系统,很好的将Go的高并发性与Luajit高性能相结合,可独立运行或用于分布式计算。
Gleam是一个高性能和高效的分布式执行系统,具备高性能、简单,通用,灵活和易于定制的特点。它在Go中构建,用户定义的计算可以用Lua,Unix管道工具或其它任何流程序编写。下面是它的安装方式和具体使用实例:
## 安装方式:
### 1、安装go
- https://golang.org/doc/install

### 2、安装luaJIT
- wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz
- tar zxf LuaJIT-2.0.4.tar.gz
- cd LuaJIT-2.0.4
- sudo make install

### 3、将自定义的MessagePack.lua放在luajit可以找到的文件夹下。
- // option 1: copy a file to lua lib path
- wget https://raw.githubusercontent.com/chrislusf/gleam/master/script/MessagePack.lua
- sudo cp MessagePack.lua /usr/local/share/luajit-2.0.4/
- // option 2: install for the machine
- sudo luarocks install --server=http://luarocks.org/dev gleam-lua
- // option 3: or install it locally
- luarocks install --server=http://luarocks.org/dev gleam-lua --local

### 4、 安装测试
如果出现以下问题,只需复制MessagePack.lua到其中一个路径。
- luajit: (command line):1: module 'MessagePack' not found:
- no field package.preload['MessagePack']
- no file './MessagePack.lua'
- no file '/usr/local/share/luajit-2.0.4/MessagePack.lua'
- no file '/usr/local/share/lua/5.1/MessagePack.lua'
- no file '/usr/local/share/lua/5.1/MessagePack/init.lua'
- no file './MessagePack.so'
- no file '/usr/local/lib/lua/5.1/MessagePack.so'
- no file '/usr/local/lib/lua/5.1/loadall.so'

## 使用实例:
```go
package main

import (
"os"

"github.com/chrislusf/gleam"
)

func main() {

gleam.New().TextFile("/etc/passwd").FlatMap(`
function(line)
return line:gmatch("%w+")
end
`).Map(`
function(word)
return word, 1
end
`).ReduceBy(`
function(x, y)
return x + y
end
`).Fprintf(os.Stdout, "%s,%d\n").Run()
}
```
通过以上内容、我们知道Geam的安装和使用都比较简单、而且基于golang和lua简单的语法规则和高效和并发性能、它也可以给用户带来更好的开发体验。希望有兴趣的同学可以享受到Gleam给大家带来的便利

## 源文链接:
https://github.com/chrislusf/gleam

SSH 服务器teleport

开源程序itfanr 发表了文章 • 0 个评论 • 1756 次浏览 • 2016-10-25 12:34 • 来自相关话题

Teleport 1.2 版本发布了,Gravitational Teleport 是一个先进的 SSH 服务器,可通过 SSH 或者 HTTPS 远程访问 Linux 服务器。其目的是为了替代 sshd。 https: ...查看全部
Teleport 1.2 版本发布了,Gravitational Teleport 是一个先进的 SSH 服务器,可通过 SSH 或者 HTTPS 远程访问 Linux 服务器。其目的是为了替代 sshd。


https://github.com/gravitational/teleport

在1.7.2发布之际发现重大bug之后,1.7.3终于如期release了

文章分享astaxie 发表了文章 • 8 个评论 • 2069 次浏览 • 2016-10-20 08:08 • 来自相关话题

Go 1.7.3 版本发布了。该版本主要修复了编译器和运行时状态, 1. [crypto/cipher: panic on s390x when len(src) == 0](https://github.com/golang/go/ ...查看全部
Go 1.7.3 版本发布了。该版本主要修复了编译器和运行时状态,

1. [crypto/cipher: panic on s390x when len(src) == 0](https://github.com/golang/go/issues/17435)
2. [cmd/compile: escaping closure incorrectly allocated on the stack](https://github.com/golang/go/issues/17318 "cmd/compile: escaping closure incorrectly allocated on the stack")
3. [runtime: hangup in umtx_op system call when changing system clock](https://github.com/golang/go/issues/17168 "runtime: hangup in umtx_op system call when changing system clock")
4. [crypto/tls: handshake race between read and write goroutines in go1.7](https://github.com/golang/go/issues/17101 "runtime: hangup in umtx_op system call when changing system clock")
5. [net/http: first byte of outgoing request body is sometimes lost](https://github.com/golang/go/issues/17071 "runtime: hangup in umtx_op system call when changing system clock")
6. [strings: SIGILL on s390x on z196](https://github.com/golang/go/issues/17032 "runtime: hangup in umtx_op system call when changing system clock")


详细的请访问如下地址:

https://github.com/golang/go/issues?q=milestone%3AGo1.7.3

下载地址:https://golang.org/dl/

TensorFlow支持Go语言了

文章分享astaxie 发表了文章 • 1 个评论 • 7524 次浏览 • 2016-10-19 11:12 • 来自相关话题

# TensorFlow 简介 TensorFlow是Google在2015年11月份开源的人工智能系统(Github项目地址),是之前所开发的深度学习基础架构DistBelief的改进版本,该系统可以被用于语音识别、图片识别等多个领 ...查看全部
# TensorFlow 简介

TensorFlow是Google在2015年11月份开源的人工智能系统(Github项目地址),是之前所开发的深度学习基础架构DistBelief的改进版本,该系统可以被用于语音识别、图片识别等多个领域。

官网上对TensorFlow的介绍是,一个使用数据流图(data flow graphs)技术来进行数值计算的开源软件库。数据流图中的节点,代表数值运算;节点节点之间的边,代表多维数据(tensors)之间的某种联系。你可以在多种设备(含有CPU或GPU)上通过简单的API调用来使用该系统的功能。TensorFlow是由Google Brain团队的研发人员负责的项目。

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/go

详细的讨论在这里,https://github.com/tensorflow/tensorflow/issues/10#issuecomment-245687757

可视化系统监控工具 Cloudinsight Agent 正式开源

开源程序Cloudinsight 发表了文章 • 5 个评论 • 3314 次浏览 • 2016-10-18 16:03 • 来自相关话题

![](http://o8g4uutrr.bkt.clouddn.com/cloudinsight%20agent%201.jpg) 很高兴地宣布 Cloudinsight Agent 在 BSD 开源协议下正式开源了。我们的工程师 ...查看全部
![](http://o8g4uutrr.bkt.clouddn.com/cloudinsight%20agent%201.jpg)

很高兴地宣布 Cloudinsight Agent 在 BSD 开源协议下正式开源了。我们的工程师在开源前已将代码用 Golang 重写,更加清晰简洁,欢迎各位参与到 Cloudinsight Agent 的开发和迭代中来。

##为什么要用 Golang 重写和开源

[Cloudinsight](http://cloudinsight.oneapm.com?utm_source=gocn&utm_medium=Article&utm_term=agentos&utm_campaign=CiTech&from=jscwgyegyv)是一个可视化系统监控工具,能够对数据指标进行聚合、分组、过滤、 管理、计算;并提供团队协作功能,共同管理数据和报警事件。而这些的关键,正是 Cloudinsight Agent。

###目前探针存在的问题:
- 各个服务的数据抓取存在强依赖关系,任何一个服务阻塞都可能导致探针进程挂掉。
- 缺乏对 log 和 json 的支持,用户需要通过 sdk 解析相关数据。
- 针对 自定义Plugin 的支持不够灵活,用户需要熟悉 Python,并按照探针定义好的接口上传数据。
- 探针使用 Omnibus 进行打包部署,虽然能解决用户安装上的一些问题,但对于新人来说,上手确实不是件容易的事,况且这个项目本身也有一些 bug,经历过的人自然懂。

###用 Golang 重写:
- 解决以上提到的种种问题。
- 优化探针架构。
- 提升探针性能。
- 开源,接受社区的监督,让深度用户可以参与到探针的版本迭代中来。


现在 Golang 版探针还是 Beta 版,所以支持的平台服务还不多,但这正是我们将 Cloudinsight Agent 上的工作推向开源的第一步,也希望有更多的开发者参与进来,让项目能有更快的进展。


##项目计划

###增加支持的平台和平台服务

目前用 Golang 重写的 Cloudinsight Agent 仅在 Linux 上进行了测试,未来会逐渐将原有 Python 探针支持的平台和平台服务替换至 Golang 版本,包括但不限于:
![](http://o8g4uutrr.bkt.clouddn.com/cloudinsight%20agent%202.png)



##加入项目
- Github:https://github.com/cloudinsight/cloudinsight-agent
- 配置要求:Go 1.5 以上版本

```go
$ mkdir -p $GOPATH/src/github.com/cloudinsight
$ cd $GOPATH/src/github.com/cloudinsight
$ git clone https://github.com/cloudinsight/cloudinsight-agent
$ cd cloudinsight-agent $ make build
```
##使用

首次使用需设置 License Key,可在 https://cloud.oneapm.com/#/settings 中获取
```go
$ cp cloudinsight-agent.conf.example cloudinsight-agent.conf
$ vi cloudinsight-agent.conf
...
license_key = "*********************"

```
在前台中运行命令
```go
$ ./bin/cloudinsight-agent

```
##致谢
从 15 年 8 月至今,Cloudinsight Agent 经过了 20 余次的迭代,从第一天的的 20 个用户发展到现在 5 万多的探针数,感谢长久以来支持 Cloudinsight 和提供宝贵建议的用户和开发者们,也再次感谢以下影响了我们的优秀的开源项目:
- [ddagent](https://github.com/datadog/dd-agent)
- [telegraf](https://github.com/influxdata/telegraf)
- [prometheus](https://github.com/influxdata/telegraf)
- [mackerel](https://github.com/influxdata/telegraf)


**在项目中有代码贡献的开发者,Cloudinsight 将送出一件限量 Tee 作为答谢。**
![](http://o8g4uutrr.bkt.clouddn.com/cloudinsight%20agent%203.png)




Cloudinsight 官网:[Cloudinsight.oneapm.com ](http://cloudinsight.oneapm.com?utm_source=gocn&utm_medium=Article&utm_term=agentos&utm_campaign=CiTech&from=jscwgyegyv "Cloudinsight.oneapm.com ") 欢迎访问了解

![](http://o8g4uutrr.bkt.clouddn.com/cloudinsight%20agent%204.gif)

图:在 Cloudinsight 中用标签进行集群管理

实时文件监控

文章分享themoonstone 发表了文章 • 1 个评论 • 4257 次浏览 • 2016-10-15 14:11 • 来自相关话题

由GO构建的实时重载和输出流的文件监控系统、在自定义路径下运行、构建和观察文件更改 ![](https://camo.githubusercontent.com/a6704d699df2b736a8da6c87e4b14d3d4b39bc55/68 ...查看全部
由GO构建的实时重载和输出流的文件监控系统、在自定义路径下运行、构建和观察文件更改
![](https://camo.githubusercontent.com/a6704d699df2b736a8da6c87e4b14d3d4b39bc55/687474703a2f2f692e696d6775722e636f6d2f644a624e5a6a742e676966)
特征:
- 可同时构建,安装,测试,Fmt和运行
- 支持在文件更改时重新加载(重新构建,重新安装和重新运行)
- 支持观看自定义路径
- 支持观看特定的文件扩展名
- 多个项目支持
- 支持输出流
- 执行时间
- 高度可定制
- 快速运行

原文链接:
https://github.com/tockins/realize

实时文件监控

文章分享themoonstone 发表了文章 • 1 个评论 • 4257 次浏览 • 2016-10-15 14:11 • 来自相关话题

由GO构建的实时重载和输出流的文件监控系统、在自定义路径下运行、构建和观察文件更改 ![](https://camo.githubusercontent.com/a6704d699df2b736a8da6c87e4b14d3d4b39bc55/68 ...查看全部
由GO构建的实时重载和输出流的文件监控系统、在自定义路径下运行、构建和观察文件更改
![](https://camo.githubusercontent.com/a6704d699df2b736a8da6c87e4b14d3d4b39bc55/687474703a2f2f692e696d6775722e636f6d2f644a624e5a6a742e676966)
特征:
- 可同时构建,安装,测试,Fmt和运行
- 支持在文件更改时重新加载(重新构建,重新安装和重新运行)
- 支持观看自定义路径
- 支持观看特定的文件扩展名
- 多个项目支持
- 支持输出流
- 执行时间
- 高度可定制
- 快速运行

原文链接:
https://github.com/tockins/realize

终于有一个靠谱的Go写GUI的库了

回复

文章分享buscoop 回复了问题 • 28 人关注 • 20 个回复 • 47584 次浏览 • 2018-09-12 13:42 • 来自相关话题

golang内存检测工具

回复

文章分享sheepbao 回复了问题 • 8 人关注 • 4 个回复 • 6520 次浏览 • 2016-11-09 19:22 • 来自相关话题

myLG, 命令行网络诊断工具

回复

Go开源项目ityike 回复了问题 • 13 人关注 • 7 个回复 • 4046 次浏览 • 2016-10-14 09:21 • 来自相关话题

gnet: 一个轻量级且高性能的 Go 网络库

开源程序panjf2000 发表了文章 • 1 个评论 • 572 次浏览 • 2019-09-18 16:08 • 来自相关话题


gnet












# 博客原文
https://taohuawu.club/go-event-loop-networking-library-gnet

# Github 主页
https://github.com/panjf2000/gnet

欢迎大家围观~~,目前还在持续更新,感兴趣的话可以 star 一下暗中观察哦。

# 简介

`gnet` 是一个基于 Event-Loop 事件驱动的高性能和轻量级网络库。这个库直接使用 [epoll](https://en.wikipedia.org/wiki/Epoll) 和 [kqueue](https://en.wikipedia.org/wiki/Kqueue) 系统调用而非标准 Golang 网络包:[net](https://golang.org/pkg/net/) 来构建网络应用,它的工作原理类似两个开源的网络库:[libuv](https://github.com/libuv/libuv) 和 [libevent](https://github.com/libevent/libevent)。

这个项目存在的价值是提供一个在网络包处理方面能和 [Redis](http://redis.io)、[Haproxy](http://www.haproxy.org) 这两个项目具有相近性能的Go 语言网络服务器框架。

`gnet` 的亮点在于它是一个高性能、轻量级、非阻塞的纯 Go 实现的传输层(TCP/UDP/Unix-Socket)网络库,开发者可以使用 `gnet` 来实现自己的应用层网络协议,从而构建出自己的应用层网络应用:比如在 `gnet` 上实现 HTTP 协议就可以创建出一个 HTTP 服务器 或者 Web 开发框架,实现 Redis 协议就可以创建出自己的 Redis 服务器等等。

**`gnet` 衍生自另一个项目:`evio`,但是性能更好。**

# 功能

- [高性能](#性能测试) 的基于多线程模型的 Event-Loop 事件驱动
- 内置 Round-Robin 轮询负载均衡算法
- 简洁的 APIs
- 基于 Ring-Buffer 的高效内存利用
- 支持多种网络协议:TCP、UDP、Unix Sockets
- 支持两种事件驱动机制:Linux 里的 epoll 以及 FreeBSD 里的 kqueue
- 支持异步写操作
- 允许多个网络监听地址绑定在一个 Event-Loop 上
- 灵活的事件定时器
- SO_REUSEPORT 端口重用

# 核心设计

## 多线程模型

`gnet` 重新设计开发了一个新内置的多线程模型:『主从 Reactor 多线程』,这也是 `netty` 默认的线程模型,下面是这个模型的原理图:


multi_reactor



它的运行流程如下面的时序图:


reactor



现在我正在 `gnet` 里开发一个新的多线程模型:『带线程/go程池的主从 Reactors 多线程』,并且很快就能完成,这个模型的架构图如下所示:


multi_reactor_thread_pool



它的运行流程如下面的时序图:


multi-reactors



## 通信机制

`gnet` 的『主从 Reactors 多线程』模型是基于 Golang 里的 Goroutines的,一个 Reactor 挂载在一个 Goroutine 上,所以在 `gnet` 的这个网络模型里主 Reactor/Goroutine 与从 Reactors/Goroutines 有海量通信的需求,因此 `gnet` 里必须要有一个能在 Goroutines 之间进行高效率的通信的机制,我没有选择 Golang 里的主流方案:基于 Channel 的 CSP 模型,而是选择了性能更好、基于 Ring-Buffer 的 Disruptor 方案。

所以我最终选择了 [go-disruptor](https://github.com/smartystreets-prototypes/go-disruptor):高性能消息分发队列 LMAX Disruptor 的 Golang 实现。

## 自动扩容的 Ring-Buffer

`gnet` 利用 Ring-Buffer 来缓存 TCP 流数据以及管理内存使用。







# 开始使用

## 安装

```sh
$ go get -u github.com/panjf2000/gnet
```

## 使用示例

```go
// ======================== Echo Server implemented with gnet ===========================

package main

import (
"flag"
"fmt"
"log"
"strings"

"github.com/panjf2000/gnet"
"github.com/panjf2000/gnet/ringbuffer"
)

func main() {
var port int
var loops int
var udp bool
var trace bool
var reuseport bool

flag.IntVar(&port, "port", 5000, "server port")
flag.BoolVar(&udp, "udp", false, "listen on udp")
flag.BoolVar(&reuseport, "reuseport", false, "reuseport (SO_REUSEPORT)")
flag.BoolVar(&trace, "trace", false, "print packets to console")
flag.IntVar(&loops, "loops", 0, "num loops")
flag.Parse()

var events gnet.Events
events.NumLoops = loops
events.OnInitComplete = func(srv gnet.Server) (action gnet.Action) {
log.Printf("echo server started on port %d (loops: %d)", port, srv.NumLoops)
if reuseport {
log.Printf("reuseport")
}
return
}
events.React = func(c gnet.Conn, inBuf *ringbuffer.RingBuffer) (out []byte, action gnet.Action) {
top, tail := inBuf.PreReadAll()
out = append(top, tail...)
inBuf.Reset()

if trace {
log.Printf("%s", strings.TrimSpace(string(top)+string(tail)))
}
return
}
scheme := "tcp"
if udp {
scheme = "udp"
}
log.Fatal(gnet.Serve(events, fmt.Sprintf("%s://:%d", scheme, port)))
}

```

## I/O 事件

`gnet` 目前支持的 I/O 事件如下:

- `OnInitComplete` 当 server 初始化完成之后调用。
- `OnOpened` 当连接被打开的时候调用。
- `OnClosed` 当连接被关闭的时候调用。
- `OnDetached` 当主动摘除连接的时候的调用。
- `React` 当 server 端接收到从 client 端发送来的数据的时候调用。(你的核心业务代码一般是写在这个方法里)
- `Tick` 服务器启动的时候会调用一次,之后就以给定的时间间隔定时调用一次,是一个定时器方法。
- `PreWrite` 预先写数据方法,在 server 端写数据回 client 端之前调用。

# 性能测试

## Linux (epoll)

### 系统参数

```powershell
Go Version: go1.12.9 linux/amd64
OS: Ubuntu 18.04
CPU: 8 Virtual CPUs
Memory: 16.0 GiB
```

### Echo Server

![echolinux.png](https://img.hacpai.com/file/2019/09/echolinux-fca6e6e5.png)


### HTTP Server

![httplinux.png](https://img.hacpai.com/file/2019/09/httplinux-663a0318.png)


## FreeBSD (kqueue)

### 系统参数

```powershell
Go Version: go version go1.12.9 darwin/amd64
OS: macOS Mojave 10.14.6
CPU: 4 CPUs
Memory: 8.0 GiB
```

### Echo Server

![echomac.png](https://img.hacpai.com/file/2019/09/echomac-7a29e0d1.png)


### HTTP Server

![httpmac.png](https://img.hacpai.com/file/2019/09/httpmac-cb6d26ea.png)


# 证书

`gnet` 的源码允许用户在遵循 MIT [开源证书](https://github.com/panjf2000/gnet/blob/master/LICENSE) 规则的前提下使用。

# 待做事项

> gnet 还在持续开发的过程中,所以这个仓库的代码和文档会一直持续更新,如果你对 gnet 感兴趣的话,欢迎给这个开源库贡献你的代码~~

分享一个纯 Go 编写的内嵌型 KV 数据库 NutsDB,支持事务以及多种数据结构

开源程序xujiajun 发表了文章 • 0 个评论 • 396 次浏览 • 2019-03-11 21:52 • 来自相关话题

大家好,分享一个我最近开源的用纯GO编写的内嵌型数据库。是对nosql的一个阶段性的实践。 ## Feature: * 支持 ACID 事务 (从v 0.3.0开始) * 支持基本的 ...查看全部
大家好,分享一个我最近开源的用纯GO编写的内嵌型数据库。是对nosql的一个阶段性的实践。


## Feature:

* 支持 ACID 事务 (从v 0.3.0开始)
* 支持基本的 Put、Delete、Get 操作
* 支持前缀扫描
* 支持范围扫描
* 除了基本的 String,还支持多种数据结构类似Redis的APi,如列表(list)、集合(set)、有序集合(sorted set)。

## 项目地址

https://github.com/xujiajun/nutsdb

> 欢迎大家给我提issue、star关注、提交PR。

开源高性能 web 缓存服务器 nuster

开源程序kehokoduru 发表了文章 • 0 个评论 • 1644 次浏览 • 2018-02-22 11:09 • 来自相关话题

nuster, 一个基于 HAProxy 的高性能 web 缓存服务器 。 完全兼容 HAProxy,并且利用 HAProxy 的 ACL 功能来提供非常细致的缓存规则。 项目地址 https://github.com/jiangwe ...查看全部
nuster, 一个基于 HAProxy 的高性能 web 缓存服务器 。 完全兼容 HAProxy,并且利用 HAProxy 的 ACL 功能来提供非常细致的缓存规则。

项目地址 https://github.com/jiangwenyuan/nuster

可以根据 url, path, query, header, cookie,请求速率等等来动态生成缓存,并设置有效期。支持 purge,支持前后端 HTTPS。

* 完全兼容 HAProxy,支持所有 HAProxy 的特性和功能
* 强大的动态缓存功能
* 根据 HTTP method, uri, path, query, header, cookie 等等进行缓存
* 根据 HTTP 请求和响应内容等等进行缓存
* 根据环境变量服务器状态等等进行缓存
* 根据 SSL 版本, SNI 等等进行缓存
* 根据连接数量,请求速率等等进行缓存
* 等等
* 非常快
* 删除缓存
* 前后端 HTTPS
* HTTP 压缩
* HTTP 重写重定向
* 等等

性能

非常快, 单进程模式下是 nginx 的 3 倍,多进程下 nginx 的 2 倍,varnish 的 3 倍。

详见[https://github.com/jiangwenyuan/nuster/wiki/Web-cache-server-performance-benchmark:-nuster-vs-nginx-vs-varnish-vs-squid](https://github.com/jiangwenyuan/nuster/wiki/Web-cache-server-performance-benchmark:-nuster-vs-nginx-vs-varnish-vs-squid)

版本更新 | Mesos调度器Swan v0.2来啦

开源程序数人云 发表了文章 • 0 个评论 • 1470 次浏览 • 2016-12-13 19:22 • 来自相关话题

>[数人云](http://www.shurenyun.com)Mesos调度器 [Swan](https://github.com/Dataman-Cloud/swan)开源已经一个月啦,在社区和大家的共同呵护下成长了许多。今天小数带来了Swan v0.2的 ...查看全部
>[数人云](http://www.shurenyun.com)Mesos调度器 [Swan](https://github.com/Dataman-Cloud/swan)开源已经一个月啦,在社区和大家的共同呵护下成长了许多。今天小数带来了Swan v0.2的新版本,添加了很多新功能,大家快来看看吧——

![](https://i.v2ex.co/wercsh2o.jpeg)

##Feature List

* Uri 支持:支持自定义资源,支持多资源下载
* PortIndex:支持端口命名,健康检测支持portIndex,portName和portValue
* Cli:命令行工具
* Heathcheck:支持mesos自带的healthcheck,http和tcp两种
* Raft:高可用,分布式数据复制和leader选举
* Proxy:自带proxy功能,支持负载均衡
* DNS:自带DNS功能,支持域名解析
* 一容器一IP:支持IP地址固定分配,一容器一IP
* Constraints:支持约束条件,UNIQUE和LIKE



Fork me on GitHub!
https://github.com/Dataman-Cloud/swan


###关于数人云Mesos调度器Swan

Swan是基于Mesos Restful API编写的应用调度框架,可以帮助用户轻松发布应用,实现应用的滚动更新,并根据用户指定的策略做应用的健康检测和故障转移。



json 解析器哪家强?

开源程序taowen 发表了文章 • 8 个评论 • 4996 次浏览 • 2016-12-07 12:42 • 来自相关话题

全文链接: [`https://github.com/json-iterator/go-benchmark`][1] 目的不是推销 json-iterator 。而是证明 json-iterator 不比其他的库更慢,从而使得大家可以 ...查看全部
全文链接: [`https://github.com/json-iterator/go-benchmark`][1]

目的不是推销 json-iterator 。而是证明 json-iterator 不比其他的库更慢,从而使得大家可以把吐槽点放到其他方面:比如特性是不是齐全, api 是不是友好。重新发明 json 解析器是因为经常需要处理奇怪格式的 json ,而又不想把数据转两遍。市面上没有 api 满足我的需求的,后面我会专门写一篇 api 介绍的文章来演示 json-iterator 的独特性。( https://github.com/json-iterator/go/blob/master/README.md )

* jsonparser: `https://github.com/buger/jsonparser`
* jsoniter pull-api: [`https://github.com/json-iterator/go`][2]
* jsoniter reflect-api: `https://github.com/json-iterator/go/blob/master/jsoniter_reflect.go`
* encoding/json: golang standard lib
* easy json: `https://github.com/mailru/easyjson`

测试设备

* CPU: i7-6700K @ 4.0G
* Level 1 cache size: 4 x 32 KB 8-way set associative instruction caches
* Level 2 cache size: 4 x 256 KB 4-way set associative caches
* Level 3 cache size: 8 MB 16-way set associative shared cache
* Go: 1.8beta1

# small payload

https://github.com/json-iterator/go-benchmark/blob/master/src/github.com/json-iterator/go-benchmark/benchmark_small_payload_test.go

| jsonparser | jsoniter pull-api | jsoniter reflect-api | encoding/json | easyjson |
| --- | --- | --- | --- | --- |
| 599 ns/op | 515 ns/op | 684 ns/op | 2453 ns/op | 687 ns/op |
| 64 B/op | 64 B/op | 256 B/op | 864 B/op | 64 B/op |
| 2 allocs/op | 2 allocs/op | 4 allocs/op | 31 allocs/op | 2 allocs/op |

encoding/json 在 i7-6700K 上性能还不错,但是在缓存小一些的 cpu 上性能要比这慢更多。

![small](https://github.com/json-iterator/go-benchmark/raw/master/small.png)

# medium payload

| jsonparser | jsoniter pull-api | jsoniter reflect-api | encoding/json | easyjson |
| --- | --- | --- | --- | --- |
| 5238 ns/op | 4111 ns/op | 4708 ns/op | 24939 ns/op | 7361 ns/op |
| 104 B/op | 104 B/op | 368 B/op | 808 B/op | 248 B/op |
| 4 allocs/op | 4 allocs/op | 14 allocs/op | 18 allocs/op | 8 allocs/op |

https://github.com/json-iterator/go-benchmark/blob/master/src/github.com/json-iterator/go-benchmark/benchmark_medium_payload_test.go

json-iterator 的反射 api 也是相当快的。

![medium](https://github.com/json-iterator/go-benchmark/raw/master/medium.png)

# large payload
https://github.com/json-iterator/go-benchmark/blob/master/src/github.com/json-iterator/go-benchmark/benchmark_large_payload_test.go

| jsonparser | jsoniter pull-api | encoding/json |
| --- | --- | --- |
| 38334 ns/op | 38463 ns/op | 290778 ns/op |
| 0 B/op | 0 B/op | 2128 B/op |
| 0 allocs/op | 0 allocs/op | 46 allocs/op |

jsonparser 在大部分字段不使用的时候,要快那么一丁点。

![large](https://github.com/json-iterator/go-benchmark/raw/master/large.png)

# large file

test file used: https://github.com/json-iterator/test-data/blob/master/large-file.json

| jsonparser | jsoniter pull-api | encoding/json |
| --- | --- | --- |
| 42698634 ns/op | 37760014 ns/op | 235354502 ns/op |
| 67107104 B/op | 4248 B/op | 71467896 B/op |
| 19 allocs/op | 5 allocs/op | 272477 allocs/op |

jsonparser 等其他一大票 json 解析器都是以 []byte 作为输入的,简直是为跑分而生。关于这一点 jackson 的作者也有吐槽( https://www.infoq.com/news/2014/05/jackson-founder-responds )。而 jsoniter 可以支持 io.Reader 作为输入,对于大文件处理非常友好。

![large-file](https://github.com/json-iterator/go-benchmark/raw/master/large-file.png)


[1]: https://github.com/json-iterator/go-benchmark
[2]: https://github.com/json-iterator/go

视频教程:玩转数人云Mesos调度器Swan

开源程序数人云 发表了文章 • 0 个评论 • 1396 次浏览 • 2016-11-17 11:25 • 来自相关话题

数人云开源第二弹! [数人云](http://www.shurenyun.com)Mesos调度器[Swan](https://github.com/Dataman-Cloud/swan)开源已经一周多了,收到很多小伙伴的帮助和反馈, ...查看全部
数人云开源第二弹!

[数人云](http://www.shurenyun.com)Mesos调度器[Swan](https://github.com/Dataman-Cloud/swan)开源已经一周多了,收到很多小伙伴的帮助和反馈,小数在这里表示感谢^_^
数人云工程师为Swan的使用录制了视频,帮助大家更好更快地了解Swan。

视频地址:http://v.qq.com/x/page/r0346559nfx.html



Fork me on GitHub!!https://github.com/Dataman-Cloud/swan


**关于Swan**

Swan基于Mesos Restful API编写的应用调度框架,可以帮助用户轻松发布应用,实现应用的滚动更新,并根据用户指定的策略做应用的健康检测和故障转移。未来,数人云Swan团队还将努力实现调度策略、高可用服务发现、网络管理、编排,以及任务抢占等功能。

动手造轮 | 一款Bash 脚本 +HTTP 请求工具 +JSON 解析工具组成的测试小工具

开源程序数人云 发表了文章 • 2 个评论 • 1981 次浏览 • 2016-11-03 12:23 • 来自相关话题

>[数人云](http://www.shurenyun.com)开源一款容器管理工具[Crane](http://),Crane开发过程中,为了保证API的健壮性和稳定性, 数人云开发团队自制了一套适合Crane API测试的小工具。它也适用于其他接口测试,小 ...查看全部
>[数人云](http://www.shurenyun.com)开源一款容器管理工具[Crane](http://),Crane开发过程中,为了保证API的健壮性和稳定性, 数人云开发团队自制了一套适合Crane API测试的小工具。它也适用于其他接口测试,小数发现很多朋友对它感兴趣,就勤劳地搬运过来,希望能为大家提供一个参考和思路。

针对Crane团队只向外输出API的特点, 选择测试工具是秉着以下原则的:

* 第一, 功能不要太复杂,学习曲线不能太陡, 功能够用就行;
* 第二, 可编程要好, 最好不要有界面,程序员友好。

于是一款简单的Bash脚本+HTTP 请求工具+JSON解析工具组成的测试小工具雏形出现了。

下面给大家展现这款工具的构成

Bash脚本: 测试工具的粘合剂, 不是Java也不是Python, 用Bash简单易用,功能强大。
Httpie: 一款类似curl的http工具, 不过比curl简单的多, 尤其是想发个JSON请求时候, 更简单。
jq: jq是一款命令行解析JSON文本的工具, 支持非常多的语法解析构造重组JSON文本。

下面依次给大家介绍一下httpie和jq的基本用法

##1. 例子说明如何使用httpie

httpie在terminal下的命令是http, 先来几个简单的例子给演示一下用法。

http get http://httpbin.org/get header:header-content

![](https://i.v2ex.co/VjeF3tnj.png)

其中, http是命令, get是请求method, http://httpbin.org 是请求地址, httpbin是一个http的测试服务; 用冒号相连的参数代表着HTTP请求头, 用等号连接为请求body中的JSON键和值。 httpie默认的请求为json请求, 所以不用过多指明,header已经加上了Content-Type:application/json。

http post http://httpbin.org/post header:header-content json-key=json-value

![](https://i.v2ex.co/i1nMzj4C.png)


http支持很多命令行选项, 介绍一个有意思的是 --check-status, check-status是把http response的非200值设置成进程的exit code, 比如:


![](https://i.v2ex.co/F797CyX4.png)

如上所示, 请求一个不存在的地址时候进程退出符号变成了4。 我们将大量使用这个feature来判断返回值。

##2. 例子说明如何使用jq

下面我们用几个例子介绍一下jq的用法。

![](https://i.v2ex.co/415y3RI0.png)

上图演示如何提取一个json的key。

![](https://i.v2ex.co/7q88R6k5.png)


如何提取一个嵌套的key。

![](https://i.v2ex.co/vf8y9VLZ.png)

提取数组中的元素。

篇幅关系我们不过多展示jq的高级功能, 除了基本的解析和构造以外,jq支持大量的filter, 如有兴趣可参考https://stedolan.github.io/jq/manual/#Builtinoperatorsandfunctions。

##3. Crane测试工具的几个场景

###场景一: 我期望测试API的HTTP测试的返回状态比如200, 404, 500

首先bash造了几个基本的函数来输出错误, 和判断状态

![](https://i.v2ex.co/s2juJ7ER.png)


使用方法

![](https://i.v2ex.co/8r55TCeV.png)

###场景二: 登录过程测试

![](https://i.v2ex.co/j8DN5dBq.png)


更多的测试例子可参考https://github.com/Dataman-Cloud/crane/tree/master/api_test 。

至此,一款可用的测试工具出炉了, 虽然简单,不过功能恰到好处,非常适合我们的场景, 再也不怕API出错发现不了了。 聪明的同事们把这工具配到了jenkins和单元测试一起执行, 出错了还能得到邮件通知, 酷极了。

go+lua的分布式计算工具--Gleam

文章分享themoonstone 发表了文章 • 0 个评论 • 3901 次浏览 • 2016-10-29 21:04 • 来自相关话题

此处是一个通过Go和LuaJIT编写的快速和可扩展的分布式映射/缩减系统,很好的将Go的高并发性与Luajit高性能相结合,可独立运行或用于分布式计算。 Gleam是一个高性能和高效的分布式执行系统,具备高性能、简单,通用,灵活和易于定制的特点。它 ...查看全部
此处是一个通过Go和LuaJIT编写的快速和可扩展的分布式映射/缩减系统,很好的将Go的高并发性与Luajit高性能相结合,可独立运行或用于分布式计算。
Gleam是一个高性能和高效的分布式执行系统,具备高性能、简单,通用,灵活和易于定制的特点。它在Go中构建,用户定义的计算可以用Lua,Unix管道工具或其它任何流程序编写。下面是它的安装方式和具体使用实例:
## 安装方式:
### 1、安装go
- https://golang.org/doc/install

### 2、安装luaJIT
- wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz
- tar zxf LuaJIT-2.0.4.tar.gz
- cd LuaJIT-2.0.4
- sudo make install

### 3、将自定义的MessagePack.lua放在luajit可以找到的文件夹下。
- // option 1: copy a file to lua lib path
- wget https://raw.githubusercontent.com/chrislusf/gleam/master/script/MessagePack.lua
- sudo cp MessagePack.lua /usr/local/share/luajit-2.0.4/
- // option 2: install for the machine
- sudo luarocks install --server=http://luarocks.org/dev gleam-lua
- // option 3: or install it locally
- luarocks install --server=http://luarocks.org/dev gleam-lua --local

### 4、 安装测试
如果出现以下问题,只需复制MessagePack.lua到其中一个路径。
- luajit: (command line):1: module 'MessagePack' not found:
- no field package.preload['MessagePack']
- no file './MessagePack.lua'
- no file '/usr/local/share/luajit-2.0.4/MessagePack.lua'
- no file '/usr/local/share/lua/5.1/MessagePack.lua'
- no file '/usr/local/share/lua/5.1/MessagePack/init.lua'
- no file './MessagePack.so'
- no file '/usr/local/lib/lua/5.1/MessagePack.so'
- no file '/usr/local/lib/lua/5.1/loadall.so'

## 使用实例:
```go
package main

import (
"os"

"github.com/chrislusf/gleam"
)

func main() {

gleam.New().TextFile("/etc/passwd").FlatMap(`
function(line)
return line:gmatch("%w+")
end
`).Map(`
function(word)
return word, 1
end
`).ReduceBy(`
function(x, y)
return x + y
end
`).Fprintf(os.Stdout, "%s,%d\n").Run()
}
```
通过以上内容、我们知道Geam的安装和使用都比较简单、而且基于golang和lua简单的语法规则和高效和并发性能、它也可以给用户带来更好的开发体验。希望有兴趣的同学可以享受到Gleam给大家带来的便利

## 源文链接:
https://github.com/chrislusf/gleam

SSH 服务器teleport

开源程序itfanr 发表了文章 • 0 个评论 • 1756 次浏览 • 2016-10-25 12:34 • 来自相关话题

Teleport 1.2 版本发布了,Gravitational Teleport 是一个先进的 SSH 服务器,可通过 SSH 或者 HTTPS 远程访问 Linux 服务器。其目的是为了替代 sshd。 https: ...查看全部
Teleport 1.2 版本发布了,Gravitational Teleport 是一个先进的 SSH 服务器,可通过 SSH 或者 HTTPS 远程访问 Linux 服务器。其目的是为了替代 sshd。


https://github.com/gravitational/teleport

在1.7.2发布之际发现重大bug之后,1.7.3终于如期release了

文章分享astaxie 发表了文章 • 8 个评论 • 2069 次浏览 • 2016-10-20 08:08 • 来自相关话题

Go 1.7.3 版本发布了。该版本主要修复了编译器和运行时状态, 1. [crypto/cipher: panic on s390x when len(src) == 0](https://github.com/golang/go/ ...查看全部
Go 1.7.3 版本发布了。该版本主要修复了编译器和运行时状态,

1. [crypto/cipher: panic on s390x when len(src) == 0](https://github.com/golang/go/issues/17435)
2. [cmd/compile: escaping closure incorrectly allocated on the stack](https://github.com/golang/go/issues/17318 "cmd/compile: escaping closure incorrectly allocated on the stack")
3. [runtime: hangup in umtx_op system call when changing system clock](https://github.com/golang/go/issues/17168 "runtime: hangup in umtx_op system call when changing system clock")
4. [crypto/tls: handshake race between read and write goroutines in go1.7](https://github.com/golang/go/issues/17101 "runtime: hangup in umtx_op system call when changing system clock")
5. [net/http: first byte of outgoing request body is sometimes lost](https://github.com/golang/go/issues/17071 "runtime: hangup in umtx_op system call when changing system clock")
6. [strings: SIGILL on s390x on z196](https://github.com/golang/go/issues/17032 "runtime: hangup in umtx_op system call when changing system clock")


详细的请访问如下地址:

https://github.com/golang/go/issues?q=milestone%3AGo1.7.3

下载地址:https://golang.org/dl/

TensorFlow支持Go语言了

文章分享astaxie 发表了文章 • 1 个评论 • 7524 次浏览 • 2016-10-19 11:12 • 来自相关话题

# TensorFlow 简介 TensorFlow是Google在2015年11月份开源的人工智能系统(Github项目地址),是之前所开发的深度学习基础架构DistBelief的改进版本,该系统可以被用于语音识别、图片识别等多个领 ...查看全部
# TensorFlow 简介

TensorFlow是Google在2015年11月份开源的人工智能系统(Github项目地址),是之前所开发的深度学习基础架构DistBelief的改进版本,该系统可以被用于语音识别、图片识别等多个领域。

官网上对TensorFlow的介绍是,一个使用数据流图(data flow graphs)技术来进行数值计算的开源软件库。数据流图中的节点,代表数值运算;节点节点之间的边,代表多维数据(tensors)之间的某种联系。你可以在多种设备(含有CPU或GPU)上通过简单的API调用来使用该系统的功能。TensorFlow是由Google Brain团队的研发人员负责的项目。

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/go

详细的讨论在这里,https://github.com/tensorflow/tensorflow/issues/10#issuecomment-245687757

可视化系统监控工具 Cloudinsight Agent 正式开源

开源程序Cloudinsight 发表了文章 • 5 个评论 • 3314 次浏览 • 2016-10-18 16:03 • 来自相关话题

![](http://o8g4uutrr.bkt.clouddn.com/cloudinsight%20agent%201.jpg) 很高兴地宣布 Cloudinsight Agent 在 BSD 开源协议下正式开源了。我们的工程师 ...查看全部
![](http://o8g4uutrr.bkt.clouddn.com/cloudinsight%20agent%201.jpg)

很高兴地宣布 Cloudinsight Agent 在 BSD 开源协议下正式开源了。我们的工程师在开源前已将代码用 Golang 重写,更加清晰简洁,欢迎各位参与到 Cloudinsight Agent 的开发和迭代中来。

##为什么要用 Golang 重写和开源

[Cloudinsight](http://cloudinsight.oneapm.com?utm_source=gocn&utm_medium=Article&utm_term=agentos&utm_campaign=CiTech&from=jscwgyegyv)是一个可视化系统监控工具,能够对数据指标进行聚合、分组、过滤、 管理、计算;并提供团队协作功能,共同管理数据和报警事件。而这些的关键,正是 Cloudinsight Agent。

###目前探针存在的问题:
- 各个服务的数据抓取存在强依赖关系,任何一个服务阻塞都可能导致探针进程挂掉。
- 缺乏对 log 和 json 的支持,用户需要通过 sdk 解析相关数据。
- 针对 自定义Plugin 的支持不够灵活,用户需要熟悉 Python,并按照探针定义好的接口上传数据。
- 探针使用 Omnibus 进行打包部署,虽然能解决用户安装上的一些问题,但对于新人来说,上手确实不是件容易的事,况且这个项目本身也有一些 bug,经历过的人自然懂。

###用 Golang 重写:
- 解决以上提到的种种问题。
- 优化探针架构。
- 提升探针性能。
- 开源,接受社区的监督,让深度用户可以参与到探针的版本迭代中来。


现在 Golang 版探针还是 Beta 版,所以支持的平台服务还不多,但这正是我们将 Cloudinsight Agent 上的工作推向开源的第一步,也希望有更多的开发者参与进来,让项目能有更快的进展。


##项目计划

###增加支持的平台和平台服务

目前用 Golang 重写的 Cloudinsight Agent 仅在 Linux 上进行了测试,未来会逐渐将原有 Python 探针支持的平台和平台服务替换至 Golang 版本,包括但不限于:
![](http://o8g4uutrr.bkt.clouddn.com/cloudinsight%20agent%202.png)



##加入项目
- Github:https://github.com/cloudinsight/cloudinsight-agent
- 配置要求:Go 1.5 以上版本

```go
$ mkdir -p $GOPATH/src/github.com/cloudinsight
$ cd $GOPATH/src/github.com/cloudinsight
$ git clone https://github.com/cloudinsight/cloudinsight-agent
$ cd cloudinsight-agent $ make build
```
##使用

首次使用需设置 License Key,可在 https://cloud.oneapm.com/#/settings 中获取
```go
$ cp cloudinsight-agent.conf.example cloudinsight-agent.conf
$ vi cloudinsight-agent.conf
...
license_key = "*********************"

```
在前台中运行命令
```go
$ ./bin/cloudinsight-agent

```
##致谢
从 15 年 8 月至今,Cloudinsight Agent 经过了 20 余次的迭代,从第一天的的 20 个用户发展到现在 5 万多的探针数,感谢长久以来支持 Cloudinsight 和提供宝贵建议的用户和开发者们,也再次感谢以下影响了我们的优秀的开源项目:
- [ddagent](https://github.com/datadog/dd-agent)
- [telegraf](https://github.com/influxdata/telegraf)
- [prometheus](https://github.com/influxdata/telegraf)
- [mackerel](https://github.com/influxdata/telegraf)


**在项目中有代码贡献的开发者,Cloudinsight 将送出一件限量 Tee 作为答谢。**
![](http://o8g4uutrr.bkt.clouddn.com/cloudinsight%20agent%203.png)




Cloudinsight 官网:[Cloudinsight.oneapm.com ](http://cloudinsight.oneapm.com?utm_source=gocn&utm_medium=Article&utm_term=agentos&utm_campaign=CiTech&from=jscwgyegyv "Cloudinsight.oneapm.com ") 欢迎访问了解

![](http://o8g4uutrr.bkt.clouddn.com/cloudinsight%20agent%204.gif)

图:在 Cloudinsight 中用标签进行集群管理

实时文件监控

文章分享themoonstone 发表了文章 • 1 个评论 • 4257 次浏览 • 2016-10-15 14:11 • 来自相关话题

由GO构建的实时重载和输出流的文件监控系统、在自定义路径下运行、构建和观察文件更改 ![](https://camo.githubusercontent.com/a6704d699df2b736a8da6c87e4b14d3d4b39bc55/68 ...查看全部
由GO构建的实时重载和输出流的文件监控系统、在自定义路径下运行、构建和观察文件更改
![](https://camo.githubusercontent.com/a6704d699df2b736a8da6c87e4b14d3d4b39bc55/687474703a2f2f692e696d6775722e636f6d2f644a624e5a6a742e676966)
特征:
- 可同时构建,安装,测试,Fmt和运行
- 支持在文件更改时重新加载(重新构建,重新安装和重新运行)
- 支持观看自定义路径
- 支持观看特定的文件扩展名
- 多个项目支持
- 支持输出流
- 执行时间
- 高度可定制
- 快速运行

原文链接:
https://github.com/tockins/realize

Rikka - 极简多插件私人图床

开源程序7sDream 发表了文章 • 3 个评论 • 3145 次浏览 • 2016-10-14 12:23 • 来自相关话题

OvO 终于有个 Go 社区了……我来发个学 Golang 的时候练手的一个东西吧…… ## 简介 Rikka 是一个极简的图床系统,设计理念是让每个人都能有个自己的好用的图床。为了极简,去掉了上传历史的功能 ...查看全部
OvO 终于有个 Go 社区了……我来发个学 Golang 的时候练手的一个东西吧……

## 简介

Rikka 是一个极简的图床系统,设计理念是让每个人都能有个自己的好用的图床。为了极简,去掉了上传历史的功能,所有的一切都按照 `上传-复制-关闭-粘贴` 的使用流程来设计。为了方便每个人自己部署,封装成了 Docker Image。DaoCloud 的一个 128M 的实例都能愉快的跑 Rikka,内存占用大约 10 - 20M。

因为是在我刚学 Go 的时候开的项目,所以我在有意的尽量不使用其他模块,专注于用自带 package 完成功能,对于其他初学者可能是个不错的例子哟。

## 特点/Feature:

- 极简,不保存上传历史
- 支持将图片链接复制成多种格式
- 文件储存部分插件化,有很多可用的插件,比如:新浪微博,七牛云,又拍云,腾讯云等
- 提供 API
- Web 服务和 RESTful API 服务模块化
- CLI 工具
- 只保证支持较新版本的 Chrome/Firefox/Safari
- 首页标志很可爱
- 维护者貌似很活跃 :)

## 目前支持的图片储存插件

- 本地服务器
- 七牛云
- 又拍云
- 新浪微博
- 腾讯云 COS
- 腾讯云 CI

可能以后还会加啦,因为是插件形式,所以加起来很简单。应该以后会有 Imgur 和 Flickr 插件吧。
恩,其实可以自己写插件的,但是我现在还没写插件的编写文档。不过把目前我写的几个插件看完应该也就明白怎么写了,很 Easy 的~

## 截图/Demo

首页:

![homepage](http://7sdream-rikka-demo.daoapp.io/files/2016-09-05-498160687)

预览页面:

![viewpage](http://7sdream-rikka-demo.daoapp.io/files/2016-09-05-457359417)

我在 DaoCloud 用免费配额搭了个 Rikka 做 Demo:http://7sdream-rikka-demo.daoapp.io/

密码是:`rikka`

感兴趣的可以去试试,最大图片大小 5M。不过这只是 Demo 哟,不要真的用这个啦,如果想自己搭个自用的 Rikka 的话可以看:[部署文档](https://github.com/7sDream/rikka/blob/master/deploy.zh.md)和[图文教程](https://github.com/7sDream/rikka/wiki/%E5%9C%A8-DaoCloud-%E4%B8%8A%E5%85%8D%E8%B4%B9%E9%83%A8%E7%BD%B2-Rikka)

我自己也在腾讯云部署了一个:http://akkir.me 但是这个就不告诉你们密码咯……毕竟是自用的。

## API/CLI

Rikka 是有 RESTFul 的 API 的,文档在[这里](https://github.com/7sDream/rikka/blob/master/api/README.zh.md)。

然后我还写了个 CLI 工具方便命令行使用:[文档](https://github.com/7sDream/rikka/blob/master/rikkac/README.zh.md)|[下载](https://github.com/7sDream/rikka/releases/tag/Rikkac)。

放个使用截图吧:

![](http://7sdream-rikka-demo.daoapp.io/files/2016-09-05-066558195)

然后是多张上传:

![](http://odbw8jckg.bkt.clouddn.com/ba2d2dca-2ae2-4436-ade2-7905183ce23d.png)

计划中是有跨平台 GUI 想法的,不过现在还没动手。

## 项目地址

嘎嘎嘎 项目地址留在最后:https://github.com/7sDream/rikka

Docker Image:https://hub.docker.com/r/7sdream/rikka/

如果刚开始学 Golang 的小伙伴应该可以稍微看看当作入门例子。

功力雄厚的同志们就来多提提意见吧~不甚感激!

对了对了,有谁知道 Docker Container 的 Logs 怎么和 Fail2Ban 结合起来使用呀?只能在 Container 里装个 Fail2Ban 么?