关注吃喝新鲜事 优惠早知道
X扫一扫,关注吃喝微信订阅号

吃喝玩乐网官方微信订阅号:
成都吃喝玩乐网

  • 无缝对接网站,实时在线,热闹无边
  • 新鲜讯息推送,及时送达
  • 福利折扣优惠送送送
  • 微信里的吃喝玩乐
X扫一扫,关注吃喝微信服务号

吃喝玩乐网官方微信服务号:
吃喝玩乐网

  • 无缝对接网站,实时在线,热闹无边
  • 新鲜讯息推送,及时送达
  • 功能强大的福利折扣优惠活动
  • 微信里的吃喝玩乐
X扫一扫,加入吃喝玩乐网官方微信群

吃喝玩乐网官方微信群:
52CH官方群

  • 莫道语聊斗图耍炫酷
  • 亦能相亲搞基聊对象
  • 一起吐槽玄摆吹新闻
  • 君若装逼依然好朋友--3s
查看: 1219|回复: 11

[其他] (问题已解决,感谢BlueBing的两次指点)通信方案的选择—Thrift、Protobuf、Avro?

kindooo
UID 28884
发表于 2017-5-10 21:11 | 来自: 北京市 世纪互联宽带数据中心有限公司IDC机房
看了两本书和很多网友的微博,NIO 终于看明白了,好多坑,自己也写了几个小程序。
然后,继续学 Netty ,还是好多坑。。。。终于也明白了(其实只明白了怎么使用,源码没有深入研究)。感觉Netty比NIO 特么好用多了。以前要考虑NIO 半包的问题都不用考虑了! 反而NIO 好多细节都记不住了,汗一个。。

接下来,继续。。
发现  JAVA 对象序列化的传输,已不被推荐
网上说的通信方案的比较—Thrift、Protobuf、Avro,各有好处,不知道该学哪一个呢?
实际上的JAVA 软件开发,会用哪个框架呢? 拜求大神指导。
不违规,出二手鼠标一只。


问题已解决:感谢BlueBing的两次指点,已对Protobuf和ProtoStuff 简单的上手了;感觉使用很方便很爽。
           除了介绍中的暂用容量小、解码快之外;我个人感觉 能简单解决向前向后兼容问题 太特么好用了。

友情提示:发言及回复仅代表网友观点,不代表本站立场!

leefashion
UID 869072
发表于 2017-5-10 21:38 | 来自: 四川省成都市 电信
不懂帮顶
kindooo
UID 28884
 楼主| 发表于 2017-5-10 21:48 | 来自: 北京市 世纪互联宽带数据中心有限公司IDC机房
谢谢帮顶!
BlueBing
UID 869753
发表于 2017-5-10 22:19 | 来自: 四川省成都市 电信
Protobuf
更建议用protostuff 不需生成中间文件 效率比原生高
kindooo
UID 28884
 楼主| 发表于 2017-5-11 00:34 | 来自: 北京市 世纪互联宽带数据中心有限公司IDC机房
BlueBing 发表于 2017-5-10 22:19
Protobuf
更建议用protostuff 不需生成中间文件 效率比原生高

谢谢师兄建议,我研究一下哈
fishlovemm
UID 124656
发表于 2017-5-11 08:59 | 来自: 四川省南充市 电信
好专业。。看不懂。。帮顶
kindooo
UID 28884
 楼主| 发表于 2017-5-26 14:01 | 来自: 北京市 世纪互联宽带数据中心有限公司IDC机房
BlueBing 发表于 2017-5-10 22:19
Protobuf
更建议用protostuff 不需生成中间文件 效率比原生高

再次谢谢师兄,根据您的建议,
我现在已经明白了 Prorobuf 的原理和简单使用;
也会简单 使用了 ProtoStuff ,测试程序也跑通了。真的好用!!!

