0

语境:

我正在为一些微服务设计一个 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请求,它工作正常。

问题

我在使用这种方法时遇到了一些问题。

  1. 当我从前端点击 API 时,通过我的网关,它给出一个302,最后给出一个200原始 API 是否存在于原始微服务中。它给出了一个404if 直接命中。发生了什么?
  2. 控制台中显示已preflight cors禁用的错误。那是什么?如果没有重定向,它就不存在。
  3. 我希望所有GET,PUTPOST请求重定向到各种微服务。据我搜索,grails 中的重定向仅支持GET请求。
  4. 有没有其他(更好的)方法可以实现相同的目标?也许RESTClient在服务器端或类似的东西。

其中一些问题已经部分回答,但不是在这种情况下。关于上下文中问题的任何见解都会很棒。

此处给出了完整的拦截器文件。此存储库包含 Grails API 网关的整个项目。

更新:下午 4:30

通过允许在服务器端解决了问题 2 。OPTIONSAllowed-Methods

更新:晚上 11:12

对于数字 4,我在网关后端实现了一个休息客户端。就功能而言,它工作正常。但是,在后端使用 rest 客户端时,客户端请求网关,网关反过来请求微服务,获取响应并将其返回给客户端。这种网关的双向参与是昂贵的。顺便说一句,这也解决了第 3 个问题。

对于使用其他语言或技术的网关,是否还有其他更好的解决方案可以提供开箱即用的鲁棒性?

4

0 回答 0