scala - 来自不同服务器的 HTTP 请求/响应

标签 scala http nginx clojure

在 HTTP 请求/响应场景中,我想响应请求的客户端并不重要(无论如何他会怎么说)。

简而言之,我想从这里开始:

Client
 ↓   ↑
 Nginx
  ↓   ↑
  ServerA
   ↓   ↑
   ServerB

为此:

Client
 ↓    ↑
 Nginx ↖
  ↓      ↖
  ServerA  ↖
   ↓      ↗
   ServerB

由于serverB已经有了响应,不会做额外的处理,我想绕过serverA,但如果可能的话应该通过nginx(例如使用压缩)。

具体来说,我想了解更多:

  • 必要的nginx配置(如果有的话)

  • serverA和ServerB之间的协议(protocol)交换是否必须特殊?

  • 为此发生必须传递的上下文?另外,如果他们使用不同的语言(在我的例子中是 Clojure 和 Scala)会怎样。

非常欢迎一个小示例(最好是 Clojure、Scala、Java、Node.js - 任何可读的语言)。

最佳答案

我确定您的案例可以通过 nginx-clojure 实现.去年有人用 nginx-clojure 做了类似但更复杂的事情。并且serverA和ServerB之间的协议(protocol)交换没有任何关系。

  1. 在 nginx 内容处理程序中,使用 hijack! 获取 NginxHttpServerChannel say ch,将 ch 放入映射中,键为 req-uuid.所以我们可以使用 ch 稍后发送响应数据。向ServerA发送nginx url、req-uuid等数据。
  2. ServerA向ServerB发送nginx-urlreq-uuid等数据。
  3. ServerB发送req-uuid并通过另一个不同于第一步的url响应nginx,例如'/asynNotfifyHandler'
  4. 编写另一个 nginx 内容处理程序来接收 ServerB 对位置“/asynNotfifyHandler”的响应。如果 nginx 工作进程只有一个,则在此处理程序中获取 NginxHttpServerChannel ch 并使用它来发送响应。如果我们有多个 nginx worker 进程,我们需要使用 broadcast! 来广播 repsonse 事件,并使用 on-broadcast! 来获取持有 nginx worker 进程中的响应事件NginxHttpServerChannel ch 并使用它向原始客户端发送响应。

Here是一个关于 channel sub/pub 的例子。

顺便说一句,我们也可以使用 redis 的 sub/pub 而不是 broadcast!on-broadcast! 来自 nginx-clojure。例如在第一个内容处理程序中,我们将 redis 的主题子化,然后服务器 B 将响应消息发布到相同的 redis 主题。最后使用 NginxHttpServerChannel ch 将响应发送给原始客户端。

关于scala - 来自不同服务器的 HTTP 请求/响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31951813/

相关文章:

正则表达式匹配可以嵌套的方括号内的文本 block

java - Http 到 https 重定向

java - 如何从 AsyncTask 传回 http 请求的结果?

angularjs - 使用 Swagger-js 启用浏览器 cookie

angular - Docker/Angular4/Nginx

scala - 如何在Scala中调用n次方法?

scala - 使用 Spark DataFrame 将数据插入 Cassandra 表

scala - 为什么年和月函数会导致 Spark 中的长时间溢出?

python - 在子目录 nginx + uwsgi 上服务 flask 应用程序

ruby - 使用 nginx 在 Phusion Passenger 上工作时 Sequel DB 连接的正确位置