使用Docker作为微服务的服务注册表

时间:2019-05-27 06:06:49

标签: node.js docker microservices

我已经按照一些教程进行了设置3个微服务(应用程序,产品和反馈)和1个服务注册表的操作。

与Docker合作一段时间后,我觉得服务注册表是多余的。因为Docker可以在通过环境变量相互注入主机名和端口的同时踢实例。

例如在下面的Docker Compose文件中,我将数据库凭据从MySQL微服务传递到Node.js微服务,并且以类似的方式,如果还有其他Node.js微服务,我可以将它们连接起来。

version: '3'

services:

  mysql:
    image: "mysql:5.7"
    container_name: "mysql"
    ports:
      - "6603:3306"
    volumes:
      - ./assets/schema.sql:/docker-entrypoint-initdb.d/init.sql
    environment:
      DATABASE_HOST: mysql
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: database
      MYSQL_USER: mysql
      MYSQL_PASSWORD: password

  products_service:
    build: .
    command: bash -c "/wait && npm start"
    volumes:
      - "./src/:/service/src/"
    image: "node"
    container_name: "products"
    ports:
      - "8080:8080"
    depends_on:
      - mysql
    environment:
      DATABASE_HOST: mysql
      MYSQL_PORT: 3306
      MYSQL_DATABASE: database
      MYSQL_USER: mysql
      MYSQL_PASSWORD: password
      WAIT_HOSTS: mysql:3306
    restart: on-failure

我真的需要在Node.js中对注册表服务进行编码和编程吗?

2 个答案:

答案 0 :(得分:1)

假设您的产品服务暴露了外部端点使用https://myserver/myservice的其余端点。

一段时间后,您的产品服务变得非常流行,您希望在不违反当前合同的情况下进一步扩展它(上述端点)。

要扩展产品服务,您将启动多个实例,这些实例在相同或不同的主机上运行。

跟踪产品服务正在运行多少实例的服务称为发现服务。

这不足以将到达服务端点的外部流量路由到产品服务的所有实例。这就是API网关的工作,它就像反向代理一样。您可以指定诸如循环机制之类的策略,以将流量路由到所有实例。

因此,API网关和服务发现共同为您的服务提供可伸缩性和容错能力。

参考-

https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/architect-microservice-container-applications/direct-client-to-microservice-communication-versus-the-api-gateway-pattern

https://auth0.com/blog/an-introduction-to-microservices-part-3-the-service-registry/

答案 1 :(得分:1)

如果您想对流量负载和服务故障做出反应,那么确实确实需要一些自动化,而不仅仅是组成容器。所有主要的容器管理工具都有一些为您进行服务发现的策略。另外,还有多种方法来进行服务发现(例如心跳和SWIM)。

坦白说,您可以从启动某些服务实例开始,然后为用户服务。但是您将无法对负载和故障做出反应,也无法提高资源效率。那就是k8s之类的工具在这里发光,并为您处理服务发现和资源利用。

查看this对话以了解有关服务发现的更多信息。