开源项目

开源项目

请问有没有比较好的分布式系统监控项目?

开源程序fiisio 回复了问题 • 10 人关注 • 4 个回复 • 1019 次浏览 • 2017-08-21 10:41 • 来自相关话题

Golang 中使用 JSON 的小技巧

开源程序taowen 发表了文章 • 3 个评论 • 1417 次浏览 • 2017-06-20 23:32 • 来自相关话题

有的时候上游传过来的字段是string类型的,但是我们却想用变成数字来使用。 本来用一个json:",string" 就可以支持了,如果不知道golang的这些小技巧,就要大费周章了。

参考文章:查看全部

有的时候上游传过来的字段是string类型的,但是我们却想用变成数字来使用。
本来用一个json:",string" 就可以支持了,如果不知道golang的这些小技巧,就要大费周章了。


参考文章:http://attilaolah.eu/2014/09/10/json-and-struct-composition-in-go/


临时忽略struct字段


type User struct {
Email string `json:"email"`
Password string `json:"password"`
// many more fields…
}

临时忽略掉Password字段


json.Marshal(struct {
*User
Password bool `json:"password,omitempty"`
}{
User: user,
})

临时添加额外的字段


type User struct {
Email string `json:"email"`
Password string `json:"password"`
// many more fields…
}

临时忽略掉Password字段,并且添加token字段


json.Marshal(struct {
*User
Token string `json:"token"`
Password bool `json:"password,omitempty"`
}{
User: user,
Token: token,
})

临时粘合两个struct


type BlogPost struct {
URL string `json:"url"`
Title string `json:"title"`
}

type Analytics struct {
Visitors int `json:"visitors"`
PageViews int `json:"page_views"`
}

json.Marshal(struct{
*BlogPost
*Analytics
}{post, analytics})

一个json切分成两个struct


json.Unmarshal([]byte(`{
"url": "attila@attilaolah.eu",
"title": "Attila's Blog",
"visitors": 6,
"page_views": 14
}`), &struct {
*BlogPost
*Analytics
}{&post, &analytics})

临时改名struct的字段


type CacheItem struct {
Key string `json:"key"`
MaxAge int `json:"cacheAge"`
Value Value `json:"cacheValue"`
}

json.Marshal(struct{
*CacheItem

// Omit bad keys
OmitMaxAge omit `json:"cacheAge,omitempty"`
OmitValue omit `json:"cacheValue,omitempty"`

// Add nice keys
MaxAge int `json:"max_age"`
Value *Value `json:"value"`
}{
CacheItem: item,

// Set the int by value:
MaxAge: item.MaxAge,

// Set the nested struct by reference, avoid making a copy:
Value: &item.Value,
})

用字符串传递数字


type TestObject struct {
Field1 int `json:",string"`
}

这个对应的json是 {"Field1": "100"}


如果json是 {"Field1": 100} 则会报错


容忍字符串和数字互转


如果你使用的是jsoniter,可以启动模糊模式来支持 PHP 传递过来的 JSON。


import "github.com/json-iterator/go/extra"

extra.RegisterFuzzyDecoders()

这样就可以处理字符串和数字类型不对的问题了。比如


var val string
jsoniter.UnmarshalFromString(`100`, &val)

又比如


var val float32
jsoniter.UnmarshalFromString(`"1.23"`, &val)

容忍空数组作为对象


PHP另外一个令人崩溃的地方是,如果 PHP array是空的时候,序列化出来是[]。但是不为空的时候,序列化出来的是{"key":"value"}
我们需要把 [] 当成 {} 处理。


如果你使用的是jsoniter,可以启动模糊模式来支持 PHP 传递过来的 JSON。


import "github.com/json-iterator/go/extra"

extra.RegisterFuzzyDecoders()

这样就可以支持了


var val map[string]interface{}
jsoniter.UnmarshalFromString(`[]`, &val)

使用 MarshalJSON支持time.Time


golang 默认会把 time.Time 用字符串方式序列化。如果我们想用其他方式表示 time.Time,需要自定义类型并定义 MarshalJSON。


type timeImplementedMarshaler time.Time

func (obj timeImplementedMarshaler) MarshalJSON() ([]byte, error) {
seconds := time.Time(obj).Unix()
return []byte(strconv.FormatInt(seconds, 10)), nil
}

序列化的时候会调用 MarshalJSON


type TestObject struct {
Field timeImplementedMarshaler
}
should := require.New(t)
val := timeImplementedMarshaler(time.Unix(123, 0))
obj := TestObject{val}
bytes, err := jsoniter.Marshal(obj)
should.Nil(err)
should.Equal(`{"Field":123}`, string(bytes))

使用 RegisterTypeEncoder支持time.Time


jsoniter 能够对不是你定义的type自定义JSON编解码方式。比如对于 time.Time 可以用 epoch int64 来序列化


import "github.com/json-iterator/go/extra"

extra.RegisterTimeAsInt64Codec(time.Microsecond)
output, err := jsoniter.Marshal(time.Unix(1, 1002))
should.Equal("1000001", string(output))

如果要自定义的话,参见 RegisterTimeAsInt64Codec 的实现代码


使用 MarshalText支持非字符串作为key的map


虽然 JSON 标准里只支持 string 作为 key 的 map。但是 golang 通过 MarshalText() 接口,使得其他类型也可以作为 map 的 key。例如


f, _, _ := big.ParseFloat("1", 10, 64, big.ToZero)
val := map[*big.Float]string{f: "2"}
str, err := MarshalToString(val)
should.Equal(`{"1":"2"}`, str)

其中 big.Float 就实现了 MarshalText()


使用 json.RawMessage


如果部分json文档没有标准格式,我们可以把原始的文本信息用string保存下来。


type TestObject struct {
Field1 string
Field2 json.RawMessage
}
var data TestObject
json.Unmarshal([]byte(`{"field1": "hello", "field2": [1,2,3]}`), &data)
should.Equal(` [1,2,3]`, string(data.Field2))

使用 json.Number


默认情况下,如果是 interface{} 对应数字的情况会是 float64 类型的。如果输入的数字比较大,这个表示会有损精度。所以可以 UseNumber() 启用 json.Number 来用字符串表示数字。


decoder1 := json.NewDecoder(bytes.NewBufferString(`123`))
decoder1.UseNumber()
var obj1 interface{}
decoder1.Decode(&obj1)
should.Equal(json.Number("123"), obj1)

