将单体应用拆分为微服务时如何定义 API 网关 URL
Posted
技术标签:
【中文标题】将单体应用拆分为微服务时如何定义 API 网关 URL【英文标题】:How to define API gateway URLs when splitting a monolith into microservices 【发布时间】:2018-11-13 15:45:32 【问题描述】:我们正在将单体应用程序拆分为微服务。这将是一个渐进的过程,这意味着最初我们将从 2 个微服务开始,稍后我们会将它们拆分成更多,依此类推。
monoligh 公开了一个 REST API,它提供了用于管理数十个不同实体(例如用户、用户类型、角色、角色类型等)的方法。单体应用程序只公开了一个 REST API 消费者——一个 javascript 前端应用程序。
我们目前正在研究如何配置 API 网关 (Zuul) 的两种可能性:
URL 将包含微服务名称,例如/api/dictionary
将服务于/api/dictionary/user_types
和/api/dictionary/role_types
,而/api/data
将服务于/api/data/users
和/api/data/roles
。这意味着随着我们创建更多微服务,URL 会随着时间而改变。每次我们这样做时,都必须更改消费者(前端)。
URL 将基于实体名称,例如/api/users
、/api/user_types
、/api/roles
和 /api/role_types
。缺点是 Zuul 配置必须包含系统管理的每个实体的显式配置。
以上哪种方法是正确的?
【问题讨论】:
我建议使用第一种方法,因为它可以让您轻松地从 url 本身识别微服务。其次,您将减少维护新端点的服务注册表的工作量。可能是第二个方法将帮助您在消费者方面没有或很少有更改,因为他们不必更改 URL。但是第二种方法在短期内很好,但从长远来看,从我的角度来看,第一种方法更好。 【参考方案1】:Manmay 的说法是正确的。您应该采用第一种方法以获得长期收益。 如果您仍然想要替代方案,那么您可以通过配置您的 API 网关来组合这两种方法,它会路由您的请求
/api/users -> /api/data/users /api/user_types -> /api/dictionary/user_types /api/roles -> /api/data/roles /api/role_types -> /api/dictionary/role_types通过这种方法,您不必担心维护或客户端更改等任何问题。
【讨论】:
您不是从问题中描述了第二种方法吗? @AdamSiemion 您所说的第二种方法与我提出的不同。在客户端,您将使用“api/users”网址。以这样一种方式配置您的网关,即您的客户端向此 url 发出请求,然后该请求将被转发到“/api/data/users”,这不过是您的微服务 url。意味着即使您的微服务 URL 发生更改,您也不必对客户端代码进行任何更改。您只需要更新网关中的相应映射即可。以上是关于将单体应用拆分为微服务时如何定义 API 网关 URL的主要内容,如果未能解决你的问题,请参考以下文章