如何连接不同的微服务应用?

Posted

技术标签:

【中文标题】如何连接不同的微服务应用?【英文标题】:How to connect separate microservice applications? 【发布时间】:2015-04-03 20:25:26 【问题描述】:

我正在使用微服务架构构建大型应用程序。该应用程序将包含多个后端微服务(部署在多个云实例上),其中一些我想使用 rest api 进行连接,以便在它们之间传递数据。

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

所以,我的问题是:

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

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

如果可能,请保持答案服务器/语言不可知。

谢谢。

【问题讨论】:

如何定义“同一个应用程序”? 我的意思是通过“同一个应用程序”连接的整个微服务系统 【参考方案1】:

是的,很容易。微服务的每个客户端都有一个 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】:

最简单的方法是只允许从运行微服务的 IP 地址进行访问。

【讨论】:

【参考方案3】:

一种方法是使用 HTTPS 进行内部 MS 通信。将访问(使用信任存储)锁定为仅对您的服务。您可以在服务之间共享证书以进行后端通信。最好是通配符证书。只要您的服务可以寻址到同一个域,它就应该可以工作。喜欢 *.yourcompany.com。

一切就绪后,它应该可以正常工作了。 HTTPS 会话确实意味着一些开销,但这主要是在握手过程中。在会话中使用 keep-alive,加密通道应该不会有太多开销。

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

【讨论】:

【参考方案4】:

RestAPI 不仅是实现它的方法,我的一些想法之一是关于 Service Registry 链接 Eureka (Netflix)、Zookeeper ( Apache) 等。

这是一个例子:

https://github.com/tiarebalbi/qcon2015-sao-paolo-microservices-workshop

【讨论】:

【参考方案5】:

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

您所说的广义上是授权。

授权是在您的应用程序中向真实用户授予或拒绝“权力”或“能力”。

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

例如,假设我在您的 API 中出现了对 Widget 1234 的 PUT 请求:

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。

【讨论】:

基于用户凭据的授权并不是最好的方法,因为微服务可能会从其他微服务中获取并非由真实用户发起的内容。例如,它可以是一些预定的操作。使用服务用户可能是一个好方法,但是,生成此类用户并不总是那么简单。 Google 使用 API 密钥。 @pcjuzer 感谢您的评论。当我说用户时,我实际上是指用户或服务帐户。我对 API 密钥方法不太熟悉 - 也许您可以启发我,我会更新我的答案。【参考方案6】:

我知道这个问题我迟到了 :)) 但对于遇到此线程的任何人来说,Kafka 是与此问题类似的操作的绝佳选择。

基于Kafka自己的介绍

Kafka 通常用于两大类应用程序:

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

旁注:Kafka 是由 LinkedIn 创建的,并已在许多大公司中使用,因此它经过了实战考验。

【讨论】:

以上是关于如何连接不同的微服务应用?的主要内容,如果未能解决你的问题,请参考以下文章

申通的云原生实践之路:如何实现应用基于容器的微服务改造?

如何使用 Node.js 和 Docker 构建高质量的微服务

什么是微服务架构?主流的微服务如何实现?

API网关在微服务中的应用

赠书如何使用Node.js和Docker构建高质量的微服务

相互通信的微服务 - 如何?