我可以在特定的 servlet 上下文中使 lein ring server-headless 运行 吗?
Can I make lein ring server-headless run on a specific servlet context?
我有一个 Ring 应用程序,它作为 uberwar
东西部署到生产环境; myservice.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
但同样的卷曲在我本地全部 404。
$ curl -i -X GET http://localhost:10313/myservice/healthz
HTTP/1.1 404 Not Found
...
lein 环将其部署到根上下文中。
$ 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
配置文件在创建 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))
现在,进入 project.clj
中的 lein-ring
配置。我们希望默认的环处理程序指向 standalone-app
。 uberwar 的环处理程序应指向 app
。 project.clj
中项目映射中的 :ring
条目应如下所示(根据您的实际命名空间进行调整):
:ring {:handler myservice.handler/standalone-app}
此外,将以下内容合并到 project.clj
中的 :profiles
地图中:
:uberjar {:ring {:handler myservice.handler/app}}
请务必使用最新版本的lein-ring
插件。 0.9.7 版对我有用。早期版本,如 0.8.3,无法工作,因为它们在 运行 uberwar
任务时没有使用 :uberjar
配置文件。
如果您执行了所有这些操作,并且假设您的 war 文件名为 myservice.war,无论您的应用程序是否以 [=16= 启动,URI 的上下文部分都将相同] 或者如果 war 文件部署在 Jetty 中。
$ curl http://localhost:[port]/myservice/healthz
我有一个 Ring 应用程序,它作为 uberwar
东西部署到生产环境; myservice.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
但同样的卷曲在我本地全部 404。
$ curl -i -X GET http://localhost:10313/myservice/healthz
HTTP/1.1 404 Not Found
...
lein 环将其部署到根上下文中。
$ 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
配置文件在创建 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))
现在,进入 project.clj
中的 lein-ring
配置。我们希望默认的环处理程序指向 standalone-app
。 uberwar 的环处理程序应指向 app
。 project.clj
中项目映射中的 :ring
条目应如下所示(根据您的实际命名空间进行调整):
:ring {:handler myservice.handler/standalone-app}
此外,将以下内容合并到 project.clj
中的 :profiles
地图中:
:uberjar {:ring {:handler myservice.handler/app}}
请务必使用最新版本的lein-ring
插件。 0.9.7 版对我有用。早期版本,如 0.8.3,无法工作,因为它们在 运行 uberwar
任务时没有使用 :uberjar
配置文件。
如果您执行了所有这些操作,并且假设您的 war 文件名为 myservice.war,无论您的应用程序是否以 [=16= 启动,URI 的上下文部分都将相同] 或者如果 war 文件部署在 Jetty 中。
$ curl http://localhost:[port]/myservice/healthz