如何连接独立的微服务应用?

10

我正在使用微服务架构构建一款庞大的应用程序。该应用程序由多个后端微服务组成(部署在多个云实例上),其中一些我想使用rest api连接,以便于它们之间传递数据。

该应用程序还将向第三方公开API,但是上述终端点应该仅限于同一应用程序内的其他微服务,从而创建某种私有网络。

因此,我的问题是:

如何实现对同一应用程序中的其他微服务的受限API访问?

如果有比使用http传输层更好的方法来连接微服务,请提及。

请尽可能保持答案与服务器/语言无关。

谢谢。


你如何定义“相同的应用程序”? - user1907906
我所指的“相同应用程序”是连接的微服务整个系统。 - Patryk
7个回答

3
是的,很简单。每个微服务的客户端都有一个API密钥。微服务只接受来自有效API密钥的客户端的请求。
此外,需要知道REST只是一种协议,它允许边界上下文之间进行通信。
它不必是通过HTTP实现的。要求的是具有统一接口(这就是为什么使用HTTP及其PUT、POST、GET、DELETE等方法)和无状态(所有状态都通过URI传输)。
因此,如果您的所有微服务都在同一台计算机上运行,您只需要像这样做:
class SomeClass implements RestfulMethods {

    public function get(params){ // return something}
    public function post(params){ // add something}
    public function put(params){ // update something}
    public function delete(params){ // delete something}
}

微服务通过与其他服务的RestfulMethod实现进行交互来进行通信。

但如果您的微服务在不同的计算机上,最好使用HTTP作为传输机制。


2

一种方法是在内部 MS 通信中使用 HTTPS。使用信任存储锁定对服务的访问权限。您可以在后端通信中在服务之间共享证书。最好使用通配符证书。只要您的服务可以被寻址到同一个域,那么它应该会起作用,比如 *.yourcompany.com。

一旦所有内容都准备就绪,它应该可以正常工作。HTTPS 会导致一些开销,但主要是在握手过程中。使用会话保持,在加密通道上不应有太多开销。

当然,您也可以简单地将一些凭据添加到您的 HTTP 标头中。这将不太安全。


1

...上述终端点应仅限于同一应用程序中的其他微服务...

您所讨论的是授权的广义概念。

授权是在应用程序中向经过身份验证的用户授予或拒绝"权限"或"能力"的行为。

因此,任何授权机制的工作都是验证任何入站API请求中隐含的"声明"——即用户被允许执行请求中编码的操作。

例如,想象一下我使用PUT请求到达您的API,请求Widget 1234:

PUT /widgetservice/widget/1234 HTTP/1.1

这可以被解释为我(Bob Smith,一个已知的用户)声称我有权对您系统中ID为1234的小部件进行更改。

无论您如何验证此声明,我希望您能看到这需要在应用程序级别而不是API级别完成。实际上,授权是应用程序级别的问题,而不是API级别的问题(与身份验证不同,后者非常关注API级别)。

举例来说,在我们上面的示例中,理论上可能允许我创建一个新的小部件,但不能更新现有的小部件:

POST /widgetservice/widget/1234 HTTP/1.1

甚至我只被允许更新小部件1234,不允许更改其他小部件的请求。

PUT /widgetservice/widget/5678 HTTP/1.1

如何实现在同一应用程序中对其他微服务的受限API访问?
因此,这就成为了一个关于如何在应用程序中构建授权以便您可以验证来自已知用户的单个请求(在您的情况下,生态系统中的其他服务只是另一种已知用户)的问题。
嗯,抱歉但我要规定一下,您可以使用基于声明的授权服务,该服务存储基于用户身份或角色成员身份的有效声明。
这在很大程度上取决于您如何处理身份验证,以及您是否支持角色作为该过程的一部分。您可以针对各个用户存储声明,但随着用户数量的增加,这将变得繁琐。尽管实现起来相当麻烦,但OAuth是领先的平台之一。
我正在使用微服务架构构建巨型应用程序。
这里唯一需要说的是先读this

基于用户凭据的授权并不是最好的选择,因为微服务可能需要从其他微服务中获取一些内容,而这些内容并非由真实用户发起。例如,它可以是一些定期操作。使用服务用户可能是一个不错的方法,但生成此类用户并不总是直截了当的。谷歌使用API密钥。 - pcjuzer
@pcjuzer 感谢您的评论。当我说用户时,实际上是指用户或服务帐户。我对 API 密钥方法不太熟悉 - 也许您可以启发我,我会更新我的答案。 - tom redfern

1

0

我知道我回答这个问题已经很晚了 :)) 但是对于任何遇到这个问题的人来说,Kafka 是一个非常适合此类操作的选择。

基于 Kafka 的自我介绍

Kafka 通常用于两类广泛的应用程序:

  1. 构建实时流数据管道,可在系统或应用程序之间可靠地获取数据
  2. 构建实时流应用程序,转换或响应数据流

附注:Kafka 由 LinkedIn 创建,并被许多大型公司使用,因此经过了实战考验。


0

最简单的方法是仅允许来自微服务运行的IP地址的访问。


0

你可以使用RabbitMQ将你的请求发布到队列中,然后消费任务。


虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。-【来自审查】 - Kuro Neko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接