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

Apiware:一个轻松将net/http及fasthttp请求参数绑定到结构体的中间件

henrylee2cn 发表了文章 • 4 个评论 • 595 次浏览 • 2016-10-22 23:26 • 来自相关话题

Apiware 查看全部

Apiware GoDoc


Apiware binds the specified parameters of the Golang net/http and fasthttp requests to the structure and verifies the validity of the parameter values.


It is suggested that you can use the struct as the Handler of the web framework, and use the middleware to quickly bind the request parameters, saving a lot of parameter type conversion and validity verification. At the same time through the struct tag, create swagger json configuration file, easy to create api document services.


Apiware将Go语言net/httpfasthttp请求的指定参数绑定到结构体,并验证参数值的合法性。
建议您可以使用结构体作为web框架的Handler,并用该中间件快速绑定请求参数,节省了大量参数类型转换与有效性验证的工作。同时还可以通过该结构体标签,创建swagger的json配置文件,轻松创建api文档服务。


Demo 示例


package main

import (
"encoding/json"
"github.com/henrylee2cn/apiware"
// "mime/multipart"
"net/http"
"strings"
)

type TestApiware struct {
Id int `param:"in(path),required,desc(ID),range(1:2)"`
Num float32 `param:"in(query),name(n),range(0.1:10.19)"`
Title string `param:"in(query),nonzero"`
Paragraph []string `param:"in(query),name(p),len(1:10)" regexp:"(^[\\w]*$)"`
Cookie http.Cookie `param:"in(cookie),name(apiwareid)"`
CookieString string `param:"in(cookie),name(apiwareid)"`
// Picture multipart.FileHeader `param:"in(formData),name(pic),maxmb(30)"`
}

var myApiware = apiware.New(pathDecodeFunc, nil, nil)

var pattern = "/test/:id"

func pathDecodeFunc(urlPath, pattern string) apiware.KV {
idx := map[int]string{}
for k, v := range strings.Split(pattern, "/") {
if !strings.HasPrefix(v, ":") {
continue
}
idx[k] = v[1:]
}
pathParams := make(map[string]string, len(idx))
for k, v := range strings.Split(urlPath, "/") {
name, ok := idx[k]
if !ok {
continue
}
pathParams[name] = v
}
return apiware.Map(pathParams)
}

func testHandler(resp http.ResponseWriter, req *http.Request) {
// set cookies
http.SetCookie(resp, &http.Cookie{
Name: "apiwareid",
Value: "http_henrylee2cn",
})

// bind params
params := new(TestApiware)
err := myApiware.Bind(params, req, pattern)
b, _ := json.MarshalIndent(params, "", " ")
if err != nil {
resp.WriteHeader(http.StatusBadRequest)
resp.Write(append([]byte(err.Error()+"\n"), b...))
} else {
resp.WriteHeader(http.StatusOK)
resp.Write(b)
}
}

func main() {
// Check whether `testHandler` meet the requirements of apiware, and register it
err := myApiware.Register(new(TestApiware))
if err != nil {
panic(err)
}

// server
http.HandleFunc("/test/0", testHandler)
http.HandleFunc("/test/1", testHandler)
http.HandleFunc("/test/1.1", testHandler)
http.HandleFunc("/test/2", testHandler)
http.HandleFunc("/test/3", testHandler)
http.ListenAndServe(":8080", nil)
}

Struct&Tag 结构体及其标签























































































































tag key required value desc
param in only one path (position of param) if required is unsetted, auto set it. e.g. url: "http://www.abc.com/a/{path}"
param in only one query (position of param) e.g. url: "http://www.abc.com/a?b={query}"
param in only one formData (position of param) e.g. "request body: a=123&b={formData}"
param in only one body (position of param) request body can be any content
param in only one header (position of param) request header info
param in only one cookie (position of param) request cookie info, support: http.Cookie,fasthttp.Cookie,string,[]byte
param name no (e.g. "id") specify request param`s name
param required no required request param is required
param desc no (e.g. "id") request param description
param len no (e.g. 3:6, 3) length range of param's value
param range no (e.g. 0:10) numerical range of param's value
param nonzero no nonzero param`s value can not be zero
param maxmb no (e.g. 32) when request Content-Type is multipart/form-data, the max memory for body.(multi-param, whichever is greater)
regexp no (e.g. "^\w+$") param value can not be null
err no (e.g. "incorrect password format") customize the prompt for validation error

