我需要微服务吗?
Do I need a microservice?
我正在学习微服务架构,我不太清楚什么时候应该将一个功能包装到微服务中,什么时候最好将它放在一个单独的组件中,将组件安装在依赖的微服务中。
示例:
Symfony 安全 ACL 组件 (symfony/security-acl
)。我可以将它包装成一个微服务,它只会在 Symfony 安全 ACL API 的顶部以 REST API 的形式添加一个抽象层。除此之外,我将需要一个服务代理组件,它安装在依赖的微服务上并提供对 ACL 微服务的访问。重点是什么?在需要的地方安装 symfony/security-acl
并给它单独的数据库连接不是更容易吗?
支付系统。在这种情况下,更清楚的是它需要包装到微服务中。它包含大量的业务逻辑,只是要求分离。
基本上问题是:
在决定将一个软件放入微服务而不是模块时,我应该考虑什么标准?
将symfony/security-acl
包装成一个非常瘦的微服务是不是一个好主意(微服务瘦一点不好)?
根据我的经验,微服务的非官方、非科学原因:
- 水平可扩展性:如果您的服务不能均匀扩展,您可能希望有 10 台服务器使用服务 A,但只有 1 台服务器使用服务 B。
- 更快的部署:每个服务都有一个单独的部署过程允许您按需部署较小的部分,而不是仅仅因为一个小的变化就部署一个大的东西。
- 独立的开发风格和生命周期:当一个项目做大时,你可能希望让其他人接手。这显然适用于比模块具有更少依赖性的微服务。贡献者和团队可以随心所欲地开发他们想要的方式。每个团队都可以使用不同的语言、不同的管道、测试工具、编辑器等。唯一的共同点是结果的格式、协议和约定 API.
- 更简单的依赖管理:升级或更改依赖于其他库的库可能会导致复杂化,因为显然不会同时更新所有依赖项,并且会有不兼容。
- 更清晰 API:记录所有 public 类 和函数可能是一场噩梦。另一方面,API 文档不完整或过时是放弃项目的原因。微服务在这方面没有提供任何开箱即用的东西,但接口定义明确,通常是 URL 端点和 HTTP 方法。如果您遵循 REST 范式,这会变得更容易。
在您的特定情况下,很难说要使用什么,因为您没有提供足够的上下文。一些相关问题:
- 你在和团队一起开发吗?
- 这是框架的一部分吗?
- 模块的依赖项是什么?
- 它的设计是否考虑了对数据库的并行访问?
我正在学习微服务架构,我不太清楚什么时候应该将一个功能包装到微服务中,什么时候最好将它放在一个单独的组件中,将组件安装在依赖的微服务中。
示例:
Symfony 安全 ACL 组件 (
symfony/security-acl
)。我可以将它包装成一个微服务,它只会在 Symfony 安全 ACL API 的顶部以 REST API 的形式添加一个抽象层。除此之外,我将需要一个服务代理组件,它安装在依赖的微服务上并提供对 ACL 微服务的访问。重点是什么?在需要的地方安装symfony/security-acl
并给它单独的数据库连接不是更容易吗?支付系统。在这种情况下,更清楚的是它需要包装到微服务中。它包含大量的业务逻辑,只是要求分离。
基本上问题是:
在决定将一个软件放入微服务而不是模块时,我应该考虑什么标准?
将
symfony/security-acl
包装成一个非常瘦的微服务是不是一个好主意(微服务瘦一点不好)?
根据我的经验,微服务的非官方、非科学原因:
- 水平可扩展性:如果您的服务不能均匀扩展,您可能希望有 10 台服务器使用服务 A,但只有 1 台服务器使用服务 B。
- 更快的部署:每个服务都有一个单独的部署过程允许您按需部署较小的部分,而不是仅仅因为一个小的变化就部署一个大的东西。
- 独立的开发风格和生命周期:当一个项目做大时,你可能希望让其他人接手。这显然适用于比模块具有更少依赖性的微服务。贡献者和团队可以随心所欲地开发他们想要的方式。每个团队都可以使用不同的语言、不同的管道、测试工具、编辑器等。唯一的共同点是结果的格式、协议和约定 API.
- 更简单的依赖管理:升级或更改依赖于其他库的库可能会导致复杂化,因为显然不会同时更新所有依赖项,并且会有不兼容。
- 更清晰 API:记录所有 public 类 和函数可能是一场噩梦。另一方面,API 文档不完整或过时是放弃项目的原因。微服务在这方面没有提供任何开箱即用的东西,但接口定义明确,通常是 URL 端点和 HTTP 方法。如果您遵循 REST 范式,这会变得更容易。
在您的特定情况下,很难说要使用什么,因为您没有提供足够的上下文。一些相关问题:
- 你在和团队一起开发吗?
- 这是框架的一部分吗?
- 模块的依赖项是什么?
- 它的设计是否考虑了对数据库的并行访问?