我正在尝试决定处理用户上传文件的方式,时间和地点。我们正处于MicroService环境(PHP + Linux)中,以便在未来几个月内部署新系统。一个关键组件是传入文件。
目前正如我所看到的那样有三种选择(可能还有更多,我还没有意识到)。它们如下:
(1)
[CLIENT:file] ->
[GATEWAY API
FILE STORAGE HANDLER ->
[a: MICROSERVICE-News]
[b: MICROSERVICE-Authors]
[c: MICROSERVICE-Logger]
] -> {response}`
在这种情况下,Gateway API旨在处理与存储服务(S3,GCS)的直接对话,设置文件名,验证等。当收到存储确认时,它会将该文件名和其他数据传递给其他MicroServices根据需要。我认为这对整体有益,因为文件在收到后立即处理,并且可以在不影响其他任何其他内容的情况下发生故障。然而,它确实增加了网关的复杂性,并且可能在高峰时间迅速减慢速度。
(2)
[CLIENT:file] ->
[GATEWAY API
[a: MICROSERVICE-Files]
[b: MICROSERVICE-News]
[c: MICROSERVICE-Authors]
[d: MICROSERVICE-Logger]
] -> {response}
在这种情况下,Gateway API会收到该文件,然后必须将其传递给文件MicroService。这可能是有益的,因为它可以远离网关,并且提供了在服务内轻松进行更改的灵活性,而不会影响网关。这样做的主要缺点是,现在单个文件被处理两次,需要计算额外的资源。
(3)
[CLIENT:file] ->
[FILE API] -> {response} ->
[CLIENT] ->
[GATEWAY API
[a: MICROSERVICE-News]
[b: MICROSERVICE-Authors]
[c: MICROSERVICE-Logger]
] -> {response}
在此方案中,客户端负责将文件发送到单独的服务并使用响应发送到Gateway API。从资源的角度来看,这会占用Gateway API的巨大负担,并且只允许它关注数据,而不关心文件。这样做的主要缺点是客户端可能会向Gateway API发送错误或恶意信息,并需要进行额外验证以确保文件有效且存在。它还会在服务和客户之间产生潜在的同余问题。
我可能会错过其他选项,并且很想知道是否有。有没有人有这方面的经验,你是如何解决或处理MicroService架构中的文件的?
答案 0 :(得分:0)
[CLIENT:file] ->
[FILE API]
-> {response}
->
[a: MICROSERVICE-News]
[b: MICROSERVICE-Authors]
[c: MICROSERVICE-Logger]
] -> {publish}
在此示例中,您可以跳过Gateway api。
You File api验证文件上传和数据内容。成功完成后,您向客户端做出响应,说明上传成功。
稍后,您在微服务中处理上传,并且您使用某种发布者来通知客户端,如果此数据在您的其他服务中添加了新操作。
如果您的客户依赖于数据处理,那么您需要执行2个步骤。第一步是文件上传响应,告诉您文件已成功上传并验证。
在这里您可以通过更改gui对此信息作出反应,或者仍然等待发布者信息。 Publisher将通过成功或错误发送对文件信息的植入,因此您可以与客户一起完成步骤
答案 1 :(得分:0)
经过长时间的研究,我终于找到了解决方案。
场景3非常适合您,您可以跳过@api中显示的Gateway api
[CLIENT:file] ->
[FILE API] -> {response} ->
[CLIENT] ->
[GATEWAY API
[a: MICROSERVICE-News]
[b: MICROSERVICE-Authors]
[c: MICROSERVICE-Logger]
] -> {response}
示例场景
样品申请
POST https://api.site.com/media/upload
示例响应
{
"location": "JPG-IMG-54f022ae8b3f4d979e925b4dp68e87"
}
样品申请
POST https://api.site.com/v2/news
{
"Text": "Foo and Bar",
"location": "JPG-IMG-54f022ae8b3f4d979e925b4dp68e87"
}
样品申请
Get https://api.site.com/v2/JPG-IMG-54f022ae8b3f4d979e925b4dp68e87
答案 2 :(得分:0)
我认为对于这些架构问题,没有万能的解决方案,这始终取决于您的上下文和质量目标。
如果您更喜欢封装而不是性能,那么请使用解决方案 (2)。您可能需要考虑对文件服务使用基于客户端的服务发现机制,而不是成熟的 API 网关,以减少网关上的负载。
如果您更喜欢性能并且客户端在您的控制之下,那么您可以使用解决方案 (3)。
不过,我会避免使用解决方案 (1)。微服务有一个原则“保持端点的智能”,这意味着避免将逻辑放入 API 网关等基础设施组件中。