我可以在特定的 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 的环处理程序应指向 appproject.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