我已经按照一些教程进行了设置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中对注册表服务进行编码和编程吗?
答案 0 :(得分:1)
假设您的产品服务暴露了外部端点使用https://myserver/myservice的其余端点。
一段时间后,您的产品服务变得非常流行,您希望在不违反当前合同的情况下进一步扩展它(上述端点)。
要扩展产品服务,您将启动多个实例,这些实例在相同或不同的主机上运行。
跟踪产品服务正在运行多少实例的服务称为发现服务。
这不足以将到达服务端点的外部流量路由到产品服务的所有实例。这就是API网关的工作,它就像反向代理一样。您可以指定诸如循环机制之类的策略,以将流量路由到所有实例。
因此,API网关和服务发现共同为您的服务提供可伸缩性和容错能力。
参考-
https://auth0.com/blog/an-introduction-to-microservices-part-3-the-service-registry/
答案 1 :(得分:1)
如果您想对流量负载和服务故障做出反应,那么确实确实需要一些自动化,而不仅仅是组成容器。所有主要的容器管理工具都有一些为您进行服务发现的策略。另外,还有多种方法来进行服务发现(例如心跳和SWIM)。
坦白说,您可以从启动某些服务实例开始,然后为用户服务。但是您将无法对负载和故障做出反应,也无法提高资源效率。那就是k8s之类的工具在这里发光,并为您处理服务发现和资源利用。
查看this对话以了解有关服务发现的更多信息。