流式 http client 关注度不高,朋友们帮提提建议 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
guonaihong
V2EX    程序员

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

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

    疑惑

    下面聊的是 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
    wa8n
        1
    wa8n  
       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     Solana     2664 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 07:22 PVG 15:22 LAX 23:22 JFK 02:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86