Architecture 微服务体系结构-跨域聊天

Architecture 微服务体系结构-跨域聊天,architecture,soa,microservices,Architecture,Soa,Microservices,我有一个相对较新的项目,它采用了微服务架构。我对单个服务的大小和粒度感觉很好,但我们的安全服务除外 我有三种主要服务,比如说foo服务,bar服务,和baz服务。这些服务不需要通信,但所有三个服务都定期通过HTTP请求与安全服务进行通信。我希望停止这样做有多种原因-最大的原因是,对我个人服务的每个请求都会产生对安全服务的请求,一旦考虑到负载平衡等因素,这些请求可能会变成几个额外的跃点。我一直在读Mark Richards的《软件架构模式》,他建议在这些情况下,您应该共享数据库,并将所需的功能复制

我有一个相对较新的项目,它采用了微服务架构。我对单个服务的大小和粒度感觉很好,但我们的安全服务除外

我有三种主要服务,比如说
foo服务
bar服务
,和
baz服务
。这些服务不需要通信,但所有三个服务都定期通过HTTP请求与
安全服务进行通信。我希望停止这样做有多种原因-最大的原因是,对我个人服务的每个请求都会产生对安全服务的请求,一旦考虑到负载平衡等因素,这些请求可能会变成几个额外的跃点。我一直在读Mark Richards的《软件架构模式》,他建议在这些情况下,您应该共享数据库,并将所需的功能复制到每个服务中。尽管如此,他还是将此示例用于较小的“实用程序”类,这在本例中可能并不适用

安全服务没有那么大,所以我肯定可以把它复制到其他服务中。这就是说,它太大了,我觉得复制和粘贴它不太好——根据工作服,有314行“相关”的代码(java,所以有更多的实际代码;-)。我可以很容易地将它转换为每个服务引入的模块,但是我的服务有一个共享的依赖关系,这在过去对我有点影响。当然,随着我们添加身份验证方法,安全代码会随着时间的推移而增长,但在身份验证方面,我们并没有重新发明轮子,因此它主要与其他库和身份验证服务集成。也就是说,我不认为这个特定的代码库会变得庞大

所以我的问题是,我应该复制并粘贴代码还是构建每个服务都引入的模块?谢谢

我希望停止这样做有多种原因——最大的原因是,对我的单个服务的每个请求都会产生对安全服务的请求,一旦考虑到负载平衡等因素,这些请求可能会变成多个跃点

作为单独服务离开的好处:
-对安全业务逻辑的更改只影响安全服务,不需要对客户端服务进行更改

将安全逻辑移动到客户端服务中的优点:
-速度/性能。
-少管理一项服务可能意味着降低运营成本

速度(性能)可能在这里胜过一切,这取决于需求是什么,但它会带来开发成本的增加

如果您确实将安全逻辑移动到它自己的可重用模块中,该模块可以从其他服务中调用,那么只需在封装它和遵循基本的失耦合紧密内聚设计方面做得很好。此外,由于您可能需要在未来几年内为这一决定辩护,请给出一个好的解释,这样您未来的老板在询问更新我们的安全逻辑为什么要花这么多钱时不会解雇您。有现成的基准,人们撒谎,数字则不然。我曾经有一个一页的基准测试结果为一个新的数据库,我乞求。不同的人多次问我为什么选择新的DB。。。我只给他们发了一页,再也没有听到那个人提出任何问题

这段视频可能会让你在逆势而行方面感觉更好:

它展示了Netflix如何以及为什么逆势而行,在API中不采用REST架构。基本上,架构是需求和成本的客户,而不是相反


编辑:作为服务离开的另一个大优点是,您可能需要为支持的每种语言创建多个模块。在我的工作中,客户端服务跨多种语言使用我们的安全服务

如果您将安全逻辑嵌入到其他服务中,那么您现在真的不能称之为微服务架构,是吗?我也明白,为每一项其他服务提供额外的、重复的服务器往返可能有点拖沓。这里有一些可行的备选方案供你参考。 将所有四个微服务置于防火墙后面。公开一个面向公众的服务,该服务使用安全服务验证传入的请求,然后在请求对给定凭据有效时调用其他服务。其他服务始终信任调用者,调用者是在受信任的环境中拥有和操作的服务


如果这是一个“火忘了”的用例,你会感到不舒服的是,面向公众的服务有太多的编排职责,然后考虑这个备选方案。面向公众的服务将入站请求发送到消息代理中未经授权的队列。安全服务使用该队列并执行身份验证。如果有效,则安全服务将消息排入授权队列。在此之后,任意数量的微服务从授权队列中消费并执行各自的操作

将安全性作为一项单独的服务,在您描述的每个请求中都需要它,这是一个非常糟糕的想法。请允许我向您介绍一下帕纳斯在书中如此雄辩地描述的模块化的基本思想。没有耦合也意味着没有内聚力,工程就是要在这个轴上找到最佳点

与人们普遍认为的相反,微型服务需要相当大才能实现规模化。可伸缩性的限制主要存在于通信中,因此它们需要设计为不健谈。问题主要不是带宽,而是延迟(除非你是netflix)


您的安全模块需要更接近您的服务,而不是HTTP请求,一个链接入的模块可以很好。

这感觉像是Siteminder生来就为了解决的一个交叉问题。它应该是服务的筛选器或基本身份验证,而不是额外的网络跃点。我们正在筛选服务请求。现在只使用basic(这是新的),但需要使用