RPC框架中一般都有3个角色:服务提供者、服务消费者和注册中心。服务提供者将服务注册到注册中心,服务消费者从注册中心拉取服务的地址,并根据服务地址向服务提供者发起RPC调用。动态代理在这个RPC调用的过程中有什么作用?对于服务消费者,一般只会依赖服务接口,而服务的具体实现是在服务提供者这一端的,服务消费者和服务提供者分别部署在不同的机器上,服务消费者调用接口中的方法时怎么能够得到结果呢?JDK的动态代理就派上用场了。服务消费者使用JDK的动态代理技术,可以创建接口的代理对象,并在回调函数中将自己要调用的接口名称、方法签名信息通过http或者tcp的方式发送给服务提供者,服务提供者再通过反射的方式调用本地的服务,最后将结果通过http或tcp的方式返回给消费者。

下面是一个简单的演示程序:

 1 import java.lang.reflect.InvocationHandler;
 2 import java.lang.reflect.Method;
 3 import java.lang.reflect.Proxy;
 4 import java.util.HashMap;
 5 import java.util.Map;
 6
 7 /**
 8  * 动态代理在RPC中的使用
 9  *
10  * @author syj
11  */
12 public class JDKProxyTest {
13
14     // ---------------------------  模拟RPC客户端  ---------------------------
15
16     // 客户端依赖服务端的接口(实现类在服务端)
17     private static IUserService userService;
18
19     public static void main(String[] args) {
20         // 根据接口创建代理对象
21         userService = (IUserService) Proxy.newProxyInstance(
22                 JDKProxyTest.class.getClassLoader(),
23                 new Class[]{IUserService.class},
24                 new InvocationHandler() {
25                     // 在回调方法模拟进行RPC调用(通过http或者tcp与服务端通信)
26                     @Override
27                     public Object invoke(Object proxy, Method method, Object[] params) throws Throwable {
28                         return rpcInvoke(IUserService.class.getSimpleName(), method.getName(), method.getParameterTypes(), params);
29                     }
30                 }
31         );
32         // 本地调用
33         String result = userService.sayHello("hello");
34         System.out.println(">>>> result =" + result);
35     }
36
37
38     // ---------------------------  模拟RPC服务端  ---------------------------
39
40     /**
41      * 反射调用
42      *
43      * @param methodName     方法名称
44      * @param parameterTypes 方法参数类型
45      * @param parameters     方法参数
46      * @return
47      */
48     private static Object rpcInvoke(String interfaceName, String methodName, Class<?>[] parameterTypes, Object[] parameters) {
49         Object result = null;
50         try {
51             // 根据接口名称从Bean容器中获取Bean实例
52             Object serviceBean = beanMap.get(interfaceName);
53             // 反射调用
54             Class<?> serviceClass = serviceBean.getClass();
55             Method method = serviceClass.getMethod(methodName, parameterTypes);
56             method.setAccessible(true);
57             // 得到调用结果
58             result = method.invoke(serviceBean, parameters);
59         } catch (Exception e) {
60             e.printStackTrace();
61         }
62         return result;
63     }
64
65     // 模拟Bean容器, key为接口名称, value为bean实例
66     private static Map<String, Object> beanMap = new HashMap<String, Object>() {{
67         put("IUserService", new UserServiceImpl());
68     }};
69 }

接口(服务提供者和服务的消费者都会依赖该接口):

1 public interface IUserService {
2     String sayHello(String content);
3 }

服务提供者实现类:

public class UserServiceImpl implements IUserService {@Overridepublic String sayHello(String content) {return content + "::" + System.currentTimeMillis();}
}

其实,JDK的动态代理技术,不仅可以应用在RPC框架中,也可以应用在所有基于客户端和服务端通信的架构中,比如微服务架构中的注册中心、配置中心、消息中心等。

转载于:https://www.cnblogs.com/jun1019/p/10952447.html

