JDK动态代理在RPC框架中的应用
2019-06-01 00:00
337 查看
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();
}
}
相关文章推荐
- Java基础:动态代理在RPC框架中应用
- 自定义基于反射 Scoket jdk动态代理 RPC框架
- 【框架】[Spring] 基于Spring框架的Web应用演示(附带cglib工具进行动态代理)
- [教程]Java代理(静态,动态jdk和Cglib)简单应用
- Aop应用原理 JDK动态代理、代理模式与反射
- jdk 动态代理简单应用
- 纯手写一个mybatis的框架(jdk的动态代理)
- SSM框架day01——021——JDK动态代理模式、022-JDK动态代理模式的实现
- Spring AOP 代理实现的两种方式: JDK动态代理 和 Cglib框架动态代理
- 框架学习前基础加强 泛型高级,注解,反射(泛型&注解)应用案例,IOC,Servlet3.0,动态代理,类加载器
- 反射与动态代理的应用(一):在RPC中的使用
- 安卓中IOC框架中所用的动态代理的应用。
- SSM框架day01——023——JDK动态代理时序图流程分析、024——JDK动态代理回调流程分析
- SilverLight企业应用框架设计【四】实体层设计+为客户端动态生成服务代理(自己实现RiaService)
- JDK动态代理与CGLIB动态代理应用及源码解析
- JDK动态代理与CGLIB动态代理应用及源码解析
- 【远程调用框架】如何实现一个简单的RPC框架(三)优化一:利用动态代理改变用户服务调用方式
- 理解动态代理及动态代理在RPC中的应用
- JDK动态代理与CGLIB动态代理应用及源码解析
- 老王讲自制RPC框架.(二.动态代理)