roc*_*cer 8 architecture microservices
假设我有一个使用API网关构建的微服务系统.
通过网关后的每个请求都必须通过身份验证服务(防火墙模式)进行预身份验证
但授权怎么样?例如,我在酒店管理系统中根据它们有3个模型和3个服务:
用户
旅馆
房间
编辑房间Y的示例请求在经过身份验证后将具有经过验证的声明,其声明类似于"我是用户X".
要知道X是否有权对Y进行编辑,我必须向酒店服务部门提出要求" Y 's酒店是否与X相关联(由X个人拥有)?".
问题是:我在哪里提出这些要求?
让Gateway 在向客房服务部门提出客户要求之前询问酒店服务,或让客房服务部门自行询问酒店服务部门.何时选择一个而不是另一个?有什么好处?
而且,这种建模对我来说似乎有点不对劲.围绕微服务的所有这些关系只会使我的系统变得非常复杂.随着它的发展,我越来越难以可视化服务之间的工作流程.有这个问题的解决方案吗?一个集中关系服务,可能利用像Neo4j这样的图形数据库?
TL; DR; 您的问题是您基本上将数据模型转换为服务.这是错误的,这不是你如何建模微服务架构.它不是关于数据模型,而是关于功能.(我基于你提出问题的方式,你不谈论功能和责任,你谈论关系).
我将快速回答您问题的第一部分,因为我认为您的问题实际上是在您的建模上.
关于身份验证和授权
问题是:我在哪里提出这些要求?让Gateway在向客房服务部门提出客户要求之前询问酒店服务,或让客房服务部门自行询问酒店服务部门.何时选择一个而不是另一个?有什么好处?
首先,在您的模型上,客房服务是具有足够上下文以实际授权请求的服务.网关没有(也不应该有)足够的信息来判断(网关不应该理解任何关于房间或酒店或任何东西的信息,它的工作是转发请求,而不是解释它们).
其次,即使您可以提供客房服务,也可以要求酒店进行授权,但如果客房服务单独办理或致电其他负责提供授权的服务(即授权服务),则更好.
但最重要的是,这种微服务架构没有多大意义(正如你所描述的那样),这就是整个模型使用起来很奇怪的原因.
为什么模型错了
这种建模似乎错误的原因是因为它是.
术语"微"服务的问题在于人们倾向于关注"微观"部分并忘记"服务"部分.关于微服务是什么有不同的看法,但服务是可以自己调用的东西,并提供在该服务的多个客户端之间共享的值.
您的客房服务毫无意义.您基本上将数据模型转换为服务.A Hotel酒店提供客房,因此您可以定义酒店服务和客房服务.这不是微服务的意思......
在不知道您的特定用户要求的情况下很难判断,但我的直觉是您可能不需要这里的微服务架构.仅仅因为这是最新的趋势,你不需要用它解决每一个问题.
如果您的操作类似于"注册新房间,将照片添加到房间,从房间删除照片,预订房间等等",那么您最好只使用简单的API进行后端服务,这样您就可以所有那些简单的操作.老实说,酒店管理系统似乎不是使用微服务架构构建的正确应用程序.说实话,这更像传统的MVC模型.
如果我不得不想出一个房间微服务的用例,我会说你可能想要一个能够了解所有酒店所有房间的客房服务.客房可以由酒店注册,进行编辑和更改.任何人都可以获得所有可用房间的列表,按日期过滤,按床数过滤等.
请注意,我们现在有两到三个可能的客户: - 您管理酒店的前端. - 您的预留房间的前端. - 有人的前提是你的客房服务到搜索室吗?
另请注意,我们已将系统从酒店管理系统更改为可用于查询不同酒店免费房间的系统......非常有用,但却是完全不同的用户需求.
所以现在你的服务实际上是有意义的...然后碎片将开始失败.
因为现在您有匿名用户(或来自系统外的用户),再也不再去酒店服务了(毕竟用户不再需要管理酒店),为什么酒店服务会知道?.
现在,您将如何处理系统用户?每个微服务会有不同的用户吗?或者是否会有一个在所有微服务中共享的用户?可能是后者,所以提示另一个服务进行身份验证(或者你可以使用oauth2,如果这适合你的模型,那就是一个验证人的服务).
你将如何管理你的权限(你的授权),你想要一个集中配置授权还是每个微服务都有自己的配置?如果它是前者,那么您可能需要另一个为每个微服务提供授权的服务.