jsoniter 支持标准库的这个用法。同时,扩展了行为使得 Unmarshal 也可以支持 UseNumber 了。


json := Config{UseNumber:true}.Froze()
var obj interface{}
json.UnmarshalFromString("123", &obj)
should.Equal(json.Number("123"), obj)

统一更改字段的命名风格


经常 JSON 里的字段名 Go 里的字段名是不一样的。我们可以用 field tag 来修改。


output, err := jsoniter.Marshal(struct {
UserName string `json:"user_name"`
FirstLanguage string `json:"first_language"`
}{
UserName: "taowen",
FirstLanguage: "Chinese",
})
should.Equal(`{"user_name":"taowen","first_language":"Chinese"}`, string(output))

但是一个个字段来设置,太麻烦了。如果使用 jsoniter,我们可以统一设置命名风格。


import "github.com/json-iterator/go/extra"

extra.SetNamingStrategy(LowerCaseWithUnderscores)
output, err := jsoniter.Marshal(struct {
UserName string
FirstLanguage string
}{
UserName: "taowen",
FirstLanguage: "Chinese",
})
should.Nil(err)
should.Equal(`{"user_name":"taowen","first_language":"Chinese"}`, string(output))

使用私有的字段


Go 的标准库只支持 public 的 field。jsoniter 额外支持了 private 的 field。需要使用 SupportPrivateFields() 来开启开关。


import "github.com/json-iterator/go/extra"

extra.SupportPrivateFields()
type TestObject struct {
field1 string
}
obj := TestObject{}
jsoniter.UnmarshalFromString(`{"field1":"Hello"}`, &obj)
should.Equal("Hello", obj.field1)

软文撰写不易,客官点个赞呗:https://github.com/json-iterator/go

beego1.8版本功能征集

文章分享lkhjlbh 回复了问题 • 22 人关注 • 26 个回复 • 3507 次浏览 • 2017-03-22 17:58 • 来自相关话题

API 利器 —— Faygo Web 框架

开源程序henrylee2cn 发表了文章 • 5 个评论 • 1498 次浏览 • 2017-02-25 15:45 • 来自相关话题

Faygo

Faygo 使用全新架构,是最合适开发API接口的Go Web框架。用户只需定义一个struct Handler,就能自动绑定、验证请求参数并生成在线API文档。

查看全部

Faygo


Faygo 使用全新架构,是最合适开发API接口的Go Web框架。用户只需定义一个struct Handler,就能自动绑定、验证请求参数并生成在线API文档。


Faygo Favicon


官方QQ群:Go-Web 编程 42730308 Go-Web 编程群


查看《用户手册》


faygo index


faygo apidoc


faygo server


最新版本


版本号


v1.0


安装要求


Go Version ≥1.8


快速使用



  • 方式一 源码下载


go get -u -v github.com/henrylee2cn/faygo


go get -u -v github.com/henrylee2cn/fay

        fay command [arguments]

The commands are:
new 创建、编译和运行(监控文件变化)一个新的faygo项目
run 编译和运行(监控文件变化)任意一个已存在的golang项目

fay new appname [apptpl]
appname 指定新faygo项目的创建目录
apptpl 指定一个faygo项目模板(可选)

fay run [appname]
appname 指定待运行的golang项目路径(可选)

框架特性




  • 一个 struct Handler 搞定多件事:



    • 定义 Handler/Middleware

    • 绑定与验证请求参数

    • 生成 Swagger2.0 API 在线文档

    • 数据库 ORM 映射



  • Handler与Middleware完全相同,都是实现Handler接口(funcstruct类型),共同构成路由操作链,只是概念层面的说法不同

  • 支持多种网络类型:



































