动态代理

回顾

用来解决两个应用之间的通信,而网络则是两台l两台机器之间的“桥梁”,只有搭好桥梁才能把请求数据从一端传输到另一端,其中关键就是“可靠的传输”

背景

RPC的目标就是通过屏蔽调用细节,实现远程调用如同本地调用一样简单

在使用RPC时,一般的做法是先找服务提供方要接口,通过Maven或者其他工具把接口依赖到项目中,通过依赖注入的方式把接口注入项目中,然后在代码里面直接调用的方法

核心技术:动态代理

  • RPC会自动给接口生成一个代理类,在项目中注入接口的时候,运行过程中实际绑定的是这个接口生成的代理类,在接口方法被调用的时候,实际上是被生成代理类拦截到了,这样就可以在生成的代理类中加入远程调用逻辑

动态代理

实现原理

/**

  • 要代理的接口

    */

    public interface Hello {

      String say();

    }

/**

  • 真实调用对象

    */

    public class RealHello {

public String invoke(){

    return "i'm proxy";

  }

}

/**

  • JDK代理类生成

    */

    public class JDKProxy implements InvocationHandler {

      private Object target;

JDKProxy(Object target) {

    this.target = target;

  }

@Override

  public Object invoke(Object proxy, Method method, Object[] paramValues) {

    return ((RealHello)target).invoke();

  }

}

/**

  • 测试例子

    */

    public class TestProxy {

public static void main(String[] args){

    // 构建代理器

    JDKProxy proxy = new JDKProxy(new RealHello());

    ClassLoader classLoader = ClassLoaderUtils.getCurrentClassLoader();

    // 把生成的代理类保存到文件

System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles","true");

    // 生成代理类

    Hello test = (Hello) Proxy.newProxyInstance(classLoader, new Class[]{Hello.class}, proxy);

    // 方法调用

    System.out.println(test.say());

  }

}

  • 给Hello接口生成一个动态代理类,并调用接口say()方法,但真实返回的值是来自RealHello里面的invoke()方法返回值

实现方法

  • 在java领域(而我对java不熟),除了JDK默认的nvocationHandler能完成代理,还有很多第三方框架,如javassist、BYTE Buddy这样的框架也行

动态代理是一种具体的技术框架,那就会涉及到选型的问题,可从以下考虑

  • 因为代理类是在运行中生成的,那么代理框架生成代理类的速度、生成代理类的字节码大小等等,都会影响到其性能——生成的字节码越小,运行所占资源就越小。
  • 还有就是我们生成的代理类,是用于接口方法请求拦截的,所以每次调用接口方法的时候,都会执行生成的代理类,这时生成的代理类的执行效率就需要很高效。
  • 最后一个是从我们的使用角度出发的,我们肯定希望选择一个使用起来很方便的代理类框架,比如我们可以考虑:API 设计是否好理解、社区活跃度、还有就是依赖复杂度等等。

