将单体应用拆分为微服务
Posted
技术标签:
【中文标题】将单体应用拆分为微服务【英文标题】:Splitting monolith into microservices 【发布时间】:2016-09-28 10:35:16 【问题描述】:我有一个支持订购的现有 Web 服务,它有多个操作(大约 20 个)。这是一个支持排序功能的单一网络服务。它与多个其他服务交互以提供订购功能。
由于此应用程序中有很多业务功能,并且由 10 名成员团队提供支持,我相信它是一个整体(尽管我认为没有硬性规定来定义什么是整体)。
我们计划将应用程序部署在云代工环境中,并且我们计划将应用程序拆分为 2-3 个微服务,主要是为了使它们能够独立扩展。
用于搜索产品的前几个 api 通常具有更多的点击数,而支持实际订单提交的 api 获得的点击数少于 5%。因此,与订单提交 api 相比,产品搜索 api 的实例数应该显着增加。
虽然我不确定我们是否可以根据子域进行拆分(我已经阅读过应该是基础),但我们正在考虑根据前面解释的调用顺序来拆分它们。
我还读到微服务应该精心设计而不是编排。然而,为了确保我们现有的消费者不受影响,我认为我们应该公开一个 api 层来协调对这些微服务的调用。是否提供 api 网关,确保消费者最终不会调用多个微服务并提供抽象层的正常方法?
这似乎是编排而不是编排 - 虽然我并不热衷于理论方面,但我想了解在企业世界中为这个问题陈述所追求的不同解决方案。
【问题讨论】:
不要拆分搜索和更新/创建! API 使用差异不是拆分的好理由。 【参考方案1】:微服务的好处
独立部署和扩展 更容易“推理” 关注点分离 单一职责 (微)面向服务的架构我建议根据域拆分您的服务。这是一种合乎逻辑且有效的方法,使其成为一个简单的起点。您的单体包结构可能已经以这种方式组织,这进一步简化了重构。
API 网关
典型的 Spring Cloud 方法是在网络边缘使用 Zuul 代理,它接收来自客户端(Web、移动设备等)的请求并将它们路由到位于防火墙后面的微服务。客户端仅与单个域交互,并且开箱即用地处理 CORS。
资源:
API Gateway Pattern Routing and Filtering【讨论】:
谢谢@punkrocker27ka!如果我有 3 个微服务暴露 6 个不同的端点,Zuul 代理层会将所有 6 个端点暴露给消费应用程序并将请求路由到适当的微服务吗? Zuul 代理层是否提供缓存、策略管理(API 调用序列)和转换(一些现有消费者需要 xml 支持而新客户需要休息支持)功能? 代理只是将请求代理到微服务。您的微服务如何处理请求取决于您。对于 XML 和“休息”的支持。我猜你的意思是 XML 或 JSON。这取决于请求的“Accept”-Header,应该在您的微服务中处理,而不是由 zuul。 API 网关用于在后台隐藏架构,以便您能够将逻辑逐步提取到微服务中。 @PunterVicky Zuul 代理通常通过模式匹配 URL 来工作。例如,Web 浏览器客户端对端点 /api/resource1/customers 以及 /api/resource2/suppliers 进行 HTTP 调用。您将根据 URL 编写路由规则。 /api/resource1/** = 10.0.0.101 和 /api/resource2/** = 10.0.0.102 这是一个简单的例子,但你明白了。 Zuul 将根据您实现的配置路由请求。 Web 浏览器客户端对单独的服务一无所知,这对它们有好处,但您可以随意拆分和组织服务 @PunterVicky 缓存不在 Zuul 的范围内,但可以轻松地串联实现。要基于 XML 或 JSON 路由请求,您可以在 URL 或 HttpRequest 中指定,并编写处理该请求的规则。检查文档以获取详细信息。以上是关于将单体应用拆分为微服务的主要内容,如果未能解决你的问题,请参考以下文章