首页 > 其他分享 >Hessian2序列化支持这一点,让重构dubbo接口更容易了

Hessian2序列化支持这一点,让重构dubbo接口更容易了

时间:2022-12-16 19:11:56浏览次数:42  
标签:MyDto dubbo String bytes Hessian2 new import 序列化

先看如下Hessian2序列化的测试代码。

import com.alibaba.com.caucho.hessian.io.Hessian2Input;
import com.alibaba.com.caucho.hessian.io.Hessian2Output;
import com.alibaba.com.caucho.hessian.io.SerializerFactory;
import dubbodemo.dto.MyDto;
import org.junit.Test;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;

public class TestMain {
    @Test
    public void test2() throws IOException {

        String s = "QxRkdWJib2RlbW8uZHRvLk15RHRvMZMHaW50ZWdlcgRuYW1lAmlkYOFOTg==";
        byte[] bytes = Base64.getDecoder().decode(s); //s.getBytes(Charsets.UTF_8);
//        System.out.println((bytes.length == serialize.length)+"---"+s);
        MyDto myDto2 = (MyDto) deSerialize(bytes);
        System.out.println(myDto2.getNum());

    }

    @Test
    public void test() throws IOException {
        MyDto MyDto = new MyDto();
        MyDto.setNum(1);
        byte[] bytes = serialize(MyDto);
        /**
         * 通过{@link Base64#getEncoder()}把byte数组序列化成base64串。相应地,利用{@link Base64#getDecoder()}进行字符串的反序列化
         */
        String base64String = Base64.getEncoder().encodeToString(bytes); //new String(serialize, Charsets.UTF_8);
        System.out.println("base64串=" + base64String);
        MyDto myDto2 = (MyDto) deSerialize(bytes);
        System.out.println(myDto2.getNum());

    }

    public static byte[] serialize(Object myDto) throws IOException {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        Hessian2Output hessian2Output = new Hessian2Output(byteArrayOutputStream);
        try {
            hessian2Output.setSerializerFactory(new SerializerFactory());
            hessian2Output.writeObject(myDto);
        } finally {
            byteArrayOutputStream.close();
            hessian2Output.close();
        }
        return byteArrayOutputStream.toByteArray();
    }

    public static Object deSerialize(byte[] bytes) throws IOException {
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
        Hessian2Input hessianInput = new Hessian2Input(byteArrayInputStream);
        try {
            hessianInput.setSerializerFactory(new SerializerFactory());
            return hessianInput.readObject();
        } finally {
            byteArrayInputStream.close();
            hessianInput.close();
        }
    }
}


@Data
@Accessors(chain = true)
public class MyDto implements Serializable {
    private String id;
    private String name;
    private Integer num;
}

 

我要说什么呢?
我要说的是我们改变 num属性 的类型,无论是由 Integer改成Long,还是由Long改成Integer,只要num的值在Integer取值范围内,就不会影响hessian序列化。

 

这一点对我们的工作有什么帮助呢?

我们的系统中,服务商的主属性--服务商id,在不同子系统里,这个id字段的类型不统一,varchar/int/bigint,这就致使程序里对应的这个服务商id属性,有的是String,有的是Integer,有的是Long,这给我们的系统迭代(开发&运维)带来了许多麻烦。系统不断升级迭代,服务越来越多,重构的工作量以及风险就加剧,产生系统熵增。

这几天的北京,市民陆续“阳”起来,我们公司也不例外,2/3的伙伴们都居家养病了。非常时期,一些开发需求就暂缓。我已阳康,趁此机会,take action!决定动手重构一把。

其中,中台通道系统的channel-provider里有一个dubbo服务LevyMerchantRelationService,它依赖一个数据传输对象LevyMerchantRelationDTO,LevyMerchantRelationDTO里的服务商id类型是Integer。从dubbo控制台来观察,LevyMerchantRelationService的消费者有14个应用共8个java工程。

那么,我们要变更LevyMerchantRelationDTO里的服务商id类型为Long,这些工程的代码,涉及到这个属性的,都要跟着做调整。好消息是,有了上面hessian2序列化的这个优势(dubbo RPC默认序列化方式是Hessian2),我们在上线的时候,就不用把14个消费者应用都同时上线,这将极大节省跨小组沟通和上线工作量,更重要的是,dubbo服务正常调用,丝毫不影响系统稳定。是不是很给力?

 

标签:MyDto,dubbo,String,bytes,Hessian2,new,import,序列化
From: https://www.cnblogs.com/buguge/p/16988123.html

相关文章

  • Dubbo源代码注册中心由zookeeper更改为nacos
    下载了dubbo源代码,本地进行demo测试,本地电脑只有nacos,所以将dubbo默认的zookeeper调整为nacos。//本人用的dubbo-demo-annotation,其他demo同理//服务提供方publiccla......
  • dubbo/dubbox部署资料收集
    dubbo/dubbox部署资料收集最近由于项目需要要部署bubbox,dubbo,在找资料过程中用的的一些网址如下,后来由于取消没有实际应用,以备今后再用http://wenku.baidu.com/link?url=......
  • 使用Dubbox搭建微服务架构
    1. Dubbox介绍1.1Dubbox和DubboDubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成。......
  • 【Dubbo】快速入门案例以及配置详情
    文章目录​​1、Dubbo的前世今生​​​​2、Dubbo的快速入门​​​​2.1、Dubbo的基本架构​​​​2.2、Nacos​​​​2.3、管理后台​​​​2.4、入门案例​​​​2.5、代......
  • Dubbo性能调优参数
    dubbo参数说明:https://dubbo.apache.org/zh/docs3-v2/java-sdk/reference-manual/config/properties/调优参考:https://blog.csdn.net/yudianxiaoxiao/article/details/123......
  • dubbo的线程模型与线程池策略
    Dubbo默认的底层网络通讯使用的是Netty,服务提供方NettyServer使用两级线程池,其中EventLoopGroup(boss)主要用来接受客户端的链接请求,并把接受的请求分发给EventLoopGrou......
  • Dubbo应用级服务发现
    转自:https://blog.csdn.net/songjunyan/article/details/126573516 问题起源最近在用dubbo的时候,发现消费者会给非相同group的服务提供者发送getMetaInfo的请求,于是想......
  • 【序列化与反序列化】Jackson
    1. jackson序列化和反序列化 依赖<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.9.8......
  • [JAVA反序列化]Javacc链1分析
    文章目录​​写在前面​​​​动态代理​​​​简单介绍​​​​动态代理的实现​​​​JavaCC链1分析​​​​参考文章​​写在前面这几天算是好好一边审计PHP的一些CMS一......
  • 【序列化和反序列化】Hessian
    1、hession序列化实现机制hession的实现机制着重于数据,附带简单的类型信息,就像Integer=1,hession会序列化成I1这样的流,I表示intorInteger,1就是数据内容。而对于复杂对......