网络类型 配置net_types
HTTP http
HTTPS/HTTP2(TLS) https
HTTPS/HTTP2(Let's Encrypt TLS) letsencrypt
HTTPS/HTTP2(Let's Encrypt TLS on UNIX socket) unix_letsencrypt
HTTP(UNIX socket) unix_http
HTTPS/HTTP2(TLS on UNIX socket) unix_https


  • 支持单服务单监听、单服务多监听、多服务多监听等,多个服务的配置信息相互独立

  • 基于 httprouter 开发高性能路由,支持链式与树形两种注册风格,支持灵活的静态文件路由(如DirFS、RenderFS、MarkdownFS等)

  • 支持平滑关闭、平滑升级,提供fay工具进行新建项目、热编译、元编程

  • 采用最强大的 pongo2 作为HTML渲染引擎

  • 提供近似LRU的文件缓存功能,主要用途是静态文件缓存

  • 跨平台的彩色日志系统,且同时支持console和file两种输出形式(可以同时使用)

  • 提供Session管理功能

  • 支持Gzip全局配置

  • 提供XSRF跨站请求伪造安全过滤

  • 大多数功能尽量使用简洁的ini进行配置来避免不必要的重新编译,并且这些配置文件支持自动补填默认值

  • 提供 gormxormsqlxdirectSQLWebsocketinihttp client 等很多常用扩展包


faygo struct handler 多重用途合一


简单示例


package main

import (
// "mime/multipart"
"time"
"github.com/henrylee2cn/faygo"
)

type Index struct {
Id int `param:"<in:path> <required> <desc:ID> <range: 0:10>"`
Title string `param:"<in:query> <nonzero>"`
Paragraph []string `param:"<in:query> <name:p> <len: 1:10> <regexp: ^[\\w]*$>"`
Cookie string `param:"<in:cookie> <name:faygoID>"`
// Picture *multipart.FileHeader `param:"<in:formData> <name:pic> <maxmb:30>"`
}

func (i *Index) Serve(ctx *faygo.Context) error {
if ctx.CookieParam("faygoID") == "" {
ctx.SetCookie("faygoID", time.Now().String())
}
return ctx.JSON(200, i)
}

func main() {
app := faygo.New("myapp", "0.1")

// Register the route in a chain style
app.GET("/index/:id", new(Index))

// Register the route in a tree style
// app.Route(
// app.NewGET("/index/:id", new(Index)),
// )

// Start the service
faygo.Run()
}

/*
http GET:
http://localhost:8080/index/1% ... 3Dxyz
response:
{
"Id": 1,
"Title": "test",
"Paragraph": [
"abc",
"xyz"
],
"Cookie": "2016-11-13 01:14:40.9038005 +0800 CST"
}
*/

示例库


开源协议


Faygo 项目采用商业应用友好的 Apache2.0 协议发布。

json 解析器哪家强?

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

全文链接: https://github.com/json-iterator/go-benchmark查看全部

全文链接: https://github.com/json-iterator/go-benchmark


目的不是推销 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

  • 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


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


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


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

请问有没有比较实用的go日志分析程序?

有问必答九命猫 回复了问题 • 7 人关注 • 4 个回复 • 1562 次浏览 • 2016-12-06 13:52 • 来自相关话题

练手项目,实现一个web框架

开源程序golang 发表了文章 • 4 个评论 • 804 次浏览 • 2016-11-14 20:01 • 来自相关话题

github.com/zjj2wry/virgin,楼主也刚搞go半年多,写业务无聊了,所以想研究怎么实现一个简单的web框架,学习学习~~

github.com/zjj2wry/virgin,楼主也刚搞go半年多,写业务无聊了,所以想研究怎么实现一个简单的web框架,学习学习~~

golang和adb

开源程序themoonstone 发表了文章 • 1 个评论 • 496 次浏览 • 2016-11-13 16:48 • 来自相关话题

golang也能和安卓结合啦、分享一个基于golang和adb的安卓应用:

软件包adbbot提供Android应用程序自动化的基本功能。 这个包基于Golang标准包和Android Debug Bridge(adb)的执行文件。话不多说... 查看全部

golang也能和安卓结合啦、分享一个基于golang和adb的安卓应用:


软件包adbbot提供Android应用程序自动化的基本功能。 这个包基于Golang标准包和Android Debug Bridge(adb)的执行文件。话不多说、直接看看实例:


package main

import (
"flag"
"log"
"runtime"
"time"

"./adbbot"
)

var verbosity = flag.Int("v", 2, "verbosity")
var ADB = flag.String("adb", "adb", "adb exec path")
var DEV = flag.String("dev", "", "select device")

var APP = flag.String("app", "com.android.vending", "app package name")
var TMPL = flag.String("tmpl", "tmpl.png", "app package name")

func main() {

log.SetFlags(log.Ldate|log.Ltime)
flag.Parse()
runtime.GOMAXPROCS(runtime.NumCPU())

adbbot.Verbosity = *verbosity
bot := adbbot.NewBot(*DEV, *ADB)

Vlogln(2, "[adb]", "wait-for-device")
_, err := bot.Run("wait-for-device")
if err != nil {
Vlogln(1, "adb err", err)
}

// press Home key
bot.KeyHome()

// start APP
bot.StartApp(*APP)

// create matching region between Point <100,635> and <9999,9999>
//reg := bot.NewRectAbs(100, 635, 9999, 9999)

// or All the screen (slow)
reg := bot.NewRectAll()

// create matching template
tmpl, err := bot.NewTmpl(*TMPL, reg)
if err != nil {
Vlogln(2, "load template image err", err)
} else {

// try to find target
// 10 times with 1000ms delay between each search
x, y, val := bot.FindExistReg(tmpl, 10, 1000)
if x == -1 && y == -1 {
Vlogln(2, "template not found", x, y, val)
} else {
Vlogln(2, "template found at", x, y, val)
}

}

infoname := time.Now().Format("20060102_150405")
err = bot.SaveScreen(infoname + ".png")
if err != nil {
Vlogln(2, "SaveScreen err", err)
} else {
Vlogln(2, "SaveScreen as file ", infoname + ".png")
}

// force-stop APP
bot.KillApp(*APP)

}

func Vlogln(level int, v ...interface{}) {
if level <= *verbosity {
log.Println(v...)
}
}

代码量不是很大、也比较容易理解、有兴趣的同学可以深入研究一下


原文链接:https://github.com/cs8425/go-adbbot

自动生成代替interface的线程安全map

开源程序ggaaooppeenngg 发表了文章 • 0 个评论 • 600 次浏览 • 2016-11-09 16:55 • 来自相关话题

https://github.com/ggaaooppeenngg/safemap

项目当中经常要使用线程安全的map,但是实际... 查看全部

https://github.com/ggaaooppeenngg/safemap


项目当中经常要使用线程安全的map,但是实际编码的时候会因为失误引入一些非线程安全的代码。
把这些东西封装成一个包是一个比较好的方式。


这个工具的主要的特点是能够根据类型自动生成线程安全的map,做了一些简单的测试如果用interface类型转换的代价和用自动生成的固定类型的代价可能差距大概是20ns/op(40ns/op-20ns/op)的一个差距,当然这个差距并不是很致命的一个问题,至少用代码生成可以对性能有一个提升,可能引起的问题是项目中类似的map过多,生成的map的代码可能会很多,所以综合考量的话,在一个包里只有一两个map是要保证线程的安全的话,其实是很适合的,也比较方便管理,不管是在build的时候生成还是把生成的代码放入版本控制当中。当然也有很多自动生成的库可以用,但是为了减少依赖并没有使用。


使用方式可以结合go generate使用,比如在代码中嵌入。


//go:generate safemap -k string -v string -n namespace

在项目中会生成namespace_safemap.go文件,类型为type namespaceSafemap map[string]string,对应的GetSet方法是线程安全的。


目前正在做的是一个类似的实现思路的cache,https://github.com/ggaaooppeenngg/cachemap

golang 开源项目汇总(基于互联网架构分类)

文章分享hackstoic 发表了文章 • 2 个评论 • 1548 次浏览 • 2016-11-02 23:29 • 来自相关话题

随着go语言的流行, 我 们希望能在企业中推广go, 使用go,把一些优秀的go语言开源项目应用到公司的架构设计中和技术选型中。 但是苦于开源项目太多, 分类太杂, 始终没办法按照互联网架构设计中的一些组件来分类,和检索,不知道从何找起。 因此我根据go... 查看全部

随着go语言的流行, 我 们希望能在企业中推广go, 使用go,把一些优秀的go语言开源项目应用到公司的架构设计中和技术选型中。 但是苦于开源项目太多, 分类太杂, 始终没办法按照互联网架构设计中的一些组件来分类,和检索,不知道从何找起。
因此我根据go语言中文社区提供的资料,还有互联网企业架构设计中的常见组件分类, 共精心挑选了100多个开源项目(项目不限于在github开源的项目), 分成以下十几个大类。 这个项目可以理解为互联网IT人打造的中文版awesome-go。这个项目初衷是帮助到那些想学习和借鉴优秀golang开源项目, 和在互联网架构设计时期望快速寻找合适轮子的人。


目录



项目地址: https://github.com/hackstoic/golang-open-source-projects


欢迎吐槽,提建议。 如果觉得项目有价值, 记得点个赞支持一下下哦。 有新的想法或者不错的项目也欢迎提pull request。

Aeron消息传递客户端--Go版

技术讨论themoonstone 发表了文章 • 0 个评论 • 370 次浏览 • 2016-11-02 12:51 • 来自相关话题

一个使用go实现的高效可靠的UDP单播,UDP组播和IPC消息传输客户端

实现了其设计、架构、和协议功能、可以实现正常的消息订阅、发布

软件的安装和使用都比较方便、另外、此开源项目适合开发者学习、代码量不多、但对channel... 查看全部

一个使用go实现的高效可靠的UDP单播,UDP组播和IPC消息传输客户端


实现了其设计、架构、和协议功能、可以实现正常的消息订阅、发布


软件的安装和使用都比较方便、另外、此开源项目适合开发者学习、代码量不多、但对channel的运用很值得一看、感兴趣的同学可以深入了解一下


附:
原文链接:https://github.com/lirm/aeron-go/

SSH 服务器teleport

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

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

查看全部

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


https://github.com/gravitational/teleport

视频来啦 | 手把手教你玩转数人云容器管理面板Crane

Go开源项目数人云 发表了文章 • 0 个评论 • 354 次浏览 • 2016-10-19 10:40 • 来自相关话题

数人云容器管理面板Crane已经开源一个月多啦,经历了新版本v1.0.... 查看全部

数人云容器管理面板Crane已经开源一个月多啦,经历了新版本v1.0.5的发布,完善了许多功能和体验。今天小数给小伙伴们带来的是数人云总架构师为大家录制的Crane使用视频。从安装到使用,step by step,玩转容器管理面板就是这么简单!


小数友情提示,在电脑上超清模式下获得最好的视频体验:)


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


关于Crane


数人云容器管理面板Crane是国内首个基于最新 Docker SwarmKit 技术的集群管理工具。它根据 Docker 的原生编排功能,采用轻量化架构,帮助开发者快速搭建 DevOps 环境,体验 Docker 的各种最新功能。


欢迎扫码下方二维码来Crane交流群进行技术交流~(^-^)V


有没有好用的开源CDN服务?

有问必答astaxie 回复了问题 • 4 人关注 • 1 个回复 • 1256 次浏览 • 2016-10-18 16:40 • 来自相关话题

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

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

很高兴地宣布 Cloudinsight Agent 在 BSD 开源协议... 查看全部


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


为什么要用 Golang 重写和开源


Cloudinsight是一个可视化系统监控工具,能够对数据指标进行聚合、分组、过滤、 管理、计算;并提供团队协作功能,共同管理数据和报警事件。而这些的关键,正是 Cloudinsight Agent。


目前探针存在的问题:



  • 各个服务的数据抓取存在强依赖关系,任何一个服务阻塞都可能导致探针进程挂掉。

  • 缺乏对 log 和 json 的支持,用户需要通过 sdk 解析相关数据。

  • 针对 自定义Plugin 的支持不够灵活,用户需要熟悉 Python,并按照探针定义好的接口上传数据。

  • 探针使用 Omnibus 进行打包部署,虽然能解决用户安装上的一些问题,但对于新人来说,上手确实不是件容易的事,况且这个项目本身也有一些 bug,经历过的人自然懂。


用 Golang 重写:



  • 解决以上提到的种种问题。

  • 优化探针架构。

  • 提升探针性能。

  • 开源,接受社区的监督,让深度用户可以参与到探针的版本迭代中来。


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


项目计划


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


目前用 Golang 重写的 Cloudinsight Agent 仅在 Linux 上进行了测试,未来会逐渐将原有 Python 探针支持的平台和平台服务替换至 Golang 版本,包括但不限于:


加入项目



$ 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 中获取


$ cp cloudinsight-agent.conf.example cloudinsight-agent.conf 
$ vi cloudinsight-agent.conf
...
license_key = "*********************"

在前台中运行命令


$ ./bin/cloudinsight-agent

致谢


从 15 年 8 月至今,Cloudinsight Agent 经过了 20 余次的迭代,从第一天的的 20 个用户发展到现在 5 万多的探针数,感谢长久以来支持 Cloudinsight 和提供宝贵建议的用户和开发者们,也再次感谢以下影响了我们的优秀的开源项目:



在项目中有代码贡献的开发者,Cloudinsight 将送出一件限量 Tee 作为答谢。


Cloudinsight 官网:Cloudinsight.oneapm.com 欢迎访问了解



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

条新动态, 点击查看
zdreamx

zdreamx 回答了问题 • 2016-11-08 11:27 • 26 个回复 不感兴趣

beego1.8版本功能征集

赞同来自:

orm有没有考虑分表分区分库的优化或支持
orm有没有考虑分表分区分库的优化或支持

请问有没有比较好的分布式系统监控项目?

回复

开源程序fiisio 回复了问题 • 10 人关注 • 4 个回复 • 1019 次浏览 • 2017-08-21 10:41 • 来自相关话题

beego1.8版本功能征集

回复

文章分享lkhjlbh 回复了问题 • 22 人关注 • 26 个回复 • 3507 次浏览 • 2017-03-22 17:58 • 来自相关话题

请问有没有比较实用的go日志分析程序?

回复

有问必答九命猫 回复了问题 • 7 人关注 • 4 个回复 • 1562 次浏览 • 2016-12-06 13:52 • 来自相关话题

有没有好用的开源CDN服务?

回复

有问必答astaxie 回复了问题 • 4 人关注 • 1 个回复 • 1256 次浏览 • 2016-10-18 16:40 • 来自相关话题

Golang 中使用 JSON 的小技巧

开源程序taowen 发表了文章 • 3 个评论 • 1417 次浏览 • 2017-06-20 23:32 • 来自相关话题

有的时候上游传过来的字段是string类型的,但是我们却想用变成数字来使用。 本来用一个json:",string" 就可以支持了,如果不知道golang的这些小技巧,就要大费周章了。

参考文章:查看全部

有的时候上游传过来的字段是string类型的,但是我们却想用变成数字来使用。
本来用一个json:",string" 就可以支持了,如果不知道golang的这些小技巧,就要大费周章了。


参考文章:http://attilaolah.eu/2014/09/10/json-and-struct-composition-in-go/


临时忽略struct字段


type User struct {
Email string `json:"email"`
Password string `json:"password"`
// many more fields…
}

临时忽略掉Password字段


json.Marshal(struct {
*User
Password bool `json:"password,omitempty"`
}{
User: user,
})

临时添加额外的字段


type User struct {
Email string `json:"email"`
Password string `json:"password"`
// many more fields…
}

临时忽略掉Password字段,并且添加token字段


json.Marshal(struct {
*User
Token string `json:"token"`
Password bool `json:"password,omitempty"`
}{
User: user,
Token: token,
})

临时粘合两个struct


type BlogPost struct {
URL string `json:"url"`
Title string `json:"title"`
}

type Analytics struct {
Visitors int `json:"visitors"`
PageViews int `json:"page_views"`
}

json.Marshal(struct{
*BlogPost
*Analytics
}{post, analytics})

一个json切分成两个struct


json.Unmarshal([]byte(`{
"url": "attila@attilaolah.eu",
"title": "Attila's Blog",
"visitors": 6,
"page_views": 14
}`), &struct {
*BlogPost
*Analytics
}{&post, &analytics})

临时改名struct的字段


type CacheItem struct {
Key string `json:"key"`
MaxAge int `json:"cacheAge"`
Value Value `json:"cacheValue"`
}

json.Marshal(struct{
*CacheItem

// Omit bad keys
OmitMaxAge omit `json:"cacheAge,omitempty"`
OmitValue omit `json:"cacheValue,omitempty"`

// Add nice keys
MaxAge int `json:"max_age"`
Value *Value `json:"value"`
}{
CacheItem: item,

// Set the int by value:
MaxAge: item.MaxAge,

// Set the nested struct by reference, avoid making a copy:
Value: &item.Value,
})

用字符串传递数字


type TestObject struct {
Field1 int `json:",string"`
}

这个对应的json是 {"Field1": "100"}


如果json是 {"Field1": 100} 则会报错


容忍字符串和数字互转


如果你使用的是jsoniter,可以启动模糊模式来支持 PHP 传递过来的 JSON。


import "github.com/json-iterator/go/extra"

extra.RegisterFuzzyDecoders()

这样就可以处理字符串和数字类型不对的问题了。比如


var val string
jsoniter.UnmarshalFromString(`100`, &val)

又比如


var val float32
jsoniter.UnmarshalFromString(`"1.23"`, &val)

容忍空数组作为对象


PHP另外一个令人崩溃的地方是,如果 PHP array是空的时候,序列化出来是[]。但是不为空的时候,序列化出来的是{"key":"value"}
我们需要把 [] 当成 {} 处理。


如果你使用的是jsoniter,可以启动模糊模式来支持 PHP 传递过来的 JSON。


import "github.com/json-iterator/go/extra"

extra.RegisterFuzzyDecoders()

这样就可以支持了


var val map[string]interface{}
jsoniter.UnmarshalFromString(`[]`, &val)

使用 MarshalJSON支持time.Time


golang 默认会把 time.Time 用字符串方式序列化。如果我们想用其他方式表示 time.Time,需要自定义类型并定义 MarshalJSON。


type timeImplementedMarshaler time.Time

func (obj timeImplementedMarshaler) MarshalJSON() ([]byte, error) {
seconds := time.Time(obj).Unix()
return []byte(strconv.FormatInt(seconds, 10)), nil
}

序列化的时候会调用 MarshalJSON


type TestObject struct {
Field timeImplementedMarshaler
}
should := require.New(t)
val := timeImplementedMarshaler(time.Unix(123, 0))
obj := TestObject{val}
bytes, err := jsoniter.Marshal(obj)
should.Nil(err)
should.Equal(`{"Field":123}`, string(bytes))

使用 RegisterTypeEncoder支持time.Time


jsoniter 能够对不是你定义的type自定义JSON编解码方式。比如对于 time.Time 可以用 epoch int64 来序列化


import "github.com/json-iterator/go/extra"

extra.RegisterTimeAsInt64Codec(time.Microsecond)
output, err := jsoniter.Marshal(time.Unix(1, 1002))
should.Equal("1000001", string(output))

如果要自定义的话,参见 RegisterTimeAsInt64Codec 的实现代码


使用 MarshalText支持非字符串作为key的map


虽然 JSON 标准里只支持 string 作为 key 的 map。但是 golang 通过 MarshalText() 接口,使得其他类型也可以作为 map 的 key。例如


f, _, _ := big.ParseFloat("1", 10, 64, big.ToZero)
val := map[*big.Float]string{f: "2"}
str, err := MarshalToString(val)
should.Equal(`{"1":"2"}`, str)

其中 big.Float 就实现了 MarshalText()


使用 json.RawMessage


如果部分json文档没有标准格式,我们可以把原始的文本信息用string保存下来。


type TestObject struct {
Field1 string
Field2 json.RawMessage
}
var data TestObject
json.Unmarshal([]byte(`{"field1": "hello", "field2": [1,2,3]}`), &data)
should.Equal(` [1,2,3]`, string(data.Field2))

使用 json.Number


默认情况下,如果是 interface{} 对应数字的情况会是 float64 类型的。如果输入的数字比较大,这个表示会有损精度。所以可以 UseNumber() 启用 json.Number 来用字符串表示数字。


decoder1 := json.NewDecoder(bytes.NewBufferString(`123`))
decoder1.UseNumber()
var obj1 interface{}
decoder1.Decode(&obj1)
should.Equal(json.Number("123"), obj1)

jsoniter 支持标准库的这个用法。同时,扩展了行为使得 Unmarshal 也可以支持 UseNumber 了。


json := Config{UseNumber:true}.Froze()
var obj interface{}
json.UnmarshalFromString("123", &obj)
should.Equal(json.Number("123"), obj)

统一更改字段的命名风格


经常 JSON 里的字段名 Go 里的字段名是不一样的。我们可以用 field tag 来修改。


output, err := jsoniter.Marshal(struct {
UserName string `json:"user_name"`
FirstLanguage string `json:"first_language"`
}{
UserName: "taowen",
FirstLanguage: "Chinese",
})
should.Equal(`{"user_name":"taowen","first_language":"Chinese"}`, string(output))

但是一个个字段来设置,太麻烦了。如果使用 jsoniter,我们可以统一设置命名风格。


import "github.com/json-iterator/go/extra"

extra.SetNamingStrategy(LowerCaseWithUnderscores)
output, err := jsoniter.Marshal(struct {
UserName string
FirstLanguage string
}{
UserName: "taowen",
FirstLanguage: "Chinese",
})
should.Nil(err)
should.Equal(`{"user_name":"taowen","first_language":"Chinese"}`, string(output))

使用私有的字段


Go 的标准库只支持 public 的 field。jsoniter 额外支持了 private 的 field。需要使用 SupportPrivateFields() 来开启开关。


import "github.com/json-iterator/go/extra"

extra.SupportPrivateFields()
type TestObject struct {
field1 string
}
obj := TestObject{}
jsoniter.UnmarshalFromString(`{"field1":"Hello"}`, &obj)
should.Equal("Hello", obj.field1)

软文撰写不易,客官点个赞呗:https://github.com/json-iterator/go

API 利器 —— Faygo Web 框架

开源程序henrylee2cn 发表了文章 • 5 个评论 • 1498 次浏览 • 2017-02-25 15:45 • 来自相关话题

Faygo

Faygo 使用全新架构,是最合适开发API接口的Go Web框架。用户只需定义一个struct Handler,就能自动绑定、验证请求参数并生成在线API文档。

查看全部

Faygo


Faygo 使用全新架构,是最合适开发API接口的Go Web框架。用户只需定义一个struct Handler,就能自动绑定、验证请求参数并生成在线API文档。


Faygo Favicon


官方QQ群:Go-Web 编程 42730308 Go-Web 编程群


查看《用户手册》


faygo index


faygo apidoc


faygo server


最新版本


版本号


v1.0


安装要求


Go Version ≥1.8


快速使用



  • 方式一 源码下载


go get -u -v github.com/henrylee2cn/faygo


go get -u -v github.com/henrylee2cn/fay

        fay command [arguments]

The commands are:
new 创建、编译和运行(监控文件变化)一个新的faygo项目
run 编译和运行(监控文件变化)任意一个已存在的golang项目

fay new appname [apptpl]
appname 指定新faygo项目的创建目录
apptpl 指定一个faygo项目模板(可选)

fay run [appname]
appname 指定待运行的golang项目路径(可选)

框架特性




  • 一个 struct Handler 搞定多件事:



    • 定义 Handler/Middleware

    • 绑定与验证请求参数

    • 生成 Swagger2.0 API 在线文档

    • 数据库 ORM 映射



  • Handler与Middleware完全相同,都是实现Handler接口(funcstruct类型),共同构成路由操作链,只是概念层面的说法不同

  • 支持多种网络类型:



































网络类型 配置net_types
HTTP http
HTTPS/HTTP2(TLS) https
HTTPS/HTTP2(Let's Encrypt TLS) letsencrypt
HTTPS/HTTP2(Let's Encrypt TLS on UNIX socket) unix_letsencrypt
HTTP(UNIX socket) unix_http
HTTPS/HTTP2(TLS on UNIX socket) unix_https


  • 支持单服务单监听、单服务多监听、多服务多监听等,多个服务的配置信息相互独立

  • 基于 httprouter 开发高性能路由,支持链式与树形两种注册风格,支持灵活的静态文件路由(如DirFS、RenderFS、MarkdownFS等)

  • 支持平滑关闭、平滑升级,提供fay工具进行新建项目、热编译、元编程

  • 采用最强大的 pongo2 作为HTML渲染引擎

  • 提供近似LRU的文件缓存功能,主要用途是静态文件缓存

  • 跨平台的彩色日志系统,且同时支持console和file两种输出形式(可以同时使用)

  • 提供Session管理功能

  • 支持Gzip全局配置

  • 提供XSRF跨站请求伪造安全过滤

  • 大多数功能尽量使用简洁的ini进行配置来避免不必要的重新编译,并且这些配置文件支持自动补填默认值

  • 提供 gormxormsqlxdirectSQLWebsocketinihttp client 等很多常用扩展包


faygo struct handler 多重用途合一


简单示例


package main

import (
// "mime/multipart"
"time"
"github.com/henrylee2cn/faygo"
)

type Index struct {
Id int `param:"<in:path> <required> <desc:ID> <range: 0:10>"`
Title string `param:"<in:query> <nonzero>"`
Paragraph []string `param:"<in:query> <name:p> <len: 1:10> <regexp: ^[\\w]*$>"`
Cookie string `param:"<in:cookie> <name:faygoID>"`
// Picture *multipart.FileHeader `param:"<in:formData> <name:pic> <maxmb:30>"`
}

func (i *Index) Serve(ctx *faygo.Context) error {
if ctx.CookieParam("faygoID") == "" {
ctx.SetCookie("faygoID", time.Now().String())
}
return ctx.JSON(200, i)
}

func main() {
app := faygo.New("myapp", "0.1")

// Register the route in a chain style
app.GET("/index/:id", new(Index))

// Register the route in a tree style
// app.Route(
// app.NewGET("/index/:id", new(Index)),
// )

// Start the service
faygo.Run()
}

/*
http GET:
http://localhost:8080/index/1% ... 3Dxyz
response:
{
"Id": 1,
"Title": "test",
"Paragraph": [
"abc",
"xyz"
],
"Cookie": "2016-11-13 01:14:40.9038005 +0800 CST"
}
*/

示例库


开源协议


Faygo 项目采用商业应用友好的 Apache2.0 协议发布。

json 解析器哪家强?

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

全文链接: https://github.com/json-iterator/go-benchmark查看全部

全文链接: https://github.com/json-iterator/go-benchmark


目的不是推销 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

  • 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


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


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


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

练手项目,实现一个web框架

开源程序golang 发表了文章 • 4 个评论 • 804 次浏览 • 2016-11-14 20:01 • 来自相关话题

github.com/zjj2wry/virgin,楼主也刚搞go半年多,写业务无聊了,所以想研究怎么实现一个简单的web框架,学习学习~~

github.com/zjj2wry/virgin,楼主也刚搞go半年多,写业务无聊了,所以想研究怎么实现一个简单的web框架,学习学习~~

golang和adb

开源程序themoonstone 发表了文章 • 1 个评论 • 496 次浏览 • 2016-11-13 16:48 • 来自相关话题

golang也能和安卓结合啦、分享一个基于golang和adb的安卓应用:

软件包adbbot提供Android应用程序自动化的基本功能。 这个包基于Golang标准包和Android Debug Bridge(adb)的执行文件。话不多说... 查看全部

golang也能和安卓结合啦、分享一个基于golang和adb的安卓应用:


软件包adbbot提供Android应用程序自动化的基本功能。 这个包基于Golang标准包和Android Debug Bridge(adb)的执行文件。话不多说、直接看看实例:


package main

import (
"flag"
"log"
"runtime"
"time"

"./adbbot"
)

var verbosity = flag.Int("v", 2, "verbosity")
var ADB = flag.String("adb", "adb", "adb exec path")
var DEV = flag.String("dev", "", "select device")

var APP = flag.String("app", "com.android.vending", "app package name")
var TMPL = flag.String("tmpl", "tmpl.png", "app package name")

func main() {

log.SetFlags(log.Ldate|log.Ltime)
flag.Parse()
runtime.GOMAXPROCS(runtime.NumCPU())

adbbot.Verbosity = *verbosity
bot := adbbot.NewBot(*DEV, *ADB)

Vlogln(2, "[adb]", "wait-for-device")
_, err := bot.Run("wait-for-device")
if err != nil {
Vlogln(1, "adb err", err)
}

// press Home key
bot.KeyHome()

// start APP
bot.StartApp(*APP)

// create matching region between Point <100,635> and <9999,9999>
//reg := bot.NewRectAbs(100, 635, 9999, 9999)

// or All the screen (slow)
reg := bot.NewRectAll()

// create matching template
tmpl, err := bot.NewTmpl(*TMPL, reg)
if err != nil {
Vlogln(2, "load template image err", err)
} else {

// try to find target
// 10 times with 1000ms delay between each search
x, y, val := bot.FindExistReg(tmpl, 10, 1000)
if x == -1 && y == -1 {
Vlogln(2, "template not found", x, y, val)
} else {
Vlogln(2, "template found at", x, y, val)
}

}

infoname := time.Now().Format("20060102_150405")
err = bot.SaveScreen(infoname + ".png")
if err != nil {
Vlogln(2, "SaveScreen err", err)
} else {
Vlogln(2, "SaveScreen as file ", infoname + ".png")
}

// force-stop APP
bot.KillApp(*APP)

}

func Vlogln(level int, v ...interface{}) {
if level <= *verbosity {
log.Println(v...)
}
}

代码量不是很大、也比较容易理解、有兴趣的同学可以深入研究一下


原文链接:https://github.com/cs8425/go-adbbot

自动生成代替interface的线程安全map

开源程序ggaaooppeenngg 发表了文章 • 0 个评论 • 600 次浏览 • 2016-11-09 16:55 • 来自相关话题

https://github.com/ggaaooppeenngg/safemap

项目当中经常要使用线程安全的map,但是实际... 查看全部

https://github.com/ggaaooppeenngg/safemap


项目当中经常要使用线程安全的map,但是实际编码的时候会因为失误引入一些非线程安全的代码。
把这些东西封装成一个包是一个比较好的方式。


这个工具的主要的特点是能够根据类型自动生成线程安全的map,做了一些简单的测试如果用interface类型转换的代价和用自动生成的固定类型的代价可能差距大概是20ns/op(40ns/op-20ns/op)的一个差距,当然这个差距并不是很致命的一个问题,至少用代码生成可以对性能有一个提升,可能引起的问题是项目中类似的map过多,生成的map的代码可能会很多,所以综合考量的话,在一个包里只有一两个map是要保证线程的安全的话,其实是很适合的,也比较方便管理,不管是在build的时候生成还是把生成的代码放入版本控制当中。当然也有很多自动生成的库可以用,但是为了减少依赖并没有使用。


使用方式可以结合go generate使用,比如在代码中嵌入。


//go:generate safemap -k string -v string -n namespace

在项目中会生成namespace_safemap.go文件,类型为type namespaceSafemap map[string]string,对应的GetSet方法是线程安全的。


目前正在做的是一个类似的实现思路的cache,https://github.com/ggaaooppeenngg/cachemap

golang 开源项目汇总(基于互联网架构分类)

文章分享hackstoic 发表了文章 • 2 个评论 • 1548 次浏览 • 2016-11-02 23:29 • 来自相关话题

随着go语言的流行, 我 们希望能在企业中推广go, 使用go,把一些优秀的go语言开源项目应用到公司的架构设计中和技术选型中。 但是苦于开源项目太多, 分类太杂, 始终没办法按照互联网架构设计中的一些组件来分类,和检索,不知道从何找起。 因此我根据go... 查看全部

随着go语言的流行, 我 们希望能在企业中推广go, 使用go,把一些优秀的go语言开源项目应用到公司的架构设计中和技术选型中。 但是苦于开源项目太多, 分类太杂, 始终没办法按照互联网架构设计中的一些组件来分类,和检索,不知道从何找起。
因此我根据go语言中文社区提供的资料,还有互联网企业架构设计中的常见组件分类, 共精心挑选了100多个开源项目(项目不限于在github开源的项目), 分成以下十几个大类。 这个项目可以理解为互联网IT人打造的中文版awesome-go。这个项目初衷是帮助到那些想学习和借鉴优秀golang开源项目, 和在互联网架构设计时期望快速寻找合适轮子的人。


目录



项目地址: https://github.com/hackstoic/golang-open-source-projects


欢迎吐槽,提建议。 如果觉得项目有价值, 记得点个赞支持一下下哦。 有新的想法或者不错的项目也欢迎提pull request。

Aeron消息传递客户端--Go版

技术讨论themoonstone 发表了文章 • 0 个评论 • 370 次浏览 • 2016-11-02 12:51 • 来自相关话题

一个使用go实现的高效可靠的UDP单播,UDP组播和IPC消息传输客户端

实现了其设计、架构、和协议功能、可以实现正常的消息订阅、发布

软件的安装和使用都比较方便、另外、此开源项目适合开发者学习、代码量不多、但对channel... 查看全部

一个使用go实现的高效可靠的UDP单播,UDP组播和IPC消息传输客户端


实现了其设计、架构、和协议功能、可以实现正常的消息订阅、发布


软件的安装和使用都比较方便、另外、此开源项目适合开发者学习、代码量不多、但对channel的运用很值得一看、感兴趣的同学可以深入了解一下


附:
原文链接:https://github.com/lirm/aeron-go/

SSH 服务器teleport

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

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

查看全部

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


https://github.com/gravitational/teleport

视频来啦 | 手把手教你玩转数人云容器管理面板Crane

Go开源项目数人云 发表了文章 • 0 个评论 • 354 次浏览 • 2016-10-19 10:40 • 来自相关话题

数人云容器管理面板Crane已经开源一个月多啦,经历了新版本v1.0.... 查看全部

数人云容器管理面板Crane已经开源一个月多啦,经历了新版本v1.0.5的发布,完善了许多功能和体验。今天小数给小伙伴们带来的是数人云总架构师为大家录制的Crane使用视频。从安装到使用,step by step,玩转容器管理面板就是这么简单!


小数友情提示,在电脑上超清模式下获得最好的视频体验:)


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


关于Crane


数人云容器管理面板Crane是国内首个基于最新 Docker SwarmKit 技术的集群管理工具。它根据 Docker 的原生编排功能,采用轻量化架构,帮助开发者快速搭建 DevOps 环境,体验 Docker 的各种最新功能。


欢迎扫码下方二维码来Crane交流群进行技术交流~(^-^)V


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

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

很高兴地宣布 Cloudinsight Agent 在 BSD 开源协议... 查看全部


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


为什么要用 Golang 重写和开源


Cloudinsight是一个可视化系统监控工具,能够对数据指标进行聚合、分组、过滤、 管理、计算;并提供团队协作功能,共同管理数据和报警事件。而这些的关键,正是 Cloudinsight Agent。


目前探针存在的问题:



  • 各个服务的数据抓取存在强依赖关系,任何一个服务阻塞都可能导致探针进程挂掉。

  • 缺乏对 log 和 json 的支持,用户需要通过 sdk 解析相关数据。

  • 针对 自定义Plugin 的支持不够灵活,用户需要熟悉 Python,并按照探针定义好的接口上传数据。

  • 探针使用 Omnibus 进行打包部署,虽然能解决用户安装上的一些问题,但对于新人来说,上手确实不是件容易的事,况且这个项目本身也有一些 bug,经历过的人自然懂。


用 Golang 重写:



  • 解决以上提到的种种问题。

  • 优化探针架构。

  • 提升探针性能。

  • 开源,接受社区的监督,让深度用户可以参与到探针的版本迭代中来。


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


项目计划


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


目前用 Golang 重写的 Cloudinsight Agent 仅在 Linux 上进行了测试,未来会逐渐将原有 Python 探针支持的平台和平台服务替换至 Golang 版本,包括但不限于:


加入项目



$ 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 中获取


$ cp cloudinsight-agent.conf.example cloudinsight-agent.conf 
$ vi cloudinsight-agent.conf
...
license_key = "*********************"

在前台中运行命令


$ ./bin/cloudinsight-agent

致谢


从 15 年 8 月至今,Cloudinsight Agent 经过了 20 余次的迭代,从第一天的的 20 个用户发展到现在 5 万多的探针数,感谢长久以来支持 Cloudinsight 和提供宝贵建议的用户和开发者们,也再次感谢以下影响了我们的优秀的开源项目:



在项目中有代码贡献的开发者,Cloudinsight 将送出一件限量 Tee 作为答谢。


Cloudinsight 官网:Cloudinsight.oneapm.com 欢迎访问了解



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

使用go脚本代替makefile

开源程序themoonstone 发表了文章 • 3 个评论 • 667 次浏览 • 2016-10-17 12:47 • 来自相关话题

使用go做出的脚本类程序、可以实现类似于linux下make功能:

特点:

  • 自动产生二进制版本
  • 所有平台可进行并行交叉编译

使用方式:将文件放在项目根目录下、用go r... 查看全部

使用go做出的脚本类程序、可以实现类似于linux下make功能:


特点:



  • 自动产生二进制版本

  • 所有平台可进行并行交叉编译


使用方式:将文件放在项目根目录下、用go run make.go进行编译


原文链接(附源码):https://github.com/nstratos/make.go#makego

Rikka - 极简多插件私人图床

开源程序7sDream 发表了文章 • 3 个评论 • 926 次浏览 • 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


预览页面:


viewpage


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


密码是:rikka


感兴趣的可以去试试,最大图片大小 5M。不过这只是 Demo 哟,不要真的用这个啦,如果想自己搭个自用的 Rikka 的话可以看:部署文档图文教程


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


API/CLI


Rikka 是有 RESTFul 的 API 的,文档在这里


然后我还写了个 CLI 工具方便命令行使用:文档|下载


放个使用截图吧:



然后是多张上传:



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


项目地址


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


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


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


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


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

wego,我们游戏使用的屏蔽字服务

Go开源项目goofansu 发表了文章 • 2 个评论 • 415 次浏览 • 2016-10-14 11:33 • 来自相关话题

前言

感谢@astaxie在v2ex发布了这个帖子 https://www.v2ex.com/t/312653, 之前我在V站也发过wego的帖子,... 查看全部

前言


感谢@astaxie在v2ex发布了这个帖子 https://www.v2ex.com/t/312653, 之前我在V站也发过wego的帖子,但是没什么响应,就希望找到专门讨论Go的社区,帮助自己提高写代码的水平。


wego介绍


项目页面:https://github.com/repong/wego


最近游戏要上线了,为了迎接版署审核,开发了一下屏蔽字的服务,我之前的主语言不是Go,最近写了一个月,感觉用Go写工具很方便,特别是编译和部署,一个binary搞定。


有兴趣的同学可以看看 README


使用方法


$ ./wego -port 1234
Loading dict...
载入sego词典 /var/folders/yy/ksdhbgf551bgg_5p0dkyd5kr0000gn/T/chinese_dictionary.txt844575244
载入sego词典 /var/folders/yy/ksdhbgf551bgg_5p0dkyd5kr0000gn/T/english_dictionary.txt811498491
sego词典载入完毕
Version : 1.0.0-5-g8c1e0b9
Git Hash : 8c1e0b943ea21f72e4eca8adc7a931ebb287da8f
Build Time : 2016-10-14T07:45:22Z
[GIN] 2016/10/14 - 15:45:46 | 200 | 148.311µs | 127.0.0.1 | POST /filter
[GIN] 2016/10/14 - 15:46:18 | 200 | 93.437µs | 127.0.0.1 | POST /validate

http请求


curl -XPOST http://localhost:1234/validate -d "message=测试封杀"
{"result":"false"}

curl -XPOST http://localhost:1234/filter -d "message=测试封杀"
{"result":"测试**"}