但是使用ProtoStuff现在又出现一个新问题:  //我想的有点多
就是 传递的 Message 向前兼容的问题 .  
比如 服务器端的 Message 升级了,多了一个属性 如 ing age;  //我随意用的一个Person 来代表Message
客户端 的 Message 没有升级,没有这个  ing age 属性。
结果跑起来,客户端发送成功了,服务器端也收到了,但是在ProtoStuff解码还原 Message 对象出异常。
        @Override
        protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception
        {
                byte[] bytes=new byte[ in.readableBytes()];
                in.readBytes(bytes);
                Person person = new Person();
               Schema<Person> schema = RuntimeSchema.createFrom(Person.class);
             // bytes 反序列化  存储 在  person 变量里面  
               ProtostuffIOUtil.mergeFrom(bytes,person , schema);    //感觉就是这里出异常.
               //报错的信息一大堆,看不明白。。
               out.add(person);
        }


是不是要自定义  Schema?  百度后 还是 没有查到。。。
求指点方向,拜谢。。。

BlueBing
UID 869753
发表于 2017-5-26 15:20 | 来自: 四川省成都市 电信
kindooo 发表于 2017-5-26 14:01
再次谢谢师兄,根据您的建议,
我现在已经明白了 Prorobuf 的原理和简单使用;
也会简单 使用了 ProtoS ...

其一: schema 起一个缓存作用,因为序列化必然要用到反射,而反射比较耗时,缓存后,再序列化同一个对象时,会直接赋值;
其二: 就你的报错问题,给你个思路,把新增字段放到最后试试;
其三: 你这个解码类需要考虑下粘包解包的问题
kindooo
UID 28884
 楼主| 发表于 2017-5-26 15:41 | 来自: 北京市 世纪互联宽带数据中心有限公司IDC机房
BlueBing 发表于 2017-5-26 15:20
其一: schema 起一个缓存作用,因为序列化必然要用到反射,而反射比较耗时,缓存后,再序列化同一个对象时,会 ...

第一:ProtoBuf   向前向后兼容的测试正常。
我用ProtoBuf  先写Proto 文件,再编译成JAVA 类。 可以很方便的实现 向前兼容和 向后兼容。
Proto 文件中新增的 属性  optional int32 age = 5,编译成java 类后。 无论是新版发送给旧版(该属性不用就行),或者是旧版发送得新版(该属性值为0), ProtoBuf   都可以处理好。

第二:ProtoStuff  ,如果不考虑向前向后兼容(一方不增加属性),也测试正常。
可惜就是 ProtoStuff ,方便是方便,不用先写Proto 文件了,版本如果一样(不增加属性)的话测试过没有问题; 但是 ProtoStuff 一旦增加属性 反序列化时 就出错。  增加的属性 是放在最后的。(考虑到顺序的)我错了,我承认,刚发现  真的是顺序的问题!!!
我刚才看漏了,还以为是放在最后的,后来才注意到最后还有一个List 属性,昏死!



第三:粘包解包的问题以上都考虑了的,这一点我还是清楚的。 利用Netty
                                                        ch.pipeline()
                                                        .addLast(new LengthFieldBasedFrameDecoder(MAX_FRAME_LENGTH,
                                                                          0,4,0,4, false))   
                                                      .addLast(new MsgDecoder())     //反序列化
                                                        .addLast(new LengthFieldPrepender(4))   
                                                        .addLast(new MsgEncoder())   //序列化
                                                        .addLast(new ProtoStuffServerHandler());

再次谢谢师兄指点!!!我继续检查研究。。。
藏匿人间
UID 397638
发表于 2017-5-26 15:57 | 来自: 北京市 鹏博士BGP
好高科技哦!!!!!!!!!!
看不懂!!!!!!!!!!!!

99元秒杀价值1000元蜀仁口腔护理套餐 含成人洁牙1次+儿童涂氟1次!

99.00

蜀仁洁牙福利来啦!儿童涂氟、成人洁牙仅需99元!给牙齿年后洗个澡!

去看看

酒令、吉祥如意酒买一件送一件,高粱酒买三桶送一桶,全川包邮!春节囤酒看这里

259.00

年货礼单!酒令、吉祥如意酒买一件送一件,高粱酒买三桶送一桶,全川包邮!春节囤酒看这里

去看看

天冷啦,来吃火锅啦!火锅食材5件包邮到家!

248.00

无限回购的火锅食材248元抢购5种!足不出户,在家吃火锅!

去看看

返回顶部 NewT 快速回复 返回列表 QQ