1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/sakaue-QSRPC

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 6.4 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 05:00 57bb907

Один из основанных на Nacos / Zookeeper высокопроизводительный, лёгкий RPC-фреймворк с автоматической регистрацией расширенных сервисов и использованием пула длинных соединений Netty

  • Использование сервисов обнаружения Nacos / Zookeeper, автоматическая регистрация расширенных сервисов.
  • Поддержка полнодуплексной связи, использование пула TCP-соединений Netty для сетевого ввода-вывода, высокая производительность.
  • Асинхронная и синхронная поддержка отправки сообщений.
  • Автоматическое определение подходящего сервера действий, поддержка распределения сообщений по весу.
  • Поддерживает Snappy, Gzip сжатие.
  • Возможность вторичной упаковки разработки, [удаленный вызов][qsrpc-starter], маршрутизация сообщений, балансировка нагрузки и т. д.
  • Добро пожаловать в изучение и общение~ см. [QSRPC проект технологии выбора и введения].

Maven

<dependency>
    <groupId>com.github.tohodog</groupId>
    <artifactId>qsrpc</artifactId>
    <version>1.3.0</version>
</dependency>

Demo

Сначала настройте Nacos / Zookeeper.

application.properties

#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

Node

    //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;
        }
    });

Client

    //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()));

Test

Запустите [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]

Future

  • Поддержка nacos...
  • AIO...

Краткое введение в выбор технологии и QSRPC проекта

1.TCP-коммуникация

1.1 Режим подключения:

Этот проект использует длинные соединения TCP и полнодуплексную связь (обе стороны могут одновременно получать и отправлять сообщения), что может обеспечить большую пропускную способность и меньшее использование ресурсов соединения. Теоретически, одно соединение может удовлетворить все потребности в общении (см. pool). Если вы используете протокол HTTP/1.1 запрос-ответ, то в один и тот же момент времени только одно сообщение может быть передано через одно и то же соединение, и если имеется большое количество запросов, это может привести к блокировке или необходимости открытия большего количества соединений для решения проблемы.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/sakaue-QSRPC.git
git@api.gitlife.ru:oschina-mirror/sakaue-QSRPC.git
oschina-mirror
sakaue-QSRPC
sakaue-QSRPC
master