JDK动态代理在RPC框架中的应用相关推荐

  1. Java 动态代理及 RPC 框架介绍

    所谓动态代理,指的是语言提供的一种语法,能够将对对象中不同方法的调用重定向到一个统一的处理函数中来. python重写__getattr__函数能够做到这一点,就连世界上最好的语言也提供称为魔术方法的 ...

  2. JDK动态代理底层剖析

    动态代理剖析 JDK动态代理是在内存中生成Java字节码文件(.class文件) 通过类的加载器加载class文件,生成Class对象 再通过Java的反射技术生成实例对象,提供服务.

  3. 浅谈Spring中JDK动态代理与CGLIB动态代理

    前言 Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式 ...

  4. spring中aop默认使用jdk动态代理,springboot2以后默认使用cglib来实现动态代理详解

    Spring5 AOP 默认使用 Cglib 了?我第一次听到这个说法是在一个微信群里: 真的假的?查阅文档 刚看到这个说法的时候,我是保持怀疑态度的. 大家都知道 Spring5 之前的版本 AOP ...

  5. 深入理解JDK动态代理原理,使用javassist动手写一个动态代理框架

    文章目录 系列文章索引 一.动手实现一个动态代理框架 1.初识javassist 2.使用javassist实现一个动态代理框架 二.JDK动态代理 1.编码实现 2.基本原理 (1)getProxy ...

  6. netcore 中的动态代理与RPC实现(微服务专题)

    一.关于RPC的调用 1. 调用者(客户端Client)以本地调用的方式发起调用: 2. Client stub(客户端存根)收到调用后,负责将被调用的方法名.参数等打包编码成特定格式的能进行网络传输 ...

  7. Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题

    Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题 参考文章: (1)Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代 ...

  8. 【手写系列】纯手写实现JDK动态代理

    前言 在Java领域,动态代理应用非常广泛,特别是流行的Spring/MyBatis等框架.JDK本身是有实现动态代理技术的,不过要求被代理的类必须实现接口,不过cglib对这一不足进行了有效补充.本 ...

  9. 深度剖析JDK动态代理机制

    摘要 相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象. 代理模式 使用代理模式必须要让代理类和目标类实现相同的接口,客户端通过 ...

  10. cglib动态代理jar包_Java中的原生动态代理和CGLIB动态代理的原理,我不信你全知道!...

    作者:CarpenterLee cnblogs.com/CarpenterLee/p/8241042.html 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询 ...

最新文章

  1. MySQL where后面的标量子查询使用
  2. Lucene学习总结之七:Lucene搜索过程解析
  3. SAP专家培训之Netweaver ABAP内存管理和内存调优实践
  4. 随机生成1024个数,存入一段内存,用指针实现获取1024个数的最大数地址,最小数地址
  5. apt ubuntu 指定ipv4_macOS 下使用 Docker 搭建 ubuntu 环境
  6. Texlive source
  7. https请求 nginx 不生效_nginx设置https后无法打开网页
  8. Java虚拟机知识点【栈帧】
  9. php smarty入门,smarty教程专题
  10. 微软输入法怎么最小化到托盘_Windows下的五笔输入法哪个最好用?我来推荐几款...
  11. 计算机运行黑屏显示器正常,电脑主机运行正常显示器黑屏怎么办
  12. layer.js 贤心制作的弹出层插件-不仅仅是弹层
  13. 组成原理 - 网卡与HBA卡的区别
  14. kinit 某个账户,提示 Clients credentials have been revoked
  15. 苹果屏保壁纸_神经病手势时钟-手势数字时钟app下载android安卓版ios苹果版
  16. Impala原理简单整理
  17. 【阿里2013实习笔试】找明星
  18. 【怀旧】利用Altair 8800模拟器加载4K Basic解释器(附下载连接)
  19. 用android开发一个识别人形的app,一键切换背景
  20. H3CTE京东翰林讲师指导实验RIP

热门文章

  1. JavaScript 必会的知识点
  2. html、javascript、url特殊字符的转义诠释及使用方法详解
  3. nyoj-----284坦克大战(带权值的图搜索)
  4. Java通过代理服务器访问外部网络
  5. 智能优化算法:鲸鱼优化算法-附代码
  6. 从零基础入门Tensorflow2.0 ----七、34 embedding rnn
  7. 【资源】GIS 竞赛|考试 信息收集
  8. ENVIArcGis——植被覆盖度提取
  9. 【ArcGIS|空间分析】在范围内平均生成点 | 面要素内均匀且规定个数来均匀生成点
  10. yum安装时出现:Cannot retrieve metalink for repository: epel. Please verify its path and try again