V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
guonaihong
V2EX  ›  程序员

流式 http client 关注度不高,朋友们帮提提建议

  •  
  •   guonaihong ·
    guonaihong · 2019-12-10 09:04:22 +08:00 · 3982 次点击
    这是一个创建于 1845 天前的主题,其中的信息可能已经有所发展或是发生改变。

    疑惑

    下面聊的是 gout,gout 是 go 里面第一个流式 http client。下面是 feaute 列表,数据编解码这块基本做到极致,引入流式概念,既可以 core 很小巧,组合起来也很强大(benchmark 是第一个 filter 函数)。为啥关注度不高?还有哪些需要完善的地方?

    feature

    • 支持 GET/PUT/DELETE/PATH/HEAD/OPTIONS
    • 支持设置请求 http header(可传 struct,map,array,slice 等类型)
    • 支持设置 URL query(可传 struct,map,array,slice,string 等类型)
    • 支持设置 json,xml,yaml 编码到请求 body 里面(SetJSON/SetXML/SetYAML)
    • 支持设置 form-data(可传 struct,map,array,slice 等类型)
    • 支持设置 x-www-form-urlencoded(可传 struct,map,array,slice 等类型) 支持 io.Reader,uint/uint8/uint16...int/int8...string...[]byte...float32,float64 至请求 body 里面
    • 支持解析响应 body 里面的 json,xml,yaml 至结构体里(BindJSON/BindXML/BindYAML)
    • 支持解析响应 body 的内容至 io.Writer, uint/uint8...int/int8...string...[]byte...float32,float64
    • 支持解析响应 header 至结构体里
    • 支持接口性能 benchmark,可控制压测一定次数还是时间,可控制压测频率
    • 等等更多

    项目地址

    https://github.com/guonaihong/gout

    演示

    gout-example.gif

    27 条回复    2019-12-17 22:14:42 +08:00
    wangsongyan
        1
    wangsongyan  
       2019-12-10 09:15:43 +08:00   ❤️ 1
    多在 v2 发帖子
    zunceng
        2
    zunceng  
       2019-12-10 09:18:54 +08:00   ❤️ 1
    集成 grpc ?
    popbones
        3
    popbones  
       2019-12-10 09:34:24 +08:00 via iPhone   ❤️ 1
    文档改成英文的
    reus
        4
    reus  
       2019-12-10 11:04:59 +08:00 via Android   ❤️ 1
    你解决的根本不是痛点,没有
    shunia
        5
    shunia  
       2019-12-10 11:04:59 +08:00   ❤️ 1
    优秀的英文文档呗,想热得靠 pr,国人 pr 的热情太低。
    guonaihong
        6
    guonaihong  
    OP
       2019-12-10 12:33:20 +08:00
    @popbones 这个版本加上。
    guonaihong
        7
    guonaihong  
    OP
       2019-12-10 12:36:39 +08:00
    @reus 哈哈,你的回答最有意思,上次看你怼过几个项目,有的最后 700star,有的 1w   star。
    lishunan246
        8
    lishunan246  
       2019-12-10 12:40:09 +08:00
    给一个不用 net/http 和 valyala/fasthttp 的理由?
    chennqqi
        9
    chennqqi  
       2019-12-10 13:04:25 +08:00
    net/http 足够好了,另外不知道你说的流式是啥意思
    zhaogaz
        10
    zhaogaz  
       2019-12-10 13:14:08 +08:00
    哎,有很多 star 高的项目都是垃圾。。。
    guonaihong
        11
    guonaihong  
    OP
       2019-12-10 13:28:28 +08:00
    @lishunan246 用标准库可以慢慢的做一件事,用库可以更爽更快的做一件事。这个看个人喜好了。
    guonaihong
        12
    guonaihong  
    OP
       2019-12-10 13:31:49 +08:00
    @zhaogaz 这个没法回答你。做开源项目的人都不喜欢评论别人的开源项目是垃圾,知道几千几万行的撸不容易。如果遇到问题一般直接提 pr 帮原作者完善下。
    gesse
        13
    gesse  
       2019-12-10 13:37:45 +08:00   ❤️ 1
    star + watch 了
    stanlry
        14
    stanlry  
       2019-12-10 13:38:18 +08:00 via Android
    建议看看 go-resty,很早就有了
    PiersSoCool
        15
    PiersSoCool  
       2019-12-10 13:39:08 +08:00
    流式调用的好处在哪里?更可读?更简洁?我的确没觉得更爽,net/http 代码可读性肯定比你这好一些,因为他没有封装流式的方法,这对于业务来说是无关的代码。
    所以那解决了 net/http 什么问题?我不知道。所以对标的是什么库,优缺点呢?
    生产环境可使用吗?崩溃了谁能去及时解决?没人想给自己造成麻烦。
    我怎么从 net/http 迁移?全部重写?那是不可能的。
    python
        16
    python  
       2019-12-10 13:54:18 +08:00 via Android   ❤️ 1
    支持批量传 url slice 去请求拿响应结果不?
    错误处理呢?
    重试机制有吗?
    相比 fasthttp 性能如何?
    畸形页面的编码问题? gbk ?
    guonaihong
        17
    guonaihong  
    OP
       2019-12-10 14:17:21 +08:00
    @PiersSoCool 我下班后回答下,都是挺好的问题。
    guonaihong
        18
    guonaihong  
    OP
       2019-12-10 14:17:43 +08:00
    @python 我下班后回答,不错的建议。
    exceptionplayer1
        19
    exceptionplayer1  
       2019-12-10 14:24:14 +08:00
    不错,学习一下
    woostundy
        20
    woostundy  
       2019-12-10 14:24:32 +08:00
    支持。
    我觉得需要个最佳实践项目,来告诉大家用这个库的场景。
    matepi
        21
    matepi  
       2019-12-10 15:00:34 +08:00
    主要还是流式调试起来反人类……自己小玩玩可以,大逻辑项目不敢上
    lishunan246
        22
    lishunan246  
       2019-12-10 15:08:27 +08:00 via Android
    @guonaihong 在什么场景下你的 gout 比标准库和 fasthttp 更爽更快?
    guonaihong
        23
    guonaihong  
    OP
       2019-12-10 18:46:22 +08:00
    @stanlry gout 实现的代码现在已经比 go-resty 多,很多功能 gout 有,go-resty 没有,全面超越还是有可能的。go-resty 的立意还是很不错的,不是 python 的 request 的搬砖项目。可惜作者没有好好设计。
    guonaihong
        24
    guonaihong  
    OP
       2019-12-10 18:52:06 +08:00
    @lishunan246 抱歉,我上面说的快是开发效率。这点应该没有争议。
    标准库里面的 net/http 至今也没有项目可以撼动其地位。fasthttp 支持 http2 还没成功,作者已经去玩时序数据库了。。。
    guonaihong
        25
    guonaihong  
    OP
       2019-12-10 19:09:46 +08:00
    @PiersSoCool 这里面的问题其实很好回答,我讲下自己的事情,以前我们 http server 都是基于标准库的,后面尝试 gin 确实可以提高开发效率就慢慢铺开,在用的过程就提提 pr 优化下。用标准库开发绝对问题,但是开发效率不是最优解。这需要你那么自己权衡。这对于选择任何开源项目都适用。
    guonaihong
        26
    guonaihong  
    OP
       2019-12-10 19:11:00 +08:00
    @PiersSoCool 忽略上一条,看这条。这里面的问题其实很好回答,我讲下自己的事情,以前我们 http server 都是基于标准库的,后面尝试 gin 确实可以提高开发效率就慢慢铺开,在用的过程就提提 pr 优化下。用标准库开发绝对很难遇到问题,但是开发效率不是最优解。这需要你那么自己权衡。这对于选择任何开源项目都适用。
    guonaihong
        27
    guonaihong  
    OP
       2019-12-10 19:19:29 +08:00
    @python 字符编码不会做,这个点能不到极致,就给更喜欢这点的童鞋做。gout 只做作者能轻松 hold 得住的点,有问题可以快速解决,保守估计再撸 2-3w 行代码还是可以驾驭得住的。

    批量 url 和重试我一直不想加。重试在我遇到的项目里面没有 fast fail 策略来的好使。有兴趣的话,可以在 gout 的 issue 上面一起讨论下。
    guonaihong
        28
    guonaihong  
    OP
       2019-12-17 22:14:42 +08:00
    @python 带指数回退的 重试功能已加
    https://github.com/guonaihong/gout#retry
    欢迎试用。至于你提的别的一些功能,在未来在版本也可能实现
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1711 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 16:42 · PVG 00:42 · LAX 08:42 · JFK 11:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.