基于netty,zookeeper开发的RPC框架,NIO设计

385 阅读1分钟

logo

  • 使用zookeeper服务发现
  • 使用长连接TCP池,netty作为网络IO,支持全双工通信
  • 消息发送支持异步/同步,NIO
  • 自动选择符合action节点服务器,支持权重分发消息
  • 欢迎学习交流~
    ad

Demo

Node

    //open node server 1
    NodeInfo nodeInfo = NodeRegistry.buildNode();//read application.properties
    //sync callback
    NodeLauncher.start(nodeInfo, new MessageListener() {
        @Override
        public byte[] onMessage(Async async, byte[] message) {
        return ("Hello! node1 callback -" + new String(message)).getBytes();
        }
    });

    //open node server 2
    NodeInfo nodeInfo2 = new NodeInfo();
    nodeInfo2.setZkIps("127.0.0.1:2181");
    nodeInfo2.setZkPath("/qsrpc");
    nodeInfo2.setAction("order");
    nodeInfo2.setIp("127.0.0.1");
    nodeInfo2.setPort(8848);
    nodeInfo2.setWeight(2);

    //async callback
    NodeLauncher.start(nodeInfo2, new MessageListener() {
        @Override
        public byte[] onMessage(final Async async, final byte[] message) {
        new Thread(new Runnable() {
            @Override
            public void run() {
            async.callBack(("Hello! node2 callback -" + new String(message)).getBytes());
            }
        }).start();
        return null;
        }
    });

Client

    //async
    for (int i = 0; i < 9; i++) {
        RPCClientManager.getInstance().sendAsync("user", "user".getBytes(),
            new Callback<byte[]>() {
            @Override
            public void handleResult(byte[] result) {
                System.out.println("send [user] Result: " + new String(result));
            }

            @Override
            public void handleError(Throwable error) {
                error.printStackTrace();
            }
            });
    }
    System.out.println("send [user] Done");

    //sync
    for (int i = 0; i < 9; i++) {
        Thread.sleep(1000);
        byte[] msg_cb = RPCClientManager.getInstance().sendSync("order", "order".getBytes());
        System.out.println("send [order] Result: " + new String(msg_cb));
    }
    System.out.println("send [order] Done");

application.properties

qsrpc.zk.ips=127.0.0.1:2181
qsrpc.zk.path=/qsrpc

qsrpc.node.ip=127.0.0.1
qsrpc.node.port=19980
qsrpc.node.action=user,order
qsrpc.node.weight=1

Maven

	<repositories>
		<repository>
		    <id>jitpack.io</id>
		    <url>https://jitpack.io</url>
		</repository>
	</repositories>

	<dependency>
	    <groupId>com.github.tohodog</groupId>
	    <artifactId>QSRPC</artifactId>
	    <version>1.0.0</version>
	</dependency>

项目地址: github.com/tohodog/QSR…