Один из основанных на Nacos / Zookeeper высокопроизводительный, лёгкий RPC-фреймворк с автоматической регистрацией расширенных сервисов и использованием пула длинных соединений Netty
<dependency>
<groupId>com.github.tohodog</groupId>
<artifactId>qsrpc</artifactId>
<version>1.3.0</version>
</dependency>
Сначала настройте Nacos / Zookeeper.
#nacos
qsrpc.nacos.addr=192.168.0.100:8848
#qsrpc.nacos.srvname=qsrpc
#zookeeper
#qsrpc.zk.ips=127.0.0.1:2181
#qsrpc.zk.path=/qsrpc
#node server
qsrpc.node.ip=127.0.0.1
qsrpc.node.port=19980
qsrpc.node.action=user,order
#qsrpc.node.weight=1
#qsrpc.node.zip=snappy/gzip
#qsrpc.connect.timeout=60000
//open node server 1 (read application.properties)
NodeInfo nodeInfo = NodeRegistry.buildNode();
//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
ServerConfig.RPC_CONFIG.setNacosAddr("192.168.0.100:8848");
ServerConfig.RPC_CONFIG.setNacosServiceName("qsrpc");
// ServerConfig.RPC_CONFIG.setZkIps("127.0.0.1:2181");
// ServerConfig.RPC_CONFIG.setZkPath("/qsrpc");
NodeInfo nodeInfo2 = new NodeInfo();
nodeInfo2.setAction("order");//node server action
nodeInfo2.setIp("127.0.0.1");//node server ip
nodeInfo2.setPort(8848);//nodeserver port
nodeInfo2.setWeight(2);//request weight
//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;
}
});
//async
for (int i = 0; i < 9; i++) {
//Send byte[] based on action
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");
//future
CallFuture<byte[]> callFuture = RPCClientManager.getInstance().sendAsync("user", "user".getBytes());
System.out.println("send [user] FutureResult: " + new String(callFuture.get()));
Запустите [TestConcurrent.java][testjava] (Не открывайте консоль и антивирус 360 и т.д.)
CPU | request | time | qps |
---|---|---|---|
i3-8100(4-core/4-thread) | 100w(8-thread) | 7817ms | 127926 |
i7-8700(6-core/12-thread) | 100w(8-thread) | 3010ms | 332225 |
При 4 ядрах и 4 потоках есть более 120 000 одновременных подключений, фактически будет больше [тестовый снимок экрана 1][testpng] [тестовый снимок экрана 2][testpng2]
Этот проект использует длинные соединения TCP и полнодуплексную связь (обе стороны могут одновременно получать и отправлять сообщения), что может обеспечить большую пропускную способность и меньшее использование ресурсов соединения. Теоретически, одно соединение может удовлетворить все потребности в общении (см. pool). Если вы используете протокол HTTP/1.1 запрос-ответ, то в один и тот же момент времени только одно сообщение может быть передано через одно и то же соединение, и если имеется большое количество запросов, это может привести к блокировке или необходимости открытия большего количества соединений для решения проблемы.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )