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

grpc 真的不适合和 Java 一起使用

  •  1
     
  •   dengtongcai 2019-08-08 12:08:33 +08:00 10617 次点击
    这是一个创建于 2260 天前的主题,其中的信息可能已经有所发展或是发生改变。

    服务端查询数据-->转成 grpc model-->响应给客户端-->客户端吧 grpc 解析成可序列化 model

    把我整吐了,太浪费时间了,核心逻辑代码量都没这些转换的代码多,Java 程序员千万别用 grpc,还是老老实实 dubbo 等

    纯吐槽,不知道有没有用过 grpc 的老铁有好的技巧分享一下

    31 条回复    2019-08-09 10:15:56 +08:00
    qiyuey
        1
    qiyuey  
       2019-08-08 12:10:10 +08:00 via Android
    IDL 的 RPC 都有这些问题
    bobuick
        2
    bobuick  
       2019-08-08 12:12:47 +08:00
    grpc 跨语言上优势. dubbo 实现一份, 客户端, 服务端都能用来解码和传输层协议通用. 你各自来一份 python, go, cpp, php 你试试看 dubbo 会还有多少事需要做进去的
    Raymon111111
        3
    Raymon111111  
       2019-08-08 12:39:58 +08:00
    那想跨语言没别的办法了吧?
    index90
        4
    index90  
       2019-08-08 13:15:05 +08:00   2
    你用什么框架不需要序列化和反序列化啊?

    不明白你究竟面临什么问题。我猜,可能你原来的逻辑代码依赖了你自定义的 Message 对象,现在要转成 ProtoMessage 而已。
    mango88
        5
    mango88  
       2019-08-08 14:09:51 +08:00
    全部 json 一把梭
    brucewuio
        6
    brucewuio  
       2019-08-08 14:12:01 +08:00
    跨语言就方便咯
    Cbdy
        7
    Cbdy  
       2019-08-08 14:12:56 +08:00 via Android
    json 一把梭
    guolaopi
        8
    guolaopi  
       2019-08-08 14:14:53 +08:00
    @index90 +1.
    而且转成 grpc model 和客户端把 grpc 解析成可序列化 model 的文件不都是 grpc 生成的吗?客户端服务端直接调用就行了?还是说 java 和 C#不一样, 这些玩意儿要手写?
    linxl
        9
    linxl  
       2019-08-08 14:15:56 +08:00
    grpc 是服务端写起来麻烦点(不过我也没用过别的 rpc), 客户端使用起来是真舒服, 只要服务端把 protobuf 注释写好点(当作客户端的文档), 基本上也不用再写什么文档了.
    wysnylc
        10
    wysnylc  
       2019-08-08 14:59:15 +08:00
    spring cloud 是推荐使用 Restful
    chendy
        11
    chendy  
       2019-08-08 15:04:53 +08:00
    RPC 都是这个流程吧,而且有 IDL 还能生成,裸 http+json 的还要自己写数据类
    核心逻辑没有这些多可能是因为业务简单吧,业务简单业务代码可能都没有 SQL 代码多…
    passerbytiny
        12
    passerbytiny  
       2019-08-08 15:06:24 +08:00
    请用 RESTful,或者叫做原始 HTTP。
    dengtongcai
        13
    dengtongcai  
    OP
       2019-08-08 15:10:06 +08:00
    @wysnylc
    @passerbytiny
    我也很无奈,应该是这家公司的历史问题,全都是 grpc
    passerbytiny
        14
    passerbytiny  
       2019-08-08 15:10:20 +08:00
    好吧,我粗略查了一下,grpc 谷歌出的。谷歌出品,除非你的产品打算服务几十亿人,否则别给自己找麻烦。
    iPhoneXI
        15
    iPhoneXI  
       2019-08-08 15:10:56 +08:00 via Android
    dubbo 其他语言的客户端还是个渣吧
    iPhoneXI
        16
    iPhoneXI  
       2019-08-08 15:11:20 +08:00 via Android
    @iPhoneXI 我觉得 thrift 挺好的,成熟,支持多语言
    laminux29
        17
    laminux29  
       2019-08-08 15:16:00 +08:00   1
    grpc、thrift 这些框架的优势就是,根据数据结构的定义,自动生成代码。

    然而你却说 [核心逻辑代码量都没这些转换的代码多] ????

    就好比,你用美团外卖,然后来吐槽自己跑了很远去取外卖,很累很远;或者是找了女朋友,却吐槽说自己天天撸管太累。
    Moming
        18
    Moming  
       2019-08-08 15:20:57 +08:00   1
    用 gRPC 不都配套 ProtocolBuffer 吗?为什么你还要自己处理序列化问题?

    不过我真不习惯 Java 的项目管理,还是 cargo 爽……
    reus
        19
    reus  
       2019-08-08 15:47:07 +08:00   1
    你水平太低
    danielmiao
        20
    danielmiao  
       2019-08-08 17:27:43 +08:00
    不应该自己封装一层通用转换么???涉及到接口的不做通用化的处理不是给自己找麻烦么
    OakScript
        21
    OakScript  
       2019-08-08 18:53:24 +08:00
    @Moming rust 党可以
    iEverX
        22
    iEverX  
       2019-08-08 19:02:32 +08:00 via Android
    如果业务逻辑是自己的类,那么就是需要写很多的 wrapper,并且 proto 类的确不适合直接用在业务代码里,thrift 好很多
    hsuehsen
        23
    hsuehsen  
       2019-08-08 19:03:32 +08:00
    Java (如 spring )自带的框架,自动把查询的数据转换成 json 格式,所以 java 技术栈用 rest api 基本都是不用自己封包数据的。但是,grpc 是要自己调用 protobuf 生成的接口进行处理

    其实,可以将 java 自动产生的 json 通过 json2grpc 网关做转换的(我记得是有类似的框架)
    hsuehsen
        24
    hsuehsen  
       2019-08-08 19:05:52 +08:00
    grpc 最大的优势是跨语言,是从整个系统层面(各种服务 /各种客户端),节省序列化反序列化的工作量与兼容性
    特别是涉及多种通讯协议的情况下
    momocraft
        25
    momocraft  
       2019-08-08 19:06:37 +08:00
    如果不需要多服务多语言 可能 grpc (以及 openapi protobuf 这些东西) 好处真的不大
    impl
        26
    impl  
       2019-08-08 19:48:18 +08:00 via Android
    Java 真的不适合人类使用
    richard1122
        27
    richard1122  
       2019-08-08 21:44:53 +08:00
    我们用 kotlin + grpc,感觉没什么问题。 楼主是说 build message 的那一个个 set 用起来很麻烦吗?
    qoras
        28
    qoras  
       2019-08-08 23:36:41 +08:00
    客户端和服务端交互用 http, 服务端内部交互用 grpc
    mreasonyang
        29
    mreasonyang  
       2019-08-09 00:50:39 +08:00 via iPhone
    这种字段完全一样的数据结构转化当然是用 Mapstruct 来做啊
    friddle
        30
    friddle  
       2019-08-09 09:49:19 +08:00
    没懂。为啥服务端要解析成 model。服务端调用的是 http+json 吗。
    当时我直接撸了个基于特定业务规则的 json 转 grpc 请求。一个拦截层就可以做到的事情。
    需要可以把代码给你参考。不打算开源。因为业务还是绑定的太深。

    还有 go 版本的 grpc-GateWay。这个也不错
    YzSama
        31
    YzSama  
       2019-08-09 10:15:56 +08:00
    我以前用过 wsdl cxf 来写。和 其他服务端 C#\Python 还蛮匹配的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     960 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 19:04 PVG 03:04 LAX 12:04 JFK 15:04
    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