У меня очень трудные времена, пытаясь выполнить эту работу, у меня есть микросервисная архитектура, которая поддерживает несколько областей бизнеса, теперь я хотел бы добавить новый микросервис, который будет предоставлять соединение сокета для обслуживания в реальном времени информацию к приложениям. Проверьте изображение ниже:
Я поделюсь некоторыми аспектами здесь, чтобы узнать, можете ли вы помочь мне исправить эту проблему конфигурации.
Я провел несколько тестов, чтобы определить причину проблемы, я провел тест с прямым подключением к Node API (работающему на сервере) без использования Nginx и ExpressGateway, проверьте Gif под всем работает, как ожидалось:
Посмотрите, как это работает
Он устанавливает соединение «опрос», а затем обновляется до Websocket, что мы хотим, получили сообщения и не сделали любые новые соединения.
Это конфигурация сервера API:
constructor() {
this.app = express();
this.initExpress();
this.initExpressMiddleWare();
this.dvConn = new DAO();
this.server = this.start();
this.io = io().attach(this.server, {
path: `${config.BASE_PATH}`,
origins: '*:*',
transports:['polling', 'websocket'],
serveClient: false
});
this.newSocketUsers = [];
this.io.on('connection', (socket) => {
console.log(`a user connected ${socket.id}`);
const user_id = this.decode_id(socket.handshake.query.user_id).toString();
const socket_id = socket.id;
this.registerConnection(socket_id, user_id);
socket.on('disconnect', () => {
console.log(`a user disconnected ${socket.id}`);
const socket_id = socket.id;
this.unRegisteredConnection(socket_id);
});
});
И это часть клиентского приложения Angular для тестирования этого:
constructor(private http: HttpClient) {
this.httpClient = http;
this.socket = io('http://dev.server.com:3033', {
query: {
user_id: '988379518723645912'
},
transports: ['polling', 'websocket']
});
this.socket.on('reconnect_attempt', () => {
this.socket.io.opts.transports = ['polling', 'websocket'];
});
}
connect(): void {
this.socket.on('connect', () => {
console.log('Opening Connection');
});
}
Теперь проблема возникает, когда это выполняется через Nginx и ExpressGateway, см. Gif ниже, чтобы увидеть, как приложение сначала регистрирует ошибку 502, и оно продолжает опрашивать и никогда не обновляется до WebSocket, делая это с каждым новым отправленным сообщением, которое регистрируется это как новый запрос на опрос:
Посмотрите, как это не сработало
Я сделал домашнее задание и знаю, что на Nginx требуется некоторая конфигурация, это моя конфигурация Nginx .conf:
server {
listen 443 ssl;
client_max_body_size 12m;
client_body_buffer_size 16k;
server_name dv3.synth5.orcasnet.com api.orcasnet.com;
ssl_certificate /etc/nginx/ssl/certificate.crt;
ssl_certificate_key /etc/nginx/ssl/key.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCMsssssss';
location / {
proxy_temp_file_write_size 64k;
proxy_connect_timeout 10080s;
proxy_send_timeout 10080;
proxy_read_timeout 10080;
proxy_buffer_size 64k;
proxy_buffers 16 32k;
proxy_busy_buffers_size 64k;
proxy_redirect off;
proxy_request_buffering off;
proxy_buffering off;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://gateway.domain.net:3020;
}
}
И последняя конфигурация политики ExpressGateway:
socStg:
apiEndpoints:
- socStg
policies:
- cors:
- log:
- action:
message: ${req.method} ${req.originalUrl} ${req.headers}
- proxy:
- action:
serviceEndpoint: socStg
changeOrigin: true
ws: true
timeout: 120000
Я был бы признателен за любую помощь, которую вы можете предоставить мне с этой проблемой, Заранее спасибо.