NOTES:



  • the binding object must be a struct pointer

  • the binding struct's field can not be a pointer

  • regexp or param tag is only usable when param:"type(xxx)" is exist

  • if the param tag is not exist, anonymous field will be parsed

  • when the param's position(in) is formData and the field's type is multipart.FileHeader, the param receives file uploaded

  • if param's position(in) is cookie, field's type must be http.Cookie

  • param tags in(formData) and in(body) can not exist at the same time

  • there should not be more than one in(body) param tag


Field Types 结构体字段类型














































































base slice special
string []string [][]byte
byte []byte [][]uint8
uint8 []uint8 multipart.FileHeader (only for formData param)
bool []bool http.Cookie (only for net/http's cookie param)
int []int fasthttp.Cookie (only for fasthttp's cookie param)
int8 []int8 struct (struct type only for body param or as an anonymous field to extend params)
int16 []int16
int32 []int32
int64 []int64
uint8 []uint8
uint16 []uint16
uint32 []uint32
uint64 []uint64
float32 []float32
float64 []float64

Source code


https://github.com/henrylee2cn/apiware

Gear: 一个 Go web framework 的设计思考和讨论

zensh 发表了文章 • 3 个评论 • 1128 次浏览 • 2016-10-22 16:57 • 来自相关话题

Gear 框架设计考量

Gear 是由 Teambition查看全部

Gear 框架设计考量


Gear 是由 Teambition 开发的一个轻量级的、专注于可组合扩展和高性能的 Go 语言 Web 服务框架。


Gear 框架在设计与实现的过程中充分参考了 Go 语言下多款知名 Web 框架,也参考了 Node.js 下的知名 Web 框架,汲取各方优秀因素,结合我们的开发实践,精心打磨而成。Gear 框架主要有如下特点:



  1. 基于中间件模式的业务处理控制流程。中间件模式使功能模块开发标准化、解耦、易于组合和集成到应用

  2. 框架级的错误和异常自动处理机制。开发者无需再担心业务逻辑中的每一个错误,只需在中间件返回错误,交给框架自动处理,也支持自定义处理逻辑

  3. 集成了便捷的读写 HTTP Request/Response 对象的方法,使得 Web 应用开发更加高效

  4. 高效而强大的路由处理器,能定义出各种路由规则满足业务逻辑需求

  5. 丰富的中间件生态,如 CORS, CSRF, Secure, Logging, Favicon, Session, Rate limiter, Tracing等

  6. 完整的 HTTP/2.0 支持

  7. 超轻量级,框架只实现核心的、共性的需求,可选需求均通过外部中间件或库来满足,确保应用实现的灵活自由,不被框架绑定束缚


目前 Gear 已经发布 v1.0.0


《Gear 框架设计考量》


2017-03-05 更新




2016-10-22


起因


因公司技术转型需要(见招聘贴 https://gocn.io/question/36 ),我最近一个月都在学习 Go 语言,研究 Go 语言下各种 Web 框架,主要有以下三个印象:



  1. Go 语言原生的 net/http 效率很低,第三方实现的 fasthttp 效率极高,是原生 10 倍以上,封神榜上排名第二。

  2. Go 的 Web 框架非常多,但知名度高的框架基本上是基于 fasthttp,除了 Asta谢 的 Beego

  3. Web 框架不但多,很多看起来也相似,但各自都有自己的功能插件和生态,API也非常繁杂。这大概是强类型引发的问题,很难像 Node.js 生态圈那样共用他人的开源模块。


我在 Node.js 生态圈中做了一个 Web 框架:https://github.com/toajs/toa ,我把它搬到了 Go 生态,这就是 Gear: https://github.com/teambition/gear


Gear 特性和目标



  1. 充分利用 Go 语言原生接口,一方面原生实现总是在不断进步优化;另一方面通用性更好,这点对于强类型来说很重要,尽量解耦类型依赖。

  2. 轻量级,框架本身只提供开发完整 Web 服务需要的核心功能,其它功能均通过中间件扩展。

  3. 充分发挥和扩展 Go 建议使用的 context.Context 能力。


关于性能


看过了太多的 benchmark,我以为 net/http 真弱鸡,但其实不然,在我的 14寸 rMBP 的测试结果如下:


Gear 48307 vs Iris 70310


Gear with "net/http": 48307


> wrk 'http://localhost:3333/?foo[bar]=baz' -d 10 -c 100 -t 4

Running 10s test @ http://localhost:3333/?foo[bar]=baz
4 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 2.30ms 2.53ms 59.54ms 94.28%
Req/Sec 12.15k 1.56k 20.98k 81.75%
484231 requests in 10.02s, 63.27MB read
Requests/sec: 48307.40
Transfer/sec: 6.31MB

Iris with "fasthttp": 70310


> wrk 'http://localhost:3333/?foo[bar]=baz' -d 10 -c 100 -t 4

Running 10s test @ http://localhost:3333/?foo[bar]=baz
4 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.37ms 648.31us 15.60ms 89.48%
Req/Sec 17.75k 2.32k 39.65k 84.83%
710317 requests in 10.10s, 102.29MB read
Requests/sec: 70310.19
Transfer/sec: 10.13MB

目前 Gear 还只刚成型,没有开始优化,另外据说 Go 1.8 的 net/http 有很大优化,两项相加赶上 Iris 完全可能。

go语言实战向导

simplejia 发表了文章 • 2 个评论 • 634 次浏览 • 2016-10-22 14:16 • 来自相关话题

导语: 用golang实现后台服务,你想要的都在这儿,有webserver最简框架(wsp),有交互式编程环境(查看全部


导语: 用golang实现后台服务,你想要的都在这儿,有webserver最简框架(wsp),有交互式编程环境(gop),有进程管理服务(cmonitor),有orm(orm),有本地kv缓存(lc),等等





使用go语言做后台服务已经有3年了,通过项目去检验一个又一个的想法,然后不断总结,优化,最终形成了自己的一整套体系,小到一个打印对象的方法,大到一个web后台项目最佳实践指导,这一点一滴都是在不断的实践中进化开来,以下内容是其中一小部分的汇报,各位看官如有兴致,请前往 https://github.com/simplejia 关注最新的代码变更,希望和golang爱好者们共同探讨,也感谢xie大提供这样一个优秀的社区场所。


wsp (go http webserver)


实现初衷



  • 简单可依赖,充分利用go已有的东西,不另外增加复杂、难以理解的东西,这样做的好处包括:更容易跟随go的升级而升级,降低使用者学习成本

  • yii提供的controller/action的路由方式比较常用,在wsp里实现一套

  • java annotation的功能挺方便,在wsp里,通过注释来实现过滤器方法的调用定义

  • 不能因为wsp的引入而降低原生go http webserver的性能


使用场景



  • 以http webserver方式对外提供服务

  • 后台接口服务


使用案例



  • 大型互联网社交业务


实现方式



  • 路由自动生成,按要求(见demo/controller/demo.go)提供controller/action的实现代码,wsp执行后会分析项目代码,自动生成路由表并记录在文件demo/WSP.go里,controller/action定义代码必须符合函数定义:func(http.ResponseWriter, *http.Request),并且是带receiver的method
    demo_set.go


package controller

import (
"net/http"

"github.com/simplejia/wsp/demo/service"
)

// @prefilter("Login", {"Method":{"type":"get"}})
// @postfilter("Boss")
func (demo *Demo) Set(w http.ResponseWriter, r *http.Request) {
key := r.FormValue("key")
value := r.FormValue("value")
demoService := service.NewDemo()
demoService.Set(key, value)

json.NewEncoder(w).Encode(map[string]interface{}{
"code": 0,
})
}

WSP.go


// generated by wsp, DO NOT EDIT.

package main

import "net/http"
import "time"
import "github.com/simplejia/wsp/demo/controller"
import "github.com/simplejia/wsp/demo/filter"

func init() {
http.HandleFunc("/Demo/Get", func(w http.ResponseWriter, r *http.Request) {
t := time.Now()
_ = t
var e interface{}
c := new(controller.Demo)
defer func() {
e = recover()
if ok := filter.Boss(w, r, map[string]interface{}{"__T__": t, "__C__": c, "__E__": e}); !ok {
return
}
}()
c.Get(w, r)
})

http.HandleFunc("/Demo/Set", func(w http.ResponseWriter, r *http.Request) {
t := time.Now()
_ = t
var e interface{}
c := new(controller.Demo)
defer func() {
e = recover()
if ok := filter.Boss(w, r, map[string]interface{}{"__T__": t, "__C__": c, "__E__": e}); !ok {
return
}
}()
if ok := filter.Login(w, r, map[string]interface{}{"__T__": t, "__C__": c, "__E__": e}); !ok {
return
}
if ok := filter.Method(w, r, map[string]interface{}{"type": "get", "__T__": t, "__C__": c, "__E__": e}); !ok {
return
}
c.Set(w, r)
})

}


  • wsp分析项目代码,寻找符合要求的注释(见demo/controller/demo_set.go),自动生成过滤器调用代码在文件demo/WSP.go里,filter注解分为前置过滤器(prefilter)和后置过滤器(postfilter),格式如:@prefilter({json body}),{json body}代表传入参数,符合json array定义格式(去掉前后的中括号),可以包含string值或者object值,filter函数定义满足:func (http.ResponseWriter, *http.Request, map[string]interface{}) bool,过滤器函数如下:
    method.go


package filter

import (
"net/http"
"strings"
)

func Method(w http.ResponseWriter, r *http.Request, p map[string]interface{}) bool {
method, ok := p["type"].(string)
if ok && strings.ToLower(r.Method) != strings.ToLower(method) {
http.Error(w, "405 Method Not Allowed", http.StatusMethodNotAllowed)
return false
}
return true
}


filter输入参数map[string]interface{},会自动设置"T",time.Time类型,值为执行起始时间,可用于耗时统计,"C",{Controller}类型,值为{Controller}实例,可通过接口方式存取相关数据(这种方式存取数据较context方式更简单实用),"E",值为recover()返回值,用于检测错误并处理(后置过滤器必须recover())




  • 项目main.go代码示例
    main.go


package main

import (
"log"

"github.com/simplejia/clog"
"github.com/simplejia/lc"

"net/http"

_ "github.com/simplejia/wsp/demo/clog"
_ "github.com/simplejia/wsp/demo/conf"
_ "github.com/simplejia/wsp/demo/mysql"
_ "github.com/simplejia/wsp/demo/redis"
)

func init() {
lc.Init(1e5)

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.NotFound(w, r)
})
}

func main() {
clog.Info("main()")

log.Panic(http.ListenAndServe(":8080", nil))
}

miscellaneous



  • 通过wrk压测工具在同样环境下(8核,8g),wsp空跑qps:9万,beego1.7.1空跑qps:5.5万

  • 更方便加入middleware(func(http.Handler) http.Handler),其实更推荐通过定义过滤器的方式支持类似功能

  • 更方便编写如下的测试用例:




demo



  • 提供一个简单易扩展的项目stub


实现初衷



  • 简单可依赖,充分利用go已有的东西,不另外增加复杂、难以理解的东西,这样做的好处包括:更容易跟随go的升级而升级,降低使用者学习成本

  • 提供常用组件的简单包装,如下:

    • config,提供项目主配置文件自动解析,见conf

    • redis,使用(github.com/garyburd/redigo),提供配置文件自动解析,见redis

    • mysql,使用(database/sql),提供配置文件自动解析,见mysql,同时为了方便对象映射,提供了最常用的orm组件供选择使用,见orm



项目编写指导意见



  • 目录结构:
    ├── WSP.go
    ├── clog
    │ └── clog.go
    ├── conf
    │ ├── conf.go
    │ └── conf.json
    ├── controller
    │ ├── base.go
    │ ├── demo.go
    │ ├── demo_get.go
    │ └── demo_set.go
    ├── demo
    ├── filter
    │ ├── boss.go
    │ ├── login.go
    │ └── method.go
    ├── main.go
    ├── model
    │ ├── demo.go
    │ ├── demo_get.go
    │ └── demo_set.go
    ├── mysql
    │ ├── demo_db.json
    │ └── mysql.go
    ├── redis
    │ ├── demo.json
    │ └── redis.go
    ├── service
    │ ├── demo.go
    │ ├── demo_get.go
    │ └── demo_set.go
    └── test
    ├── clog -> ../clog
    ├── conf -> ../conf
    ├── demo_get_test.go
    ├── demo_set_test.go
    ├── init_test.go
    ├── mysql -> ../mysql
    └── redis -> ../redis


    • controller目录:负责request参数解析,service调用

    • service目录:负责逻辑处理,model调用

    • model目录:负责数据处理


  • 接口实现上,建议一个接口对应一个文件,如controller/demo_get.go, service/demo_get.go, model/demo_get.go

Go 1.7.2 版本发布,修复编译器和运行时

够浪 回复了问题 • 6 人关注 • 6 个回复 • 1187 次浏览 • 2016-10-19 21:06 • 来自相关话题

Go 1.7.2 版本被取消了

kevin 回复了问题 • 9 人关注 • 7 个回复 • 1144 次浏览 • 2016-10-19 16:20 • 来自相关话题

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

Cloudinsight 发表了文章 • 5 个评论 • 1002 次浏览 • 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

go-rm: 使用 Golang 来写 Redis 模块的开源库

回复

wener 发起了问题 • 3 人关注 • 0 个回复 • 819 次浏览 • 2016-10-17 12:09 • 来自相关话题

Crane,支持最新swarmkit 特性的容器管理面板,完全开源

回复

xds2000 发起了问题 • 1 人关注 • 0 个回复 • 738 次浏览 • 2016-10-17 07:07 • 来自相关话题

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 么?

Excelize - Golang 操作 Office Excel 文档类库

astaxie 发表了文章 • 5 个评论 • 1110 次浏览 • 2016-10-11 16:13 • 来自相关话题


Excelize 是 Golang 编写的一个用来操作 Office Excel 文档类库,基于微软的 Office Open XML 标准。可以使用它来读取、写入 XLSX 文件。相比较其他的开源类库,Excelize 支持写入带有图表的文档,并且在保存后不会丢失图表样式。


安装


go get github.com/Luxurioust/excelize

创建 XLSX


package main

import (
"fmt"
"github.com/Luxurioust/excelize"
)

func main() {
xlsx, err := excelize.CreateFile()
if err != nil {
fmt.Println(err)
}
xlsx.NewSheet(2, "Sheet2")
xlsx.NewSheet(3, "Sheet3")
xlsx.SetCellInt("Sheet2", "A23", 10)
xlsx.SetCellStr("Sheet3", "B20", "Hello")
err = xlsx.WriteTo("/home/Workbook.xlsx")
if err != nil {
fmt.Println(err)
}
}

修改已有文档


package main

import (
"fmt"
"github.com/Luxurioust/excelize"
)

func main() {
xlsx, err := excelize.OpenFile("/home/Workbook.xlsx")
if err != nil {
fmt.Println(err)
}
xlsx.SetCellInt("Sheet2", "B2", 100)
xlsx.SetCellStr("Sheet2", "C11", "Hello")
xlsx.NewSheet(3, "TestSheet")
xlsx.SetCellInt("Sheet3", "A23", 10)
xlsx.SetCellStr("Sheet3", "b230", "World")
xlsx.SetActiveSheet(2)
err = xlsx.Save()
if err != nil {
fmt.Println(err)
}
}

读取 XLSX 单元格


package main

import (
"fmt"
"github.com/Luxurioust/excelize"
)

func main() {
xlsx, err := excelize.OpenFile("/home/Workbook.xlsx")
if err != nil {
fmt.Println(err)
}
cell := xlsx.GetCellValue("Sheet2", "D11")
fmt.Println(cell)
}

aurora - 基于 Web UI 的 Beanstalk 消息队列服务器管理工具

astaxie 发表了文章 • 1 个评论 • 498 次浏览 • 2016-10-11 16:11 • 来自相关话题

GitHub: github.com/Luxurioust... 查看全部


GitHub: github.com/Luxurioust/aurora


aurora 是一个 Golang 编写的基于 Web 的 Beanstalk 消息队列服务器管理工具,单文件无需依赖其他组件,支持管理本地和远程多个队列服务器。


特点



  • 跨平台支持 macOS/Linux/Windows 32/64-bit

  • 单文件简单易部署

  • 不依赖其他组件

  • 支持读取配置文件方式启动 + 登陆用户认证

  • 定时刷新 Beanstalk 队列服务器状态

  • 对每个 Tube 的 ready/delayed/buried 状态进行管理

  • 支持批量清空 Tube 中的 Job

  • 支持 Job 文本高亮显示

  • 支持 Job 模糊搜索

  • 自定义队列服务器状态监控项

一个支持负载均衡,健康检查的 TcpProxy

astaxie 发表了文章 • 1 个评论 • 656 次浏览 • 2016-10-11 07:31 • 来自相关话题

goTcpProxy


GitHub:https://github.com/zheng-ji/goTcpProxy


Go Report Card


一个支持负载均衡,健康检查的 TcpProxy


smailltcp


Description


English



  • A tcp proxy service

  • Supprot multi backend severs

  • Consistent Hash Load Balance

  • Auto detect down server, and remove it.

  • Monitor backend health status


中文



  • TCP 代理服务

  • 后端支持多个服务器

  • 支持一致性哈希的负载均衡

  • 自动检测失败的后端服务器,并移除

  • 后端服务的健康检查接口


How To Compile


cd $GOPATH;
git clone http://github.com/zheng-ji/goTcpProxy;
make

How To Use


配置文件详解


bind: 0.0.0.0:9999      // 代理服务监听端口
wait_queue_len: 100 // 等待队列长度
max_conn: 10000 // 并发最大连接
timeout: 5 // 请求超时时间
failover: 3 // 后端服务允许失败次数
stats: 0.0.0.0:19999 // 健康检查接口
backend: // 后端服务列表
- 127.0.0.1:80
- 127.0.0.1:81
log:
level: "info"
path: "/Users/zj/proxy.log"

// 运行服务
./goTcpProxy -c=etc/conf.yaml

gotcp


License


Copyright (c) 2015 released under a MIT style license.

beego 1.7.1 新版本发布

astaxie 发表了文章 • 1 个评论 • 643 次浏览 • 2016-10-10 16:47 • 来自相关话题

beego 1.7.1

新增功能:

  1. access log增加IP #2156
  2. ... 查看全部

beego 1.7.1


新增功能:



  1. access log增加IP #2156

  2. orm增加新接口ReadForUpdate #2158

  3. 参数bind支持数组form,columns[0].Data=foo&columns[1].Data=bar&columns[2].Data=baz #2111

  4. 自定义recover函数,增加配置beego.BConfig.RecoverFunc,默认和原来保持一致,但是用户可以自己定义 #2004

  5. memcache cache 同时支持byte和string的存储,这样就可以通过gob保存struct #1521

  6. ORM delete支持按照指定条件删除 (#1802)[https://github.com/astaxie/beego/issues/1802]

  7. swagger的支持输出yaml (#2162)[https://github.com/astaxie/beego/pull/2162]

  8. 增加RunController 和 RunMethod,让用户自定义路由规则 (#2017)[https://github.com/astaxie/beego/issues/2017]


修复bug:



  1. 静态目录如果已经存在index.html,当访问目录的时候不会自动添加/, 例如访问/swagger不会跳转到/swagger/,这样会导致相对的css和js访问不存在 #2142

  2. beego admin ui里面访问时间排序没有安装us,ms排序,而是安装字符排序 #1877

  3. captcha生产图片的时候,自定义height和width crash #2161

  4. DELETE请求下开启了CopyBody情况下,如果body为空panic #1656


beego 1.7.0


新增改进功能:



  1. Filter访问速度提升7.5倍以上 #1799

  2. Gzip压缩的时候支持不同的level #1808

  3. ORM PK支持负数 #1810

  4. ORM 支持自定义自增ID的值 #1826

  5. Context 下载文件函数改进:下载文件之前先检查是否存在 #1827

  6. log增加 GetLogger函数,可以增加相应的前缀 #1832