RPC实战与核心原理之动态代理了的更多相关文章

  1. spring5——Aop的实现原理(动态代理)

    spring框架的核心之一AOP,面向切面编程是一种编程思想.我对于面向切面编程的理解是:可以让我们动态的控制程序的执行流程及执行结果.spring框架对AOP的实现是为了使业务逻辑之间实现分离,分离 ...

  2. mybatis源码分析(5)-----拦截器的实现原理(动态代理+责任链)

    写在前面 MyBatsi 的拦截器模式是基于代理的代理模式.并且myBatis 的插件开发也是以拦截器的形式集成到myBatis 当中. MyBatis 的拦截器已经插件是在org.apache.ib ...

  3. Hibernate学习--hibernate延迟加载原理(动态代理)

    在正式说hibernate延迟加载时,先说说一个比较奇怪的现象吧:hibernate中,在many-to-one时,如果我们设置了延迟加载,会发现我们在eclipse的调试框中查看one对应对象时,它 ...

  4. AOP底层实现原理,动态代理如何动态

    代理 指定另外一个主体代替原来的某个主体去执行某个事物 代理执行的人 需要代理的人 需要代理的事情是一定要做的 但是被代理的人没有时间或自己做的不专业 静态代理: 父母朋友帮忙物色找对象 代理人掌握需 ...

  5. 30个类手写Spring核心原理之动态数据源切换(8)

    本文节选自<Spring 5核心原理> 阅读本文之前,请先阅读以下内容: 30个类手写Spring核心原理之自定义ORM(上)(6) 30个类手写Spring核心原理之自定义ORM(下)( ...

  6. Redis核心原理-简单动态字符串SDS

    SDS简介 Redis是C语言编写的,但没有使用c语言的字符串结构,而是自己实现了一套简单动态字符串 simple dynamic string 简称SDS,SDS兼容C语言的字符串类型,原理类似Ja ...

  7. Java之美[从菜鸟到高手演练]之JDK动态代理的实现及原理

    Java之美[从菜鸟到高手演练]之JDK动态代理的实现及原理 JDK动态代理的实现及原理 作者:二青 邮箱:xtfggef@gmail.com     微博:http://weibo.com/xtfg ...

  8. JDK和CGLIB动态代理原理区别

    JDK和CGLIB动态代理原理区别 https://blog.csdn.net/yhl_jxy/article/details/80635012 2018年06月09日 18:34:17 阅读数:65 ...

  9. Mybatis mapper动态代理的原理详解

    在开始动态代理的原理讲解以前,我们先看一下集成mybatis以后dao层不使用动态代理以及使用动态代理的两种实现方式,通过对比我们自己实现dao层接口以及mybatis动态代理可以更加直观的展现出my ...

  10. Spring源码剖析5:JDK和cglib动态代理原理详解

    AOP的基础是Java动态代理,了解和使用两种动态代理能让我们更好地理解 AOP,在讲解AOP之前,让我们先来看看Java动态代理的使用方式以及底层实现原理. 转自https://www.jiansh ...

随机推荐

  1. JNZ项目犯错记

    年度绩效因为JNZ项目没有达到绩效目标被打了低绩效,这个是我从业这么多年来第一次低绩效,记一下我在这个项目中犯的错误. 项目起源 公司业务是一个ToB的电商场景,已经经营数年了,公司会给大客户一定账期 ...

  2. Minecraft server.properties 参数含义 1.18.1,Java版

    服务器搭建 参照: https://www.spigotmc.org/wiki/buildtools/#latest 参数含义 #Fri Feb 11 15:20:40 CST 2022 # 启用jm ...

  3. 一文搞懂 APP 算法备案

    今天来给大家好好科普一下超重要的 APP 算法备案,这可是和我们日常使用 APP 以及 APP 运营都息息相关的知识点哦! 什么是算法备案 简单来讲,算法备案就相当于 APP 运营者要把自家 APP ...

  4. 【资源分享】Latex mathematical symbol

    https://files.cnblogs.com/files/blogs/705982/symbols.zip?t=1660463874 上面这个是pdf版,把这个压缩包下载之后,后缀改为pdf即可 ...

  5. 解决bootstrapvalidator配合select2插件不能正常校验的问题

    我在使用bootstrapvalidator对select2插件进行校验时,出现了不能校验的问题,于是求助度娘,发现大多的解决方法是这样的: 1.添加一个隐藏域,将bootstrapvalidator ...

  6. 扩展知识:vscode配置easyx

    扩展知识:vscode配置easyx 前言 ‍ 因为个人用习惯了vscode,对于visual studio的操作只能说相当程度上很不适应,因此,我打算经历一番配置,让vscode可以配置上easyx ...

  7. FastAPI性能优化指南:参数解析与惰性加载

    扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长 探索数千个预构建的 AI 应用,开启你的下一个伟大创意 第一章:参数解析性能原理 1.1 FastAPI请求处理管线 async def ...

  8. Centos下安装php mysql pdo以及gd扩展

    pdo扩展安装: yum install php-pdo pdomysql扩展安装: yum install php-pdo_mysql gd库扩展安装: yum install php-gd 安装后 ...

  9. Tauri跨端笔记实战(1) - 从零打造一款跨端的 AI 笔记

    前言 Tauri 跨端笔记实战项目是基于 Notegen 开源项目,本系列深度解析如何运用Tauri框架开发跨平台AI笔记应用.涵盖核心技术选型.架构设计.典型场景开发及常见问题解决方案,通过代码级演 ...

  10. Docker | 如何在 Linux 服务器使用 docker

    目录 00 需求 01 安装 docker 02 准备工作 03 配置 Dockerfile 和 docker composer 04 启动 docker 05 测试能否 ssh 连接这个 docke ...