我正在使用微服务架构构建一款庞大的应用程序。该应用程序由多个后端微服务组成(部署在多个云实例上),其中一些我想使用rest api连接,以便于它们之间传递数据。
该应用程序还将向第三方公开API,但是上述终端点应该仅限于同一应用程序内的其他微服务,从而创建某种私有网络。
因此,我的问题是:
如何实现对同一应用程序中的其他微服务的受限API访问?
如果有比使用http传输层更好的方法来连接微服务,请提及。
请尽可能保持答案与服务器/语言无关。
谢谢。
我正在使用微服务架构构建一款庞大的应用程序。该应用程序由多个后端微服务组成(部署在多个云实例上),其中一些我想使用rest api连接,以便于它们之间传递数据。
该应用程序还将向第三方公开API,但是上述终端点应该仅限于同一应用程序内的其他微服务,从而创建某种私有网络。
因此,我的问题是:
如何实现对同一应用程序中的其他微服务的受限API访问?
如果有比使用http传输层更好的方法来连接微服务,请提及。
请尽可能保持答案与服务器/语言无关。
谢谢。
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作为传输机制。
一种方法是在内部 MS 通信中使用 HTTPS。使用信任存储锁定对服务的访问权限。您可以在后端通信中在服务之间共享证书。最好使用通配符证书。只要您的服务可以被寻址到同一个域,那么它应该会起作用,比如 *.yourcompany.com。
一旦所有内容都准备就绪,它应该可以正常工作。HTTPS 会导致一些开销,但主要是在握手过程中。使用会话保持,在加密通道上不应有太多开销。
当然,您也可以简单地将一些凭据添加到您的 HTTP 标头中。这将不太安全。
...上述终端点应仅限于同一应用程序中的其他微服务...
您所讨论的是授权的广义概念。
授权是在应用程序中向经过身份验证的用户授予或拒绝"权限"或"能力"的行为。
因此,任何授权机制的工作都是验证任何入站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
我知道我回答这个问题已经很晚了 :)) 但是对于任何遇到这个问题的人来说,Kafka 是一个非常适合此类操作的选择。
基于 Kafka 的自我介绍
Kafka 通常用于两类广泛的应用程序:
- 构建实时流数据管道,可在系统或应用程序之间可靠地获取数据
- 构建实时流应用程序,转换或响应数据流
附注:Kafka 由 LinkedIn 创建,并被许多大型公司使用,因此经过了实战考验。
最简单的方法是仅允许来自微服务运行的IP地址的访问。
你可以使用RabbitMQ将你的请求发布到队列中,然后消费任务。