面试官,谈谈动态代理与RPC?我...

简介: 面试官,谈谈动态代理与RPC?我...

背景

RPC大家有一定了解后,在Java开发生态下,动态代理和它有着紧密联系。

如果单拎出动态代理,你一定会有一大堆八股文,它和RPC是什么关系?

一、使用场景

在使用RPC的时候,需要服务方提供interface,在调用方编写业务逻辑时,调用接口的方法,拿到结果。为什么?

RPC会为接口生成一个代理类,调用方在使用过程中,实际运行时该接口被调用会被代理类给拦截到,在代理类中具体实现远程调用逻辑。

这里其实就使用到了动态代理技术,场景描述如下,

通过这种hack手法,用户就不会感知远程调用的细节,实际就和调用本地方法一样。

二、Java动态代理

代码运行环境要求:open Jdk11

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
 * interface
 */
interface HelloWorld {
    String speak();
}
/**
 * real object
 */
class RealHello {
    public String say() {
        return "i'm RealHello";
    }
}
/**
 * proxy
 */
class JdkProxy implements InvocationHandler {
    private final Object target;
    JdkProxy(Object target) {
        this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] paramValues) {
        return ((RealHello) target).say();
    }
}
/**
 * TestProxy
 */
public class TestProxy {
    public static void main(String[] args) {
        JdkProxy jdkProxy = new JdkProxy(new RealHello());
        ClassLoader classLoader = ClassLoader.getSystemClassLoader();
        // save proxy class
        System.setProperty("jdk.proxy.ProxyGenerator.saveGeneratedFiles", "true");
        // generate proxy object
        HelloWorld test = (HelloWorld) Proxy.newProxyInstance(classLoader, new Class[] {HelloWorld.class}, jdkProxy);
        // invoke proxy
        System.out.println(test.speak());
    }
}

本段代码的含义:HelloWorld接口生成一个代理类,并调用它的speak方法,返回的数据是RealHello的say方法返回值。

三、额外思考

如果没有动态代理那么如何完成方法调用拦截,实现RPC?

显而易见动态不行,就静态。但是静态有一个不好的地方,那就是需要针对性的为每个实现类创建一个代理类,并且需要写序列化、负载均衡、失败重试等等,上线一个 RPC调用的特性从一天可能就变成一周了。

对于RPC增加或修改接口的情况,动态代理无需修改,自适应协议的变化,而静态代理需要重新生成代码覆盖调用方和服务方。

如果是跨语言的类似GRPC的这种要怎么弄呢?对于动态代理,要么是各种reflect逻辑从服务提供方动态获取解析类型和数据,要么就构建一堆的硬编码,可以理解为通过模板动态生成支持适配协议的相关代码,这两个的代表在GRPC中是envoy和grpc-gateway。

小结

动态代理作为在RPC里面的一种应用,虽然只是具体实现技术,但理解了它才能更好的理解RPC里面是如何做到面向接口编程,帮助用户屏蔽RPC调用细节,达到远程调用。

动态代理本身是一种技术框架,在使用时,我们就需要有一个合理的选型,一般从框架生成代理类的速度、代理类字节码的大小、代理类的执行效率、框架的生态是否繁荣等去选择。

相关文章
SpringJDK动态代理实现,2024Java面试真题精选干货整理
SpringJDK动态代理实现,2024Java面试真题精选干货整理
|
19天前
|
Java 数据安全/隐私保护
【面试问题】JDK 动态代理与 CGLIB 区别?
【1月更文挑战第27天】【面试问题】JDK 动态代理与 CGLIB 区别?
|
19天前
|
Java
【面试问题】动态代理是什么?
【1月更文挑战第27天】【面试问题】动态代理是什么?
|
8月前
|
监控 Java Spring
【面试题精讲】JDK动态代理
【面试题精讲】JDK动态代理
|
Java
Java 最常见的面试题:怎么实现动态代理?
Java 最常见的面试题:怎么实现动态代理?
123 0
|
Java Spring
Java 最常见的面试题:动态代理是什么?有哪些应用?
Java 最常见的面试题:动态代理是什么?有哪些应用?
137 0
|
设计模式 安全 Java
面试篇之什么是静态代理?什么是动态代理?
Java中的代理,开源理解为通过代理去访问实际的目标对象,比如呢?我们平常买卖二手车的中间商,就可以看作一个代理类,不过你也可以直接去和二手车的主人买卖。
106 0
|
Java
面试官:你说你懂动态代理,那你知道为什么JDK中的代理类都要继承Proxy吗?
之前我已经写过了关于动态代理的两篇文章,本来以为这块应该没啥问题,没想到今天又被难住了… 太难了!!! 之前文章的链接: 1,动态代理学习(一)自己动手模拟JDK动态代理、 2.动态代理学习(二)JDK动态代理源码分析
162 0
|
设计模式 Java 索引
动态代理总结,面试你要知道的都在这里,无废话!
代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能一个比方:在租房的时候,有的人会通过房东直租,有的人会通过中介租房。这两种情况哪种比较方便呢?当然是通过中介更加方便。这里的中介就相当于代理,用户通过中介完成租房的一系列操作(看房、交押金、租房、清扫卫生)代理模式可以有效的将具体的实现与调用方进行解耦,通过面向接口进行编码完全将具体的实现隐藏在内部。创建一个接口,然后创建被代理的类实现该接口并且实现该接口中的抽象方法。之后再创建一个代理类,同时使其也实现这个接口。在代理类中持有一个被代理
面试官问我:什么是静态代理?什么是动态代理?注解、反射你会吗?
欢迎关注同名公众号《Java鱼仔》,更多知识点你值得拥有 开场 一位穿着蓝色衬衫,牛仔裤,拿着一个白色保温杯的中年男子急匆匆地坐在你对面,看样子是项目上的东西很急,估摸面试时间不会太长,这样一想心情放松了许多......(后来我就被打脸了)
面试官问我:什么是静态代理?什么是动态代理?注解、反射你会吗?