语境:
我正在为一些微服务设计一个 API 网关。这个想法是:
我在一个全局拦截器中拦截所有传入的请求,根据一些权限分析它们的可访问性,最后使用一个简单redirect
的方法来调用实际的 URL。例如,我在一个地方执行以下操作:
if(permAction && authorizationService.hasPermission(user, micro, permAction)) {
if(microName != "umm"){
log.info("Successfully Authorized. Forwarding request to: ${micro?.ipAddress}${req}")
redirect(url: "${micro?.ipAddress}${req}", params: params)
return false
}
log.info("Successfully Authorized. Forwarding request to: ${req}")
return true
}
对于简单的GET
请求,它工作正常。
问题
我在使用这种方法时遇到了一些问题。
- 当我从前端点击 API 时,通过我的网关,它给出一个
302
,最后给出一个200
原始 API 是否存在于原始微服务中。它给出了一个404
if 直接命中。发生了什么? 控制台中显示已preflight cors
禁用的错误。那是什么?如果没有重定向,它就不存在。我希望所有据我搜索,grails 中的重定向仅支持GET
,PUT
和POST
请求重定向到各种微服务。GET
请求。- 有没有其他(更好的)方法可以实现相同的目标?
也许RESTClient
在服务器端或类似的东西。
其中一些问题已经部分回答,但不是在这种情况下。关于上下文中问题的任何见解都会很棒。
此处给出了完整的拦截器文件。此存储库包含 Grails API 网关的整个项目。
更新:下午 4:30
通过允许在服务器端解决了问题 2 。OPTIONS
Allowed-Methods
更新:晚上 11:12
对于数字 4,我在网关后端实现了一个休息客户端。就功能而言,它工作正常。但是,在后端使用 rest 客户端时,客户端请求网关,网关反过来请求微服务,获取响应并将其返回给客户端。这种网关的双向参与是昂贵的。顺便说一句,这也解决了第 3 个问题。
对于使用其他语言或技术的网关,是否还有其他更好的解决方案可以提供开箱即用的鲁棒性?