我想将网络请求“重定向”到另一个服务。我不想改变它们并将它们发送到另一个服务(我假设使用 http-clj 之类的东西)。然后结果将执行相同的跃点。
这是必需的,因为我们正在替换部分服务,但我们不能让客户端直接调用服务。
我们部署到一个 tomcat 中,但通常它应该适用于任何 Ring Request。
有没有一种优雅的方法来做到这一点?
谢谢
这不是特定于 Ring 的答案,但我觉得您最好在旧 Web 服务和新的替代 Web 服务之前使用像Nginx这样的反向代理。
反向代理可以轻松响应不同的传入 URL,并将它们透明地传递到幕后的正确 Web 服务。这是一种灵活而强大的方法,随着服务的增长,它将允许许多分区的 URL 方案变体。
多年来,我一直在处理请求进来的情况下,它需要去两个不同的地方。(在这里对微服务和意外后果的法则进行排队咆哮)我通常选择将 core.async 与 http-kit 一起使用的模式。
(handler .....
(let [output (chan)]
(http/post bakcend-url (make-new-request-options request)
#(do (async/>!! output %)
(async/close! output)))
(go (async/<! (async/timeout 2000))
(async/>! output {:status 500}))
... )
最简单的方法可能只是返回带有正确 Location 标头的 301 Moved Permanently 响应。
如果你想实际执行请求,你基本上是在实现一个 HTTP 代理,这可能会很快变得复杂,你最好使用像 Scott 说的 Nginx 这样的反向代理