Skip to content

Repository files navigation

simplerpc-java

介绍

一个由Java编写的RPC项目,使用简单,支持同步以及异步调用。
程序使用Netty作为通讯基础组件,支持可替换序列化组件(暂时支持Kryo)。

Build

本程序在 JDK8(Oracle JDK 8 build 1.8.0_231-b11) 平台编写和测试,使用默认Gradle Wrapper构建。

./gradlew simplerpc:clean simplerpc:jar

How to use

演示文件
|-com
|-jelipo
|-test
> Main.java > People.java
> ProxyInterface.java
> ProxyInterfaceImpl.java
People.java 普通的传输对象
publicclassPeople {
privateStringname;
privateintage;
//如果RPC要传输一个对象,这么此对象必须要有个空构造方法。publicPeople() {}
publicPeople(Stringname, intage) {
this.name = name;
this.age = age;
}
...getterandsetter...
}
ProxyInterface.java 接口
@Rpc//在RPC接口上添加@Rpc注解publicinterfaceProxyInterface {
StringgetUserData(Peoplepeople);
CompletableFuture<People> getUserDataAsysn(Stringinfo);
}
ProxyInterfaceImpl.java 实现类
@RpcImpl//在实现类上添加@RpcImpl注解publicclassProxyInterfaceImplimplementsProxyInterface {
@OverridepublicStringgetUserData(Peoplepeople) {
return"Sync: Name:" + people.getName() + ". Age:" + people.getAge();
}
@OverridepublicCompletableFuture<People> getUserDataAsysn(Stringinfo) {
returnCompletableFuture.supplyAsync(() -> {
String[] split = info.split(",");
returnnewPeople(split[0], Integer.parseInt(split[1]));
});
}
}
Server端初始化
//设置端口intport = 18080;
//启动RPC服务器RpcServerrpcServer = newRpcServer()
.port(port)
//扫描被注解的类的路径
.classesPath("com.jelipo.test")
.start();
Client 端初始化
//启动RPC客户端RpcClientrpcClient = newRpcClient()
//连接RPC服务
.hostAndPort("localhost", port)
.classesPath("com.jelipo.test")
.connect();
Client 端同步调用RPC方法
//从client中获取RPC接口的代理类。
ProxyInterface proxyInterfaceImpl = rpcClient.getRpcImpl(ProxyInterface.class);
People people = new People("小丽", 18);
//支持的参数和返回类型包括Java的基本类型、String、只包含基本类型(可嵌套)且有空构造方法的POJO类.
String result = proxyInterfaceImpl.getUserData(people);
System.out.println(result);
Client 端异步调用RPC方法
ProxyInterfaceproxyInterfaceImpl = rpcClient.getRpcImpl(ProxyInterface.class);
CompletableFuture<People> completableFutureResult = proxyInterfaceImpl.getUserDataAsysn("老王,35");
completableFutureResult.whenComplete((people1, throwable) -> {
System.out.println("Async: Name " + people1.getName() + " Age " + people1.getAge());
});
//当异步调用远程方法,远程方法抛出异常时的处理。CompletableFuture<People> exceptionResult = proxyInterfaceImpl.getUserDataAsysn("不知道老王几岁");
exceptionResult.whenComplete((people2, throwable) -> {
System.out.println(people2);
}).exceptionally(throwable -> {
throwable.printStackTrace();
returnnull;
});

等待添加

  • 注册中心支持(暂时未定)
  • 更多的序列化支持(初步计划JSON和Hessian)
  • 更多的网络协议支持(为了网络兼容性使用HTTP)
  • 支持方法级别的Config注解配置(如超时设置、指定Server等)
  • 对于Netty的长连接使用多个连接保证稳定性

About

⚡使用Java实现的RPC

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages