自己实现RPC框架(1)

来源:互联网 发布:python sleep用法 编辑:程序博客网 时间:2024/05/22 04:58

1.闲话
好久没写博客了,我想在接下来时间,写一个我自己用java实现的Rpc框架博客,有兴趣的要源码可以加我qq索取(657455400), 今天我只讲下大致实现思路,和介绍我写的基本组件。

2.框架所用知识

1.netty4 : 异步的、事件驱动的网络应用程序框架,我用的原因,高性能io,用法简单。2.javassist : 开源的分析、编辑和创建Java字节码的类库。3.other:gson(json解析),dom4j(xml解析),java反射等。

3.RPC测试

1.首先服务器和客户端都应该有同一份接口public interface LoginService {    public Boolean login(User user);//登陆    public User register();//注册}2.服务器端还得写接口的实现    @Service  //代表是要注册的接口public class LoginServiceImpl implements LoginService {    public Boolean login(User user) {        System.out.println("App>> " + "用户登陆:  username:" + user.getUserName() + " password:" + user.getPassword());        return true;    }    public User register() {        System.out.println("App>> 用户注册");        User user = new User();        user.setUserName(System.currentTimeMillis()+"");        user.setPassword("123456");        return user;    }}3.开启rpc服务器public class Main {    public static void main(String[] args) {        Server server = RPC.getServer(Configuration.class);        server.start();    }}4.客户端public class ClientMain {    public static void main(String[] args) throws Exception {        LoginService service = RPC.waitForProxy(LoginService.class,                Configuration.class);        User user = service.register();        System.out.println("注册成功 " + user);        boolean res = service.login(user);        System.out.println("登录结果: " + res);    }}5.结果调用成功

这里写图片描述

4.大致实现思路

1.首先在netty框架上进行封装,让用法更简单,我这里讲netty封装成类似websocket结构,用法如下图展示:

这里写图片描述

2.制定协议客户端发起远程调用协议:客户端要调用服务器接口的实现类方法,必须传递:接口名,方法名,参数信息。如下json:{        protocol:1, //协议类型(表示要远程调用)        body:{            i_name:"Hello",    ##接口名            m_name:"hello",     ## 方法名称            p:[          # 参数                {},                {}            ]        }}同理服务器回复远程调用协议:{        protocol:1,        body:{            i_name:"Hello",    ##接口名            m_name:"hello",     ## 方法名称            m_return:{},  # 方法返回值        }       }3.服务器开发    这里大致讲解。首先扫描所有的接口实现类。实例化,并用map缓存起来,客户端发来rpc后,根据接口名的方法,找到对应Method,然后invoke此方法,执行完后包装协议并回复客户端。4.客户端开发    也是大致讲解,客户端调用RPC.waitForProxy时,会阻塞干两件事情,第一与服务端建立连接,第二利用javassist动态生成传入接口的实现类,并缓存,两件事成功后,才返回,当调用接口的方法时,才向服务器发起rpc,等待返回结果。

5.总结
这里面还有很多细节问题,后面会一一讲解,其实看源码是最好的,我也不一定能将的很详细。

老生常谈:深圳有爱好音乐的会打鼓(吉他,键盘,贝斯等)的程序员和其它职业可以一起交流加入我们乐队一起嗨。我的QQ:657455400

原创粉丝点击