JDK动态代理在RPC框架中的应用
RPC框架中一般都有3个角色:服务提供者、服务消费者和注册中心。服务提供者将服务注册到注册中心,服务消费者从注册中心拉取服务的地址,并根据服务地址向服务提供者发起RPC调用。动态代理在这个RPC调用的过程中有什么作用?对于服务消费者,一般只会依赖服务接口,而服务的具体实现是在服务提供者这一端的,服务消费者和服务提供者分别部署在不同的机器上,服务消费者调用接口中的方法时怎么能够得到结果呢?JDK的动态代理就派上用场了。服务消费者使用JDK的动态代理技术,可以创建接口的代理对象,并在回调函数中将自己要调用的接口名称、方法签名信息通过http或者tcp的方式发送给服务提供者,服务提供者再通过反射的方式调用本地的服务,最后将结果通过http或tcp的方式返回给消费者。
下面是一个简单的演示程序:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.HashMap;
import java.util.Map; /**
* 动态代理在RPC中的使用
*
* @author syj
*/
public class JDKProxyTest { // --------------------------- 模拟RPC客户端 --------------------------- // 客户端依赖服务端的接口(实现类在服务端)
private static IUserService userService; public static void main(String[] args) {
// 根据接口创建代理对象
userService = (IUserService) Proxy.newProxyInstance(
JDKProxyTest.class.getClassLoader(),
new Class[]{IUserService.class},
new InvocationHandler() {
// 在回调方法模拟进行RPC调用(通过http或者tcp与服务端通信)
@Override
public Object invoke(Object proxy, Method method, Object[] params) throws Throwable {
return rpcInvoke(IUserService.class.getSimpleName(), method.getName(), method.getParameterTypes(), params);
}
}
);
// 本地调用
String result = userService.sayHello("hello");
System.out.println(">>>> result =" + result);
} // --------------------------- 模拟RPC服务端 --------------------------- /**
* 反射调用
*
* @param methodName 方法名称
* @param parameterTypes 方法参数类型
* @param parameters 方法参数
* @return
*/
private static Object rpcInvoke(String interfaceName, String methodName, Class<?>[] parameterTypes, Object[] parameters) {
Object result = null;
try {
// 根据接口名称从Bean容器中获取Bean实例
Object serviceBean = beanMap.get(interfaceName);
// 反射调用
Class<?> serviceClass = serviceBean.getClass();
Method method = serviceClass.getMethod(methodName, parameterTypes);
method.setAccessible(true);
// 得到调用结果
result = method.invoke(serviceBean, parameters);
} catch (Exception e) {
e.printStackTrace();
}
return result;
} // 模拟Bean容器, key为接口名称, value为bean实例
private static Map<String, Object> beanMap = new HashMap<String, Object>() {{
put("IUserService", new UserServiceImpl());
}};
}
接口(服务提供者和服务的消费者都会依赖该接口):
public interface IUserService {
String sayHello(String content);
}
服务提供者实现类:
public class UserServiceImpl implements IUserService {
@Override
public String sayHello(String content) {
return content + "::" + System.currentTimeMillis();
}
}
其实,JDK的动态代理技术,不仅可以应用在RPC框架中,也可以应用在所有基于客户端和服务端通信的架构中,比如微服务架构中的注册中心、配置中心、消息中心等。
JDK动态代理在RPC框架中的应用的更多相关文章
- 017 Java中的静态代理、JDK动态代理、cglib动态代理
一.静态代理 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. 静态代理由业务实现类.业务代理类两部分组成.业务实现类负责实现主要的业务方法,业 ...
- 代理模式(静态代理、JDK动态代理原理分析、CGLIB动态代理)
代理模式 代理模式是设计模式之一,为一个对象提供一个替身或者占位符以控制对这个对象的访问,它给目标对象提供一个代理对象,由代理对象控制对目标对象的访问. 那么为什么要使用代理模式呢? 1.隔离,客户端 ...
- 转:JDK动态代理为什么必须用接口以及与CGLIB的对比
参考链接: JDK动态代理为什么必须用接口以及与CGLIB的对比 文章中提到:试验了JDK动态代理与CGLIB动态代理.从Spring的AOP框架介绍中得知对于使用接口的类,Spring使用JDK动态 ...
- 从静态代理,jdk动态代理到cglib动态代理-一文搞懂代理模式
从代理模式到动态代理 代理模式是一种理论上非常简单,但是各种地方的实现往往却非常复杂.本文将从代理模式的基本概念出发,探讨代理模式在java领域的应用与实现.读完本文你将get到以下几点: 为什么需要 ...
- JDK动态代理、CGLIB动态代理详解
Spring的AOP其就是通过动态代理的机制实现的,所以理解动态代理尤其重要. 动态代理比静态代理的好处: 1.一个动态代理类可以实现多个业务接口.静态代理的一个代理类只能对一个业务接口的实现类进行包 ...
- 深度剖析java中JDK动态代理机制
https://www.jb51.net/article/110342.htm 本篇文章主要介绍了深度剖析java中JDK动态代理机制 ,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定 ...
- SpringBoot27 JDK动态代理详解、获取指定的类类型、动态注册Bean、接口调用框架
1 JDK动态代理详解 静态代理.JDK动态代理.Cglib动态代理的简单实现方式和区别请参见我的另外一篇博文. 1.1 JDK代理的基本步骤 >通过实现InvocationHandler接口来 ...
- 浅谈Spring中JDK动态代理与CGLIB动态代理
前言Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式, ...
- 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring JDK动态代理
JDK 动态代理是通过 JDK 中的 java.lang.reflect.Proxy 类实现的.下面通过具体的案例演示 JDK 动态代理的使用. 1. 创建项目 在 MyEclipse 中创建一个名称 ...
随机推荐
- ashx 文件的运用
ASP.NET中有一种这样格式的文件ashx文件,作什么用的呢?如果你想创建一个ASP.NET文件,它不是aspx文件,它能动态的返回一个图片.XML文件或其他非HTML文件.那就使用ashx文件了. ...
- typescript 模块
模块:模块可以帮助开发者将代码分割为重用的单元.开发者可以自己决定将模块中的哪些资源(类,方法,变量)暴露出去供外部使用,哪些资源只在模块内使用 在ts里面,一个文件就是一个模块,并没有什么特殊的标识 ...
- SQL进阶系列之0窗口函数
窗口函数 What's 窗口函数? 窗口函数也称为OLAP(OnLine Analytical Processing)函数,目前MySQL还不支持. 窗口函数的语法 <窗口函数> OVER ...
- Bicoloring (并查集/二分图)
题目链接 题意: m个查询,每个查询输入a b,表示 顶点a b之间涂色. 规定只能涂颜色0 或者颜色 1,一个节点相连的边 必须涂成相同的颜色. 问 ,输入m组 a b之后,会不会犯规. 思路: 判 ...
- K-D树详解
K-D树最近邻算法https://blog.csdn.net/image_fzx/article/details/80624968 一般说来,索引结构中相似性查询有两种基本的方式: 一种是范围查询,范 ...
- 透析C/S和B/S结构
C/S又称Client/Server或客户/服务器模式.服务器通常采用高性能的PC.工作站或小型机,并采用大型数据库系统,如Oracle.Sybase.Informix或 SQL Server.客户端 ...
- 浅析 pagehelper 分页
之前项目一直使用的是普元框架,最近公司项目搭建了新框架,主要是由公司的大佬搭建的,以springboot为基础.为了多学习点东西,我也模仿他搭了一套自己的框架,但是在完成分页功能的时候,确遇到了问题. ...
- Tensorflow细节-P194-组合训练数据
import tensorflow as tf files = tf.train.match_filenames_once("data.tfrecords-*") filename ...
- cocoapods安装错误的原因
gem 可以理解为管理RUBY库和程序包的查找,安装,升级和卸载是个非常好用的工具. gem install cocoapods过程中出现错误的问题.1.gem的源设置错误应该参照,下面来执行gem ...
- Distributed PostgreSQL on a Google Spanner Architecture – Storage Layer
转自:https://blog.yugabyte.com/distributed-postgresql-on-a-google-spanner-architecture-storage-layer/ ...