首先呢,我们的这个项目是基于netty、动态代理、反射等知识实现的,如果童鞋们对这块内容还有不熟的地方,建议去先了解一下这些知识,再来看这篇文章,我觉得才有意义。
项目结构:
这里有三个module,先说common,它里面主要包含了我们的client和server共同的东西(一会细说),它是以依赖形式在我们的其他两个子项目中的pom.xml里的。server,里面包含了我们的一个服务器,具体的serviceimpl实现的类,client,里面包含了我们的客户端。这两个就是client调用的server的方法(注意这里不是通过rest接口实现的)。这两个项目可以独立部署在服务器上也是可以的。
common
这里的ClassInfo是我们要传递的类的信息,一会大家就很清楚了(悄悄的透露一下,就是下面两个service的方法具体信息)。它是建立我们调用的核心!!!下面两个service就是我们要远程调用他们的实现类的。
[AppleScript] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
package com.rpc.common.enity;
import lombok.Data;
import java.io.Serializable;
@Data
public class ClassInfo implements Serializable {
private String className;
private String methodName;
private Class<?>[] types;
private Object[] objects;
}
|
这个老哥就详细的记录着我们调用方法的接口方法的类名、方法名、参数类型和参数s。奥力给!!
[AppleScript] 纯文本查看 复制代码
|
1
2
3
4
5
|
package com.rpc.common.service;
public interface HelloService {
String helloRPC();
}
|
[AppleScript] 纯文本查看 复制代码
|
1
2
3
4
5
|
package com.rpc.common.service;
ublic interface HiService {
String HiRPC(String name);
}
|
这两个就是普通的接口,就是我们在dubbo框架中熟悉的@Service下面的接口。在dubbo里就是通过这个注册中心注册的。
Server
先看看这两个没啥好说的实现类吧
[AppleScript] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
package com.rpc.server.impl;
import com.rpc.common.service.HelloService;
public class HelloServiceImpl implements HelloService {
@Override
public String helloRPC() {
return "helloRPC";
}
}
package com.rpc.server.impl;
import com.rpc.common.service.HiService;
public class HiServiceImpl implements HiService {
@Override
public String HiRPC(String name) {
return "Hi" + name;
}
}
|
然后就是我们的netty啦,真的是方便又安全的框架!!
[AppleScript] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19 <
|

本文介绍了如何手写一个基于Netty、反射和动态代理的RPC远程调用实现。项目包含三个模块,分别处理公共部分、服务器端和服务调用客户端。讲解了在Netty框架下,如何进行编码、解码,以及如何通过反射和动态代理获取方法信息,完成服务端的调用和客户端的请求过程。文章以一个简单的例子展示了RPC调用的全过程。
最低0.47元/天 解锁文章
584

被折叠的 条评论
为什么被折叠?



