gpt4 book ai didi

clojure - 我可以让 lein ring server-headless 在特定的 servlet 上下文上运行吗?

转载 作者:行者123 更新时间:2023-12-04 21:38:09 25 4
gpt4 key购买 nike

我有一个 Ring 应用程序,可以作为 uberwar 部署到生产环境中。事物;我的服务.war。在生产中,WAR 文件被扔进 Jetty 中,它在其名称后面的上下文中运行

$ curl -i -X GET http://myservice.qa1.example.com:8080/myservice/healthz
HTTP/1.1 200 OK
...

当我通过 lein ring 在本地运行时,我需要它在相同的上下文中运行;我的服务。
$lein ring server-headless
2015-10-14 14:04:03,457 level=INFO [main] Server:271 - jetty-7.6.13.v20130916
2015-10-14 14:04:03,482 level=INFO [main] AbstractConnector:338 - Started SelectChannelConnector@0.0.0.0:10313
Started server on port 10313

但是在我本地,同样的 curl 对我来说都是 404。
$ curl -i -X GET http://localhost:10313/myservice/healthz
HTTP/1.1 404 Not Found
...

lein ring 事物将其部署到根上下文中。
$ curl -i -X GET http://localhost:10313/healthz
HTTP/1.1 200 OK
...

那是怎么回事?如何指示 lein ring 部署到我选择的上下文名称中?我需要 curl -i -X GET http://localhost:10313/myservice/healthz从 lein ring 开始工作

最佳答案

解决此问题的一种方法是为您的应用程序创建第二组(独立)路由。您还为独立案例创建了第二个处理程序。然后,您可以使用 Leiningen 配置文件为独立案例和 uberwar 案例指定不同的处理程序。独立运行应用程序时使用默认配置文件。 :uberjar profile 在创建 uberwar 时使用。因此,您的独立处理程序将与 lein ring server-headless 一起使用。当 war 部署到容器中时,将使用您的常规处理程序。

创建第二组路由不需要太多额外的代码。您可以将现有路由包装在您选择的上下文中。假设以下是您的路由和环处理程序:

(defroutes app-routes
(GET "/healthz" [] "Hello World")
(route/not-found "Not Found"))

(def app
(wrap-defaults app-routes site-defaults))

独立案例的附加路由和处理程序如下所示:
(defroutes standalone-routes
(context "/myservice" req app-routes)
(route/not-found "Not Found"))

(def standalone-app
(wrap-defaults standalone-routes site-defaults))

现在,进入 lein-ring project.clj 中的配置.我们希望默认环处理程序指向 standalone-app . uberwar 的环处理程序应该指向 app . :ring项目 map 中的条目 project.clj应该如下所示(根据您的实际命名空间进行调整):
:ring {:handler myservice.handler/standalone-app}

另外,将以下内容合并到您的 :profiles 中 map 在 project.clj :
:uberjar {:ring {:handler myservice.handler/app}}

请务必使用最新版本的 lein-ring插入。 0.9.7 版对我有用。更早的版本,比如 0.8.3,不能工作,因为它们没有使用 :uberjar运行 uberwar 时的配置文件任务。

如果您执行所有这些操作,并假设您的 war 文件名为 myservice.war,则无论您的应用以 lein ring server-headless 启动,URI 的上下文部分都将相同。或者如果war文件部署在Jetty中。
$ curl http://localhost:[port]/myservice/healthz

关于clojure - 我可以让 lein ring server-headless 在特定的 servlet 上下文上运行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33135667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com