46

微服务架构之Msgpack序列化最佳实践

 4 years ago
source link: http://www.liangsonghua.me/archives/388?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

公众号|松华说|微服务架构之Msgpack序列化最佳实践   公众号|松华说|微服务架构之Msgpack序列化最佳实践

songhuasay.png
  • 分享在京东工作的技术感悟,还有JAVA技术和业内最佳实践,大部分都是务实的、能看懂的、可复现的

微服务架构之Msgpack序列化最佳实践

博客首页文章列表 松花皮蛋me 2019-05-27 14:28
leaves-4176219_1920-1-1024x683.jpg

任何Java序列化工具,序列化/反序列化的时候,都是通过反射去遍历Class属性,然后挨个生成byte数组。Msgpack序列化的时候,filed不写key,只写index,类似数组,它的编码方式是type+length+body,这样传输时整体包会小很多,另外Msgpack支持启动预生成msgpack模版,而不用每次都反射(题外话:方法的反射调用会带来不少性能开销,原因主要有变长(Object[] objs或Object… objs)参数方法、自动装箱拆箱、方法内联失效,对反射感兴趣的朋友可以阅读http://www.liangsonghua.me/archives/73)。不过糟糕的是Msgpack不支持泛型、Ref引用,而且集合类型会丢失

image-1024x327.png

基于这些特性,在服务端和消费者不能同时升级的情况下,字段兼容规则如下,否则会出现模板污染

1、字段变更必须是保证在字段顺序最后一位,另外存在父子类的情况下,变更字段不能加在父类,否则会导致子类的最后一个字段没有机会得到覆值

2、禁止直接使用不熟悉的复杂类,有可能属性里面存在Native,或者内部引用内部类,会导致报错

3、不能使用内部类,尤其是集合内部类包括list.sublist、map.keyset等在不同jdk版本下实现方式不一样的方法

4、不能使用第三方包提供的集合类工具包作为返回值或者入参

  public Class A{
	        Map<String,String> a();
	    }
	
	    public Class Aimpl implements A{
	        public Map<String,String> a(){
	            //  不能这样使用
	            return JSON.parseObject("{}");
	        }
	    }

5、虽然msgpack不强制要求实体类实现Serializable接口,但是还是强烈建议加上,方便切其他序列化

6、类属性上不能使用具体类,要使用接口或者超类。JDK 版本不一样,导致数据结构不一样

	    public Class A{
	        //不能这样使用
	        private ConcurrentHashMap<String,String> a;
	    }

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK