简介
iRpc项目地址:
- gitee: https://gitee.com/willbeahero/iRpc
- github: https://github.com/BrianApple/iRpc
iRpc是基于Nio通信框架Netty编写的支持同步、异步方法执行的高性能RPC框架;
特点
- 高性能: iRpc底层通信基于NIO网络通信模式,java对象传输基于ProtoBuf序列化之后传输,
- 支持同步异步: 可根据需求选择同步和异步方法调用
- 单机、leader-follower模式可选: iRpc支持单机或leader-follower模式(无需第三方依赖)
- 支持leader-follower模式动态扩容: 基于raft选举算法自举leader,同时支持新iRpc节点动态增加到leader-follower集群中,且不依赖任何第三方服务
入门
- iRpc工具包引入: 客户端、服务端引入iRpc包即可,版本号请按需选择
<dependency>
<groupId>io.github.brianapple</groupId>
<artifactId>iRpc</artifactId>
<version>2.0.3-Release</version>
</dependency>
服务端初始化并建立ABC三节点iRpc服务集群:
/**
* A(BC)
*/
@Test
public void startCluster1_Node1(){
IRpcServerProperty serverProperty = new IRpcServerProperty();
serverProperty.setServerPort("10916");
serverProperty.setHeartbeat("60");
serverProperty.setNodeName("n0");
serverProperty.setGroupName("iRpcGroup");
List<NodeInfo> lits = new ArrayList<NodeInfo>();
NodeInfo node1 = new NodeInfo();
node1.setNode("n0");
node1.setIp("127.0.0.1");
node1.setPort("10916");
lits.add(node1);
NodeInfo node2 = new NodeInfo();
node2.setNode("n1");
node2.setIp("127.0.0.1");
node2.setPort("10917");
lits.add(node2);
NodeInfo node3 = new NodeInfo();
node3.setNode("n2");
node3.setIp("127.0.0.1");
node3.setPort("10918");
lits.add(node3);
serverProperty.setClusterNode(lits);;
new ServerStarter(serverProperty);
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* B(AC)
*/
@Test
public void startCluster1_Node2(){
IRpcServerProperty serverProperty = new IRpcServerProperty();
serverProperty.setServerPort("10917");
serverProperty.setHeartbeat("60");
serverProperty.setNodeName("n1");
serverProperty.setGroupName("iRpcGroup");
List<NodeInfo> lits = new ArrayList<NodeInfo>();
NodeInfo node1 = new NodeInfo();
node1.setNode("n0");
node1.setIp("127.0.0.1");
node1.setPort("10916");
lits.add(node1);
NodeInfo node2 = new NodeInfo();
node2.setNode("n1");
node2.setIp("127.0.0.1");
node2.setPort("10917");
lits.add(node2);
NodeInfo node3 = new NodeInfo();
node3.setNode("n2");
node3.setIp("127.0.0.1");
node3.setPort("10918");
lits.add(node3);
serverProperty.setClusterNode(lits);;
new ServerStarter(serverProperty);
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* C(AB)
*/
@Test
public void startCluster1_Node3(){
IRpcServerProperty serverProperty = new IRpcServerProperty();
serverProperty.setServerPort("10918");
serverProperty.setHeartbeat("60");
serverProperty.setNodeName("n2");
serverProperty.setGroupName("iRpcGroup");
List<NodeInfo> lits = new ArrayList<NodeInfo>();
NodeInfo node1 = new NodeInfo();
node1.setNode("n0");
node1.setIp("127.0.0.1");
node1.setPort("10916");
lits.add(node1);
NodeInfo node2 = new NodeInfo();
node2.setNode("n1");
node2.setIp("127.0.0.1");
node2.setPort("10917");
lits.add(node2);
NodeInfo node3 = new NodeInfo();
node3.setNode("n2");
node3.setIp("127.0.0.1");
node3.setPort("10918");
lits.add(node3);
serverProperty.setClusterNode(lits);
new ServerStarter(serverProperty);
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
客户端初始化并建立与ABC集群连接
@Test
public void clientStartedByBean(){
IRpcClientProperty clientProperty = new IRpcClientProperty();
clientProperty.setCluster(true);
clientProperty.setRetryTimes(3);//default 3 times
List<NodeInfo> lits = new ArrayList<NodeInfo>();
NodeInfo node1 = new NodeInfo();
node1.setIp("127.0.0.1");
node1.setPort("10916");
lits.add(node1);
NodeInfo node2 = new NodeInfo();
node2.setIp("127.0.0.1");
node2.setPort("10917");
lits.add(node2);
NodeInfo node3 = new NodeInfo();
node3.setIp("127.0.0.1");
node3.setPort("10918");
lits.add(node3);
clientProperty.setServerNode(lits);
@SuppressWarnings("unused")
ClientStarter clientStarter = new ClientStarter(clientProperty);
}
- 发布iRpc服务: @IRPCService注解添加到你要发布的iRcp类或方法中,则该类中所有的方法或当前方法即可通过iRcp客户端访问,iRpc默认提供了以下服务
/**
* Description:
* * @author hejuanjuan
* * @date 2021/2/25
*/
@IRPCService
public class RPCExportServiceImpl{
public String test(String str) {
return "hello "+str;
}
public int test(ArrayList<String> args){
return args.size();
}
}
- 客户度调用服务端方法
@Test
public void clientStartedByBean(){
IRpcClientProperty clientProperty = new IRpcClientProperty();
clientProperty.setCluster(true);
clientProperty.setRetryTimes(3);//default 3 times
List<NodeInfo> lits = new ArrayList<NodeInfo>();
NodeInfo node1 = new NodeInfo();
node1.setIp("127.0.0.1");
node1.setPort("10916");
lits.add(node1);
NodeInfo node2 = new NodeInfo();
node2.setIp("127.0.0.1");
node2.setPort("10917");
lits.add(node2);
NodeInfo node3 = new NodeInfo();
node3.setIp("127.0.0.1");
node3.setPort("10918");
lits.add(node3);
clientProperty.setServerNode(lits);
@SuppressWarnings("unused")
ClientStarter clientStarter = new ClientStarter(clientProperty);
while(true) {
/**
* 同步消息发送
*/
Class<? >[] classType = new Class[]{String.class};
Object[] argsData = new Object[]{"world"};
ResponseData ret = MessageSender.synBaseMsgSend(false,
"iRpc.rpcService.RPCExportServiceImpl",
"test",
classType,
argsData,
10000);
System.out.println("客户端同步收到数据:"+ret.getData());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
执行结果:
总结
iRpc的使用非常简单,引入相关jar包之后通过服务端和客户端启动类即可启动相关服务,同时服务端把需要发布为iRpc远程调用的方法使用@IRPCService注解标注之后即可访问.