欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

dubbo源码浅析:默认反序列化利用之hessian2

来源:本站整理 作者:佚名 时间:2020-02-10 TAG: 我要投稿


 
一、前言
官方github描述:
Apache Dubbo is a high-performance, java based, open source RPC framework.
Apache Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
现在大部分企业开发,无论是微服务架构,还是传统的垂直切分架构,大部分都用到了RPC(远程过程调用),实现分布式的协作,其中有比较简单的RESTful方式的RPC实现,也有自定义协议自成一系的RPC实现,而大部分RPC实现框架都使用了一种或多种序列化方式对传输数据进行序列化以及反序列化。
Apache Dubbo是本篇文章主要讲述的RPC实现框架,我会使用我一贯的源码浅析风格,对其进行原理细节的分析探讨,先从dubbo的简单使用,慢慢引申出其源码架构细节,最后在了解大概原理后,重点分析其默认hessian2序列化实现细节。
我希望您看完这篇文章之后,能对dubbo的大概架构和源码具有比较清晰的理解,以及对序列化、反序列化部分有充分的理解,希望为您学习dubbo源码走少一点弯路,并且能挖掘出dubbo的潜在安全问题,从而完善它,使它更加的健壮更加的安全。
 
二、源码浅析
2.1 简单使用
dubbo的使用非常简单,一般普遍使用的是传统的spring方式,不过这种方式使用上没有在spring-boot上使用更便捷。
2.1.1 启动注册中心(zookeeper)
启动一个本地的zookeeper,端口为2181
2.1.2 服务端
service(接口定义和实现相关):
public class A implements Serializable {
  String name = "xxxx";
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}
public interface DemoService {
  String hello(A a);
}
public class DemoServiceImpl implements DemoService {
  public String hello(A a) {
    return "hello! " + a.getName();
  }
}
spring xml配置(dubbo-provider.xml):
xml version="1.0" encoding="UTF-8"?>
beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
 
  dubbo:application name="dubbo-service" />
 
   -->
 
  dubbo:registry address="zookeeper://127.0.0.1:2181" />
 
  dubbo:protocol name="dubbo" port="20880" />
 
  dubbo:service interface="com.threedr3am.learn.dubbo.DemoService"
    ref="demoService" />
 
  bean id="demoService" class="com.threedr3am.learn.dubbo.DemoServiceImpl" />
beans>
启动jvm创建spring容器(main):
public class Main {
  public static void main(String[] args) {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("dubbo-provider.xml");
  }
}
2.1.3 客户端
spring xml配置(dubbo-consumer.xml):
xml version="1.0" encoding="UTF-8"?>
beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
 
  dubbo:application name="dubbo-service-consumer" />
 
   -->
 
  dubbo:registry address="zookeeper://127.0.0.1:2181" />
 
  dubbo:reference id="demoService" interface="com.threedr3am.learn.dubbo.DemoService"/>
beans>
启动jvm,执行RPC(main):
public class Main {
  public static void main(String[] args) {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("dubbo-consumer.xml");
    DemoService demoService = (DemoService) applicationContext.getBean("demoService");
    System.out.println(demoService.hello(new A()));
  }
}
2.1.4 RPC
在上述注册中心、服务端、客户端依次执行后,可以看到,客户端输出了“hello! threedr3am”
2.2 源码跟踪
我们以上述spring的使用例子展开,一步一步的跟踪源码的执行流程。
从github clone到dubbo的源码后,可以发现,源码(2.6.x版本)分成了很多module

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载