kubernetes SocketIO客户端和服务之间的网关通信?

zpgglvta  于 2023-03-01  发布在  Kubernetes
关注(0)|答案(2)|浏览(204)

要点

我有一个应用程序运行在基于微服务的架构上(在Kubernetes上)。所有与应用程序外部的通信都通过API Gateway进行。
这意味着来自前端的请求不会直接到达服务,而是必须通过网关。

动机

现在我需要实现一个需要在前端和内部服务之间进行实时通信的特性,但是由于内部服务不对外公开,我需要一种通过网关"路由"实时数据的方法。
我的所有服务都运行在Node.js上,这就是我想使用Socket.IO来实现实时通信的原因。

问题

    • 但如何实现草图中的紫色双箭头?**

所以通常前端客户端会连接到运行Socket. IO的服务器,但是在我的例子中,这个服务器(实时功能服务器)不能从客户端访问(也永远不应该访问),这意味着客户端必须连接到网关,因此网关需要实现一些机制来将所有传入的消息路由到实时服务,反之亦然。

想法

(1)让第二个HTTP服务器监听网关上的事件,并将这些事件发送到实时服务器。在另一个方向,实时服务器将事件发送到网关,然后网关将它们发送到前端。我认为这种方法肯定会起作用,但将所有事件发送两次似乎是多余的。而且它肯定会损害性能?
(2)使用Socket. IO适配器来"在节点之间传递事件",这似乎是正确的方法,因为它是用来"在进程或计算机之间传递消息"的。但是我在开始使用时遇到了问题,因为缺乏文档/示例。我也没有使用Redis(使用适配器需要吗?)
(3)使用socket.io-emitter包,这似乎不是一个好的选择,因为最后一次提交是在3年前。
(4)还有别的吗?

cxfofazt

cxfofazt1#

基本上我是这样设计应用程序的

入口

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-service.像这样,你也可以激活k8s HPA(水平pod自动缩放)来扩展socket.io服务.你必须根据你的k8s版本来改变注解和其他选项(我认为注解service.beta.kubernetes.io/external-traffic: "OnlyLocal"已经被弃用了).

mspsb9vt

mspsb9vt2#

由于内部服务不会暴露给外部,我建议使用隧道。ngrok是一个命令,用于通过任何NAT或防火墙提供到本地主机服务器的即时和安全URL。如果您的服务器通过某个端口暴露套接字服务,请使用ngrok创建反向代理,以暴露您可以连接到前端应用程序的世界。使用此命令非常简单,下面是如何使用它示例:
1.在以下地址Official site注册并下载ngrok文件
1.只需运行以下指令即可使其工作
./ngrok http 3000
1.要使其永久化,您必须创建一个服务并使用文件ngrok.yml以获得最佳配置。
以下是Here的官方文档

相关问题