当客户想要看到我们漂亮的衣服时,他们会向网关发送一个请求,该网关具有 products/:id 端点。 为了聚合所有这些细节,网关向我们的后端微服务发送一个请求,这些微服务具有不同的端点。 如果没有网关,我们的客户端应该已经将请求发送到这些微服务。

深入了解 API 网关

我们的英雄应该调用三个 API 来聚合这些信息。 从效率的角度来看,同时运行尽可能多的调用会更明智。 她想回复所有要求查看礼服细节的客户。 虽然她不能同时在所有地方,但她可以飞得非常快,以汇总所有数据。 她需要减少总体等待时间。 这就是我们帮助她使用 goroutines 的原因。

func getProductConcurrently(c echo.Context) error {
id := c.Param("id")
p := model.Product{}
var wg sync.WaitGroup
wg.Add(3)
go getPriceFromApi(id, &p, &wg)
go getStockFromApi(id, &p, &wg)
go getMetaFromApi(id, &p, &wg)
wg.Wait()
return c.JSON(http.StatusOK, p)
}

我们有不止一个 goroutine,因为我们有三个 API 调用。 我们的英雄很忙,所以她需要知道她的工作何时完成。 因此,我们等待三个 goroutine 完成,然后将聚合数据发送到客户端。

奖金:BFF

假设您同时拥有移动服务和 Web 服务,这意味着您拥有不同的 UI,并且您知道移动体验的本质通常与桌面 Web 体验截然不同。 您喜欢为每种客户端提供一个 API 还是为每个客户端提供一个 API?

我们所说的差异化是什么意思? 移动设备需要减少电池续航时间的需求,并且在比较桌面设备时需要显示不同的数据。 因此,两种用户界面都需要由具有独特功能的不同 API 支持,而不是由一个通用 API 支持。

您之前可能听说过下游和上游服务。 这些术语用于描述依赖服务请求链的方向。

下游服务发起请求并接收响应。

上游服务接收请求并返回响应。