iRpc入门

简介

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集群中,且不依赖任何第三方服务

入门

  1. 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);
		
	}
  1. 发布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();
    }
}
  1. 客户度调用服务端方法
@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注解标注之后即可访问.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

於之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值