Связь SocketIO со шлюзом между клиентом и сервисом? - PullRequest
8 голосов
/ 23 апреля 2020

Gist

У меня есть приложение, которое работает на архитектуре на основе микросервиса (в Kubernetes). Все взаимодействие с приложением и извне происходит через API Gateway .

. Это означает, что запросы от моего интерфейса не go напрямую к сервисам, но они должны go через шлюз.

Мотив

Теперь мне нужно реализовать функцию, которая требует связи в реальном времени между внешним интерфейсом и внутренней службой. Но поскольку внутренняя служба не подвержена внешним воздействиям, мне нужен способ «маршрутизировать» данные в реальном времени через шлюз.

Все мои службы работают на Node.js, и именно поэтому я хочу используйте Socket.IO для осуществления связи в реальном времени.

architecture

Проблема

Но как реализовать фиолетовую двойную стрелку из эскиза?

Таким образом, обычно клиент внешнего интерфейса подключается к серверу, на котором работает Socket.IO. Но в моем случае этот сервер (сервер функций реального времени) недоступен с клиента (и никогда не должен быть), что означает, что клиент должен подключиться к шлюзу. Таким образом, шлюз должен реализовать некоторый механизм для маршрутизации всех входящих сообщений в службу реального времени и наоборот.

Идеи

(1) Второй сервер HTTP прослушивает события на шлюзе и отправляет те события на сервер в реальном времени. В другом направлении сервер реального времени отправляет события на шлюз, который затем отправляет их на внешний интерфейс. Я думаю, что этот подход определенно сработает, но, кажется, излишне все излучать дважды. И это определенно повредит производительности?

(2) Используйте адаптер Socket.IO для " передачи события между узлами ", что выглядит как правильный путь к go, потому что он используется «передавать сообщения между процессами или компьютерами». Но у меня проблемы с началом работы из-за отсутствия документации / примеров. Я также не использую Redis (нужно ли использовать адаптер?)

(3) Используйте пакет socket.io-emitter , который, похоже, не является хорошим вариантом с момента последнего коммит был от 3 лет go.

(4) Что-то еще?

Ответы [ 2 ]

3 голосов
/ 27 апреля 2020

Хорошо, в основном я разработал приложение вот так

Ingress

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: centsideas-ingress
  annotations:
    kubernetes.io/tls-acme: 'true'
    kubernetes.io/ingress.class: 'nginx'
    cert-manager.io/cluster-issuer: letsencrypt
spec:
  tls:
    - hosts:
        - centsideas.com
        - api.centsideas.com
      secretName: centsideas-tls
  rules:
    - host: api.centsideas.com
      http:
        paths:
          - path: /socker.io
            backend: 
             serviceName: socket-service
             servicePort: 8000
          -  path: /
             backend:
              serviceName: centsideas-gateway
              servicePort: 3000
    - host: centsideas.com
      http:
        paths:
          - backend:
              serviceName: centsideas-client
              servicePort: 8080

Сервис

apiVersion: v1
kind: Service
metadata:
 name: socket-service
 annotations:
  service.beta.kubernetes.io/external-traffic: "OnlyLocal" 
 namespace: namespace
spec:
 sessionAffinity: ClientIP
 ports:
  - name: ws-port
    protocol: TCP
    port: 8000
 type: ClusterIP
 selector:
  service: ws-api

Затем вы создаете развертывание для развертывания ws-сервиса. Таким образом, вы также можете активировать HPA k8s (горизонтальное автоматическое масштабирование модуля) для увеличения сервиса socket.io. Вы должны изменить аннотации и другие параметры в зависимости от версии k8s (я думаю, что аннотация service.beta.kubernetes.io/external-traffic: "OnlyLocal" устарела).

0 голосов
/ 27 апреля 2020

Поскольку внутренняя служба не подвержена внешним воздействиям, я рекомендую использовать туннель. ngrok - это команда для мгновенного и безопасного URL-адреса вашего локального сервера через любой NAT или брандмауэр. Если ваш сервер предоставляет службу сокетов через определенный порт, используйте ngrok , чтобы создать обратный прокси-сервер и открыть для себя мир, с которым вы можете подключиться к вашему веб-приложению. Использовать эту команду очень просто, вот пример ее использования:

  1. Зарегистрируйтесь и загрузите файл ngrok по следующему адресу Официальный сайт
  2. Просто запустите следующую инструкцию, чтобы она заработала

    . / Ngrok http 3000

  3. Чтобы сделать ее постоянной, необходимо создать службу и использовать файл ngrok.yml для лучшей конфигурации.

Вот официальная документация Здесь

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