JDK动态代理在RPC框架中的应用

栏目: Java · 发布时间: 5年前

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

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();
    }
}

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址: https://www.linuxidc.com/Linux/2019-06/158897.htm


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

天涯虚拟社区

天涯虚拟社区

刘华芹 / 民族出版社 / 2005-11 / 23.00元

网络空间很复杂,好多人并不完全了解或者只是了解到一些皮毛。比如说好多人对于见网友一事总是抱着浪漫或者暖昧的想法,而事实却并不总是想象的那样。作者在做虚拟社区研究甚至是在有这个想法之前并不常呆在网上,互联网对于作者来说就是查查资料、收发信年、看看新闻的工具。担是看着越来越多的人把时间花在网上,一处文化上的直觉告诉作者:有一种新的生活方式产生了。强烈的好奇心驱使着作者走到了网上,走到了天涯虚拟社区,并......一起来看看 《天涯虚拟社区》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具