每日新闻

每日新闻

GoCN每日新闻资讯
有问必答

有问必答

Go相关的问题,技术相关的问题
文章分享

文章分享

技术文章分享,让知识传播给更多的人
招聘应聘

招聘应聘

为Gopher服务的招聘应聘平台

gout v0.0.7版本发布,给大家拜个早年

guonaihong 发表了文章 • 0 个评论 • 325 次浏览 • 2020-01-17 13:16 • 来自相关话题

changlog:issue:  ...查看全部

changlog:

issue: #151 bench模式支持回调函数 (pr #162)
issue: #159 提炼dataflow,filter,export等子包(pr #160 )
issue: #132 context对象包含编码器和解码器(pr #161 )
issue: #155 不设置解码器情况,优化执行效率(pr #163)


地址

gout(https://github.com/guonaihong/gout)

    golang写的即时通讯服务器gim,支持TCP,WebSocket

    Alber 发表了文章 • 0 个评论 • 269 次浏览 • 2020-01-14 09:45 • 来自相关话题

    https://github.com/alberliu/gim ...查看全部

    gin自动路由中间件

    chenqinghe 发表了文章 • 0 个评论 • 236 次浏览 • 2020-01-11 17:28 • 来自相关话题

    github地址: https://git ...查看全部

    github地址: https://github.com/chenqinghe/gin-autorouter


    gin-autorouter

    gin-autorouter is a middleware which could automatic mapping request url to a handler method.

    Api

    the project have two main functions:

    • AutoRouter
    • RouterAny

    Basic Uage

    package main


    type T struct{

    }

    func (t *T)Greet(c *gin.Context) {
    c.Writer.WriteString("hello from *T.Greet")
    }

    func (t *T)Hello(c *gin.Context) {
    c.Writer.WriteString("hello from *T.Hello")
    }


    func main(){
    r:=gin.Default()
    r.Any("/*path",router.AutoRouter(&T{}))
    r.Run(":8080")
    }

    you only need to register a router with pattern "/*path"

    view http://localhost:8080/greet, you could see "hello from *T.Greet"

    view http://localhost:8080/hello, you will see "hello from *T.Hello"

    RESTful Api

    with AutoRouter, you can create restful api very easily.

    package main

    func (h *Article) Get(c *gin.Context) {
    articleId := c.Param("id")
    // search artile stuff.....
    article := model.SearchArticle(articleId)
    c.JSONP(http.StatusOK,article)
    }

    func (h *Article)Delete(c *gin.Context) {
    articleId := c.Param("id")
    model.DeleteArticle(articleId)
    c.JSONP(http.StatusOK,"ok")
    }

    func main(){
    r := gin.Default()
    r.Any("/article/:id",router.AutoRouter(&Article{}))
    }

    // * GET /article/123 => *Article.Get
    // * Delete /article/123 => *Article.Delete

    also, you can use RouterAny, things will be extremely easy!!

    package main

    func (h *Article)Get(c *gin.Context, id int) {
    fmt.Println("article:",id) // output: article: 123
    article := model.SearchArticle(id)
    c.JSONP(http.StatusOK,article)
    }

    func (h *Article)Delete(c *gin.Context, id int) {
    fmt.Println("article:",id) // output: article: 123
    model.DeleteArticle(id)
    c.JSONP(http.StatusOK,"ok")
    }


    func main(){
    r:= gin.Default()
    r.Any("/*path",router.RouterAny(&Article{}))
    }

    // GET /article/123 => *Article.Get(c, 123)
    // DELETE /article/123 => *Article.Delete(c, 123)

    Mapping Rules

    the mapping is basic on *gin.Context.Param("path"). path will be exploded to several segments by '/'

    • if path is empty, method is request http method
    • the first segment is method
    • others will be method arguments
    • segments number MUST be equal or greater than method arguments number
    • if method is variadic, the segments mapping to last argument could be zero
    • otherwise, "404 not found" will be returned

    some examples:

    pathmethodarguments(exclude *gin.Context)
    /REQUEST METHODnil
    /foofoonil
    /foo/barfoo[bar]
    /foo/bar/123foo[bar,123]

    License

    the project is under MIT license protected which you can find in LICENSE file.

    BookStack v2.4 发布,类似 GitBook 的文档管理系统

    回复

    皇虫 发起了问题 • 1 人关注 • 0 个回复 • 196 次浏览 • 2020-01-08 12:11 • 来自相关话题

    Github Statistics 一个基于 React 的 GitHub 数据统计工具

    NebulaGraph 发表了文章 • 0 个评论 • 309 次浏览 • 2019-12-25 10:37 • 来自相关话题

    GitHub

    V 站曾经有个热帖说为何我的开源项目只有 Fork 没有 Star,楼下有个热评说开源项目关注的不应该是 Commit 数据吗?先不论 Star、Fork 和 Commit,issue 、pr 也应是一个开源项目社区关注的数据。

    下面我们来看看市面上有哪些 GitHub 数据统计工具

    GitHub Star 数据统计工具

    Chrome 插件—— Star History

    image顾名思义你可以通过 Star History这个项目看到一个项目的趋势增长,安装上此插件之后你可以直接在某个开源项目主页,如下图所示,一键操作看 star 增长趋势无烦恼。

    q

    当然它也有在线版:https://star-history.t9t.io/ 可以戳这个链接体验。

    在线版 —— StarTrack-js

    StarTrack和 Star History 类似也是一个 Star 统计工具,操作稍繁琐,需要填入该项目所有者的用户名及项目名,下图以 VEsoft-inc 的 Nebula 项目为例:

    image

    除了简单的 Star 趋势图,StarTrack 还为你统计了这个项目的 Star 总数、开源时间及每日获得 Star 数等维度数据。

    image

    GitHub 数据统计工具—— Github Statistics

    不只是 Fork 数和 Commit 数,统计 issue 数的工具在 Google 搜索也是查无此项(如果你有知道此类工具欢迎在评论文留言),GitHub Statistics 是据我所知唯一的可以统计某个开源项目的指标数,包括 GitHub Star、Fork、Commit、issue 和 pr 等数据的工具,当然 GitHub Statistics 也支持你查看项目的 Release 信息,在线体验:https://vesoft-inc.github.io/github-statistics/

    Github Statistics 项目采用 React 框架,在图表显示上使用了 highChart,对二者有兴趣的话可以查看源码~~

    除了常规的 GitHub 数据统计之外,你可以用 GitHub Statistics 进行多项目 GitHub 数据比较,以 React、Vue、Angular 为例,以下为三个项目的 GitHub 数据分析图为例子。

    多项目 GitHub 数据比较

    在 GitHub Statistics 输入某个项目名,并选中点击 update 即可查看该项目的相关数据,如果你需要比较多个项目的数据,记得勾选多个项目。

    image

    项目信息总览

    Repository 可以查看到 GitHub 项目的 创建时间 (可以理解为立项时间,并非开源时间)、 项目年龄 (立项到现在的时间)、 编程语言 、 最后一次更新时间 、 Watch 数,数据显示 React 和 Vue 的关注者是一个量级的。

    image

    Star 趋势图

    Star 可以看到这个项目的 Star 数增长趋势 、 日增星 和 单日最高星量 。可以从总 Star 数看出,Vue 和 React  不分伯仲,Vue 异军突起,在 2017 年 6 月 17 日,Vue 项目的 star 超过了 Angular,在 2018 年 6 月 12 日弯道超车甩掉了 React。

    image

    除了总 star,GitHub Statistics 也可以看到每日增长,看看被淹没的 Angular 曾经也是 2k 起跑线的项目…再看看 Vue 和 React 在 2018 年 6 月 15 日获得 star,这一天的 star 可吊打 90% 的开源项目了(柠檬Nebula 敬上),小八卦了下这是那天的 Hacker News 热帖《Has Vue passed React yet? 》:https://news.ycombinator.com/item?id=17316267

    image

    Fork 趋势图

    和 Star 趋势图类似,总趋势图可以看到这三个项目的 Fork 总数、每日平均数,看每日平均 Vue、React、Angular 相差不大,但是总量上来说,Angular 还是领先两位后起之秀的。

    image

    从每日 Fork 增量图来看,Angular 的 Fork 数比 Vue 和 React 多全靠先发优势,React 和 Vue 诞生之后,Angular 的增长大不如前,而 React 的 Fork 和 Vue 的 Fork 比较,二者是不相上下。

    image

    Commit 趋势图

    image

    虽然 star 上 Vue 和 React 是一个量级,但是在 Commit 或者说项目活跃度上,React 领跑这三个项目,当中的缘由就不揣测了。

    和总的趋势图类似,每日新增 Commit 趋势也是 React 一枝独秀。

    image

    总结 GitHub Statistics

    GitHub Statistics 是一个查看 GitHub 相关指标的工具,如果你在为技术选型苦恼,而你看中的技术栈刚好是开源项目,不妨用它试一试,可以看到开源项目的开发进度、社区活跃度,再也不用担心遇到“闭源”的开源项目了。GitHub Statistics GitHub 地址:https://github.com/vesoft-inc/github-statistics,在线访问:https://vesoft-inc.github.io/github-statistics/

    Christmas 手机端

    瑞士军刀 gout v0.0.5版本发布

    guonaihong 发表了文章 • 0 个评论 • 432 次浏览 • 2019-12-23 13:04 • 来自相关话题

    changelog#114 新增Version常量 ...查看全部

    changelog

    #114 新增Version常量
    #123 新增feature介绍
    #131 引入DataFlow概念(数据流)
    #94 提供重试功能
    #130 Add Custom form defined(Thank you for @aimerforreimu )
    #129 goline检查
    #106 构架图
    #141 测试覆盖度94%

    项目地址

    gout地址

    https://github.com/guonaihong/gout

    构架图


    golang写的即时通讯服务器gim

    Alber 发表了文章 • 0 个评论 • 426 次浏览 • 2019-12-14 19:56 • 来自相关话题

    简要介绍gim是一个即时通讯服务器,代码全部使用golang完成。主要功能1.离线消息同步2.多业务接入3.单用户多设备同时在线4.单聊,群聊,以及超大群聊天场景 5.支持服务水平扩展 ...查看全部

    简要介绍

    gim是一个即时通讯服务器,代码全部使用golang完成。主要功能
    1.离线消息同步
    2.多业务接入
    3.单用户多设备同时在线
    4.单聊,群聊,以及超大群聊天场景 5.支持服务水平扩展

    使用技术:

    数据库:Mysql+Redis
    组件:grpc+jsoniter+zap

    安装部署

    1.首先安装MySQL,Redis
    2.创建数据库gim,执行sql/create_table.sql,完成初始化表的创建 3.下载代码到你本地 4.修改conf/conf.go配置文件,使之和你本地配置一致
    5.分别切换到app的connect和logic目录下,执行go run main.go,启动连接层服务器和逻辑层服务器
    6.切换到test目录下,启动测试脚本
    7.使用public/util/aes.go的GetToken获取token
    8.使用rpc接口发送消息

    业务服务器如何接入

    1.首先生成私钥和公钥 2.在app表里根据你的私钥添加一条app记录

    3.将app_id和公钥保存到业务服务器

    4.将用户通过LogicClientExtServer.AddUser接口添加到IM服务器 

    5.通过LogicClientExtServer.RegisterDevice接口初始化设备,获取设备id(device_id)

    6.将app_id,user_id,device_id用公钥通过公钥加密,生成token,相应库的代码在public/util/aes.go

    7.接下来使用这个token,app就可以和IM服务器交互

    项目目录介绍

    ├─ app # 服务启动入口
    │   ├── conn # 连接层启动入口
    │   └── logic # 逻辑层启动入口
    ├─ conf # 配置
    ├─ conn # 连接层服务代码
    ├─ ligic # 逻辑层服务代码
    ├─ public # 连接层和逻辑层公共代码
    ├─ sql # 数据库建表语句
    ├─ test # 测试脚本
    ├─ docs # 项目文档

    TCP拆包粘包

    遵循TLV的协议格式,一个消息包分为三部分,消息类型(两个字节),消息包内容长度(两个字节),消息内容。
    这里为了减少内存分配,拆出来的包的内存复用读缓存区内存。
    拆包流程:
    1.首先从系统缓存区读取字节流到buffer
    2.根据包头的length字段,检查报的value字段的长度是否大于等于length
    3.如果大于,返回一个完整包(此包内存复用),重复步骤2
    4.如果小于,将buffer的有效字节前移,重复步骤1

    服务简介

    1.connect
    维持与客户端的TCP长连接,心跳,以及TCP拆包粘包,消息编解码 2.logic
    消息转发逻辑,设备信息,用户信息,群组信息的操作

    离线消息同步

    用户的消息维护一个自增的序列号,当客户端TCP连接断开重新建立连接时,首先要做TCP长连接的登录,然后用客户端本地已经同步的最大的序列号做消息同步,这样就可以保证离线消息的不丢失。

    单用户多设备支持

    当用户发送消息时,除了将消息发送目的用户
    在DB中,每个用户只维护一个自己的消息列表,但是用户的每个设备各自维护自己的同步序列号,设备使用自己的同步序列号在消息列表中做消息同步

    消息转发逻辑

    单聊和普通群组采用写扩散,超级大群使用读扩散。
    读扩散和写扩散的选型。
    首先解释一下,什么是读扩散,什么是写扩散

    读扩散

    简介:群组成员发送消息时,也是先建立一个会话,都将这个消息写入这个会话中,同步离线消息时,需要同步这个会话的未同步消息
    优点:每个消息只需要写入数据库一次就行,减少数据库访问次数,节省数据库空间
    缺点:一个用户有n个群组,客户端每次同步消息时,要上传n个序列号,服务器要对这n个群组分别做消息同步

    写扩散

    简介:就是每个用户维持一个消息列表,当有其他用户给这个用户发送消息时,给这个用户的消息列表插入一条消息即可
    优点:每个用户只需要维护一个序列号和消息列表
    缺点:一个群组有多少人,就要插入多少条消息,当群组成员很多时,DB的压力会增大

    群组简介

    普通群组:

    1.支持离线消息同步
    2.群组成员越多,DB压力越大

    超大群组:

    1.DB压力不会随着群组成员的人数的增加而增加
    2.不支持离线消息同步

    核心流程时序图

    长连接登录

    eaf3a08af9c64bbd.png

    离线消息同步

    17ae1726b66ee7da.png

    心跳

    6ea6acf2cd4b956e.png

    消息单发

    e000fda2f18e86f3.png

    消息群发

    cee48420191412c3.png

    github

    https://github.com/alberliu/gim

    百度GOPROXY代理服务

    dolfly 发表了文章 • 2 个评论 • 438 次浏览 • 2019-12-10 13:54 • 来自相关话题

    百度GOPROXY代理服务https://goproxy.baidu.com/ ...查看全部

    百度GOPROXY代理服务


    https://goproxy.baidu.com/

    gout v0.0.4发布,新增接口benchmark功能

    guonaihong 发表了文章 • 0 个评论 • 336 次浏览 • 2019-12-09 09:35 • 来自相关话题

    gout简介gout 是go开发的流式http client。v0.0.4版本主要功能是benchmark功能拥有此版本gout,助你很方便开发出apache ab此类轮子。benchmark功能性能如何 ...查看全部

    gout简介

    gout 是go开发的流式http client。v0.0.4版本主要功能是benchmark功能

    拥有此版本gout,助你很方便开发出apache ab此类轮子。

    benchmark功能性能如何


    Changlog:

    • #95 优化文档
    • #97 修改New接口
    • #98 优化文档2
    • #103 quick start增加综合示例
    • #107 BindHeader函数tag设置没生效(fix)
    • #109 修改debug模式默认配色方案
    • #92 benckmark模式
    • #105 优化超时API
    • #102 提升测试覆盖度

    项目地址

    github地址https://github.com/guonaihong/gout


    httplib.Post请求触发

    spf 回复了问题 • 2 人关注 • 2 个回复 • 161 次浏览 • 2019-12-05 17:01 • 来自相关话题

    基于Go语言的论坛系统 bbs-go 3.0.4 发布,欢迎各位大神围观指导~

    fuckshit 发表了文章 • 0 个评论 • 363 次浏览 • 2019-11-18 12:56 • 来自相关话题

    更新内容优化文章列表加载性能,将加载方式修改为上拉加载更多,这种方式在加载列表时不需要count列表总数量,当数据量大时count很耗时。修改网站样式和配色 ...查看全部

    更新内容

    • 优化文章列表加载性能,将加载方式修改为上拉加载更多,这种方式在加载列表时不需要count列表总数量,当数据量大时count很耗时。
    • 修改网站样式和配色,新的样式和配色更加好看。
    • 重构前端页面组件,将公用部分抽象成可复用组件。
    • 重构代码完全遵循eslint配置的规则,让eslint没有警告⚠️。
    • 新增配置项站外链接跳转,开启后站外链接需要用户确认后才能进行跳转。

    文档地址

    公众号

    欢迎关注公众号码农俱乐部获取更多干货资源。

    码农俱乐部

    交流QQ群

    bbs-go-qq.jpg

    功能预览

    前台页面.png
    后台页面.png

    课程

    bbs-go搭建课程上线啦,快来跟着我一步步搭建属于你的bbs吧。该课程会带领大家一步步的了解并熟悉Go语言开发,如果你是一个Go语言初学者,或者正准备学习Go语言,那么这个课程非常适合你。如果你熟练掌握了本课程中的知识点,相信你就已经入门Go语言开发,并能胜任日常的开发工作了。

    Go 是非常年轻的一门语言,它的主要目标是兼具Python等动态语言的开发速度和 C/C++ 等编译型语言的性能与安全性。Go 语言发布以来更是受到中国开发者的青睐,头条、七牛、360、腾讯、阿里等大厂的重要服务都开始使用Go语言构建,国内的Go语言研发岗位的薪水也是很可观的。

    gochat - 纯go实现的im即时通讯系统(支持水平扩展)

    gochat 发表了文章 • 0 个评论 • 606 次浏览 • 2019-11-04 15:56 • 来自相关话题

    项目推荐- 项目地址:https://github.com/LockG ...查看全部

    项目推荐
    - 项目地址:
    https://github.com/LockGit/gochat

    - 类别:Go

    - 项目描述:

    gochat为纯go实现的即时通讯系统,支持私信消息与房间广播消息,各层之间通过rpc通讯,支持水平扩展。
    使用redis作为消息存储与投递的载体,相对kafka操作起来更加方便快捷,所以十分轻量。
    各层之间基于etcd服务发现,在扩容部署时将会方便很多。
    由于go的交叉编译特性,编译后可以快速在各个平台上运行,gochat架构及目录结构清晰,
    并且本项目还贴心的提供了docker一键构建所有环境依赖,安装起来十分便捷。

    - 推荐理由:
    轻量快捷不臃肿,水平可扩展,docker快速构建所有环境,迅速体验im即时通讯,
    各层架构清晰,文档说明详细。

    系统架构:



    服务发现:


    消息投递


    聊天室预览:

    gout 新版本发布,golang实现的http 流式客户端

    guonaihong 发表了文章 • 0 个评论 • 394 次浏览 • 2019-10-28 09:09 • 来自相关话题

    地址 ...查看全部

    地址

        gout github地址

    简介

        gout是go写的流式客户端,为提高编码效率而开发。特性丰富,使用方便。

    技能树




    yiigo 4.x 版本发布

    IIInsomnia 发表了文章 • 0 个评论 • 431 次浏览 • 2019-10-25 11:50 • 来自相关话题

    # yiigo[![golang](https://img.shields.io/badge/Language-Go-green.svg?style=flat)](https://golang.org)[![GitHub rele ...查看全部

    # yiigo

    [![golang](https://img.shields.io/badge/Language-Go-green.svg?style=flat)](https://golang.org)
    [![GitHub release](https://img.shields.io/github/release/IIInsomnia/yiigo.svg)](https://github.com/iiinsomnia/yiigo/releases/latest)
    [![GoDoc](https://godoc.org/github.com/iiinsomnia/yiigo?status.svg)](https://godoc.org/github.com/iiinsomnia/yiigo)
    [![MIT license](http://img.shields.io/badge/license-MIT-brightgreen.svg)](http://opensource.org/licenses/MIT)

    The best and the most wanted package for junior gophers, probably.

    ## Features

    - Support [MySQL](https://github.com/go-sql-driver/mysql)
    - Support [PostgreSQL](https://github.com/lib/pq)
    - Support [MongoDB](https://github.com/mongodb/mongo-go-driver)
    - Support [Redis](https://github.com/gomodule/redigo)
    - Support [Zipkin](https://github.com/openzipkin/zipkin-go)
    - Support [Apollo](https://github.com/philchia/agollo)
    - Use [gomail](https://github.com/go-gomail/gomail) for email sending
    - Use [toml](https://github.com/pelletier/go-toml) for configuration
    - Use [sqlx](https://github.com/jmoiron/sqlx) for SQL executing
    - Use [gorm](https://gorm.io/) for ORM operating
    - Use [zap](https://github.com/uber-go/zap) for logging

    ## Requirements

    `Go1.11+`

    ## Installation

    ```sh
    go get github.com/iiinsomnia/yiigo/v4
    ```

    ## Usage

    #### Config

    - `yiigo.toml`

    ```toml
    [app]
    env = "dev" # dev | beta | prod
    debug = true

    [apollo]
    app_id = "test"
    cluster = "default"
    address = "127.0.0.1:8080"
    cache_dir = "./"

    [apollo.namespace]
    # 自定义配置对应的namespace

    [db]

    [db.default]
    driver = "mysql"
    dsn = "username:password@tcp(localhost:3306)/dbname?timeout=10s&charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=True&loc=Local"
    # dsn = "host=localhost port=5432 user=root password=secret dbname=test connect_timeout=10 sslmode=disable" # pgsql
    max_open_conns = 20
    max_idle_conns = 10
    conn_max_lifetime = 60 # 秒

    [mongo]

    [mongo.default]
    dsn = "mongodb://username:password@localhost:27017"
    connect_timeout = 10 # 秒
    pool_size = 10
    max_conn_idle_time = 60 # 秒
    mode = "primary" # primary | primary_preferred | secondary | secondary_preferred | nearest

    [redis]

    [redis.default]
    address = "127.0.0.1:6379"
    password = ""
    database = 0
    connect_timeout = 10 # 秒
    read_timeout = 10 # 秒
    write_timeout = 10 # 秒
    pool_size = 10
    pool_limit = 20
    idle_timeout = 60 # 秒
    wait_timeout = 10 # 秒
    prefill_parallelism = 0

    [log]

    [log.default]
    path = "app.log"
    max_size = 500
    max_age = 0
    max_backups = 0
    compress = true

    [email]
    host = "smtp.exmail.qq.com"
    port = 25
    username = ""
    password = ""
    ```

    - config usage

    ```go
    yiigo.Env("app.env").String()
    yiigo.Env("app.debug").Bool()
    ```

    #### Apollo

    ```go
    type QiniuConfig struct {
    *yiigo.DefaultApolloConfig
    BucketName string `toml:"bucket_name"`
    }

    var qiniu = &QiniuConfig{DefaultApolloConfig: yiigo.NewDefaultConfig("qiniu", "qiniu")}

    if err := yiigo.StartApollo(qiniu); err != nil {
    log.Fatal(err)
    }
    ```

    #### MySQL

    ```go
    // default db
    yiigo.DB().Get(&User{}, "SELECT * FROM `user` WHERE `id` = ?", 1)
    yiigo.Orm().First(&User{}, 1)

    // other db
    yiigo.DB("foo").Get(&User{}, "SELECT * FROM `user` WHERE `id` = ?", 1)
    yiigo.Orm("foo").First(&User{}, 1)
    ```

    #### MongoDB

    ```go
    // default mongodb
    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)

    defer cancel()

    yiigo.Mongo().Database("test").Collection("numbers").InsertOne(ctx, bson.M{"name": "pi", "value": 3.14159})

    // other mongodb
    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)

    defer cancel()

    yiigo.Mongo("foo").Database("test").Collection("numbers").InsertOne(ctx, bson.M{"name": "pi", "value": 3.14159})
    ```

    #### Redis

    ```go
    // default redis
    conn, err := yiigo.Redis().Get()

    if err != nil {
    log.Fatal(err)
    }

    defer yiigo.Redis().Put(conn)

    conn.Do("SET", "test_key", "hello world")

    // other redis
    conn, err := yiigo.Redis("foo").Get()

    if err != nil {
    log.Fatal(err)
    }

    defer yiigo.Redis("foo").Put(conn)

    conn.Do("SET", "test_key", "hello world")
    ```

    #### Zipkin

    ```go
    reporter := yiigo.NewZipkinHTTPReporter("http://localhost:9411/api/v2/spans")

    // sampler
    sampler := zipkin.NewModuloSampler(1)
    // endpoint
    endpoint, _ := zipkin.NewEndpoint("yiigo-zipkin", "localhost")

    tracer, err := yiigo.NewZipkinTracer(reporter,
    zipkin.WithLocalEndpoint(endpoint),
    zipkin.WithSharedSpans(false),
    zipkin.WithSampler(sampler),
    )

    if err != nil {
    log.Fatal(err)
    }

    client, err := tracer.HTTPClient(yiigo.WithZipkinClientOptions(zipkinHttp.ClientTrace(true)))

    if err != nil {
    log.Fatal(err)
    }

    b, err := client.Get(context.Background(), "url...",
    yiigo.WithRequestHeader("Content-Type", "application/json; charset=utf-8"),
    yiigo.WithRequestTimeout(5*time.Second),
    )

    if err != nil {
    log.Fatal(err)
    }

    fmt.Println(string(b))
    ```

    #### Logger

    ```go
    // default logger
    yiigo.Logger().Info("hello world")

    // other logger
    yiigo.Logger("foo").Info("hello world")
    ```

    ## Documentation

    - [API Reference](https://godoc.org/github.com/iiinsomnia/yiigo)
    - [TOML](https://github.com/toml-lang/toml)
    - [Example](https://github.com/iiinsomnia/yiigo-example)

    **Enjoy

    [开源] gev (支持 websocket 啦): Go 实现基于 Reactor 模式的非阻塞网络库

    惜朝 发表了文章 • 0 个评论 • 438 次浏览 • 2019-10-24 11:04 • 来自相关话题

    https://github.com/Allenxuxu/gev[gev](https://github.com/Allenxuxu/gev) ...查看全部

    https://github.com/Allenxuxu/gev

    [gev](https://github.com/Allenxuxu/gev) 是一个轻量、快速、高性能的基于 Reactor 模式的非阻塞网络库,底层并不使用 golang net 库,而是使用 epoll 和 kqueue。

    现在它支持 WebSocket 啦!

    支持定时任务,延时任务!

    ⬇️⬇️⬇️

    ## 特点

    - 基于 epoll 和 kqueue 实现的高性能事件循环
    - 支持多核多线程
    - 动态扩容 Ring Buffer 实现的读写缓冲区
    - 异步读写
    - SO_REUSEPORT 端口重用支持
    - 支持 WebSocket
    - 支持定时任务,延时任务

    ## 性能测试

    > 测试环境 Ubuntu18.04
    - gev
    - gnet
    - eviop
    - evio
    - net (标准库)

    ### 吞吐量测试




    仓库地址: https://github.com/Allenxuxu/gev