Как настроить балансировщик нагрузки Nginx между клиент-сервером на основе сокета? - PullRequest
0 голосов
/ 12 июля 2020

Я реализовал два клиентских и серверных приложения, которые взаимодействуют через сокет (rosocket). Теперь я хочу запустить множество серверов и настроить Nginx в качестве балансировщика нагрузки. У меня проблема со второй частью

Сервер был реализован на основе Spring Boot 127.0.0.1: 7002 :

@ConnectMapping(Credential.CLIENT_LOGIN_TO_MANAGER)
public void connectClient(RSocketRequester requester ) {
     log.info("New client");
}

Клиент ip / порт 127.0.0.1 : 8020 :

RSocketRequester.Builder rBuilder;
...
rBuilder.setupRoute(Credential.CLIENT_LOGIN_TO_MANAGER)
        .rsocketFactory(config)
        .connectTcp(ip, port)
        .block(); 

Nginx 1.18 файл: sites-enabled / default:

upstream task-api {
    server 127.0.0.1:7002;
}
 
server {
    listen 8020;
    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_pass http://task-api;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Прямое соединение клиента и сервера работает правильно. Понятия не имею, как решить проблему.

Nginx журнал:

127.0.0.1 - - [12/Jul/2020:17:36:28 +0200] "\x00\x00h\x00\x00\x00\x00\x05\x00\x00\x01\x00\x00\x00\x00N \x00\x01_\x90'message/x.rsocket.composite-metadata.v0\x10application/cbor\x00\x00\x1A\xFE\x00\x00\x16\x15login-client-endpoint" 400 166 "-" "-"

Клиентский журнал:

java.nio.channels.ClosedChannelException
2020-07-12 17:36:29.815  INFO 82370 --- [           main] pl.lasota.crm.plugins.ccc.TaskClientApi  : Started TaskClientApi in 1.984 seconds (JVM running for 2.621)

Журнал сервера:

2020-07-12 17:36:06.728  INFO 82210 --- [           main] o.s.b.rsocket.netty.NettyRSocketServer   : Netty RSocket started on port(s): 7002
2020-07-12 17:36:06.744  WARN 82210 --- [           main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2020-07-12 17:36:06.779  INFO 82210 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8081 (http) with context path ''
2020-07-12 17:36:06.782  INFO 82210 --- [           main] pl.lasota.crm.cfa.server.TaskServerApi   : Started TaskServerApi in 2.576 seconds (JVM running for 3.261)

1 Ответ

0 голосов
/ 12 июля 2020

Я нашел решение. Нужно только изменить тип транспорта с TCP на Websocket. Для сервера Spring Boot:

spring.rsocket.server.port=7002
spring.rsocket.server.transport=websocket

и для клиента:

rBuilder.setupRoute(Credential.CLIENT_LOGIN_TO_MANAGER)
        .rsocketFactory(config)
        .connectWebSocket(URI.create("http://127.0.0.1:8020"))
        .block();

Я не уверен, что можно настроить nginx для решения с помощью TCP. Может еще кто найдет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...