如何将部分请求转发到Clojure中的另一台服务器?

时间:2020-04-20 22:12:08

标签: proxy clojure leiningen http-kit pedestal

摘要

我正在开发服务器,使其像Clojure中的一种代理,以基座服务+ lein为基础:

  • 接收请求
  • 转发请求到外部服务器
  • 在服务器之间进行多个请求以提供更大的json并作为单个请求返回给客户端

这很容易编码,并且有很多关于如何服务路线的资源,
但是我找不到任何简单的方法,如何将Clojure基座休息
服务与转发路线一起使用

示例

  • 客户致电[GET] / billing => proxy-clojure-server
  • 代理clojure服务器使用客户端凭据验证请求=> auth-server
  • 代理clojure服务器用计费数据填充json => 计费服务器
  • 代理clojure服务器用客户数据填充json => 客户服务器
  • proxy-clojure-server 返回200,且已解析完整的JSON

设置

  • 我有一个项目,其结构类似于: 安装新的基座服务my-app

我一直在尝试的东西

示例:

(ns your-ns
  (:require [tailrecursion.ring-proxy :refer [wrap-proxy]]))

(def app
  (-> routes
      (wrap-proxy "/remote" "http://some.remote.server/remote")))

我只是无法将基座的路由系统与该代理解决方案混合使用,路由是不同的,似乎,也许我需要使用其他方法来实现

免责声明

  1. 我知道基本转发可以通过nginx,清漆和任何其他负载均衡器完成。但是我的想法是要填充来自不同服务器的数据,从而简化客户端程序
  2. 您可能已经注意到,
  3. 我是Clojure的新手。而且我用尽了所有选项,因为Google对此也很复杂,有时甚至没有用

2 个答案:

答案 0 :(得分:1)

您正在创建一个接收请求的服务器。在您的服务器内,您可以充当客户端向另一台服务器发出请求。然后,您可以将收到的响应修改或汇总到发送给原始客户端的响应中。

请参见the clj-http library进行请求。 Clojure工具箱列出了许多其他选项。

您可能还对this list of documentation resources感兴趣。

答案 1 :(得分:1)

看看 ring-request-proxy 上的 here。来自文档:

(ns myapp.core
  (:require [ring-request-proxy.core :as proxy])

; Middleware format: Delegates request to handler when request can't be forwarded
(def app (-> not-found-handler
             (proxy/proxy-request {:identifier-fn :server-name
                                   :host-fn {"my-server" "http://my-internal-server"}})))

您应该将其设置为要代理的所有路由的中间件。