使用单独的rest api构建java Web应用程序的最佳策略

时间:2014-02-06 20:59:58

标签: spring web-applications spring-roo

我有一个现有的Spring Web应用程序,然后我启动了一个单独的Spring Roo应用程序,它基本上只是一个主应用程序可以使用的rest api,以及第三方开发人员。这个设置有两个问题:

  1. 几乎所有应用程序的工作都是通过AJAX从客户端完成的,所以其余的api运行良好,但有时主应用程序还需要从其余的api访问其中一些新服务,但是它们是单独的应用程序,因此这意味着在我自己的应用程序中使用resttemplate或rmi ..

  2. 将其余的api作为单独的应用程序也意味着将其部署到单独的子域。这对于分割http请求很好,但对于需要在身份验证后面的api的请求不太好,因为这意味着重定向到另一个域进行单点登录,这会导致ajax请求失败。

  3. 让这一切都分开感觉很干净,但它也开始变得烦人。我可以将这两个项目结合起来,所有问题都将得到解决。建议?

2 个答案:

答案 0 :(得分:1)

我建议你只将两个项目合并在一起:

  • Roo不会在没有Roo注释的课程上启动
  • 您不需要集成API
  • 两者都是Spring,所以你不应该有合并问题,但你必须维护Roo app项目的项目布局

答案 1 :(得分:1)

根据评论中的要求,我提供了一个示例,说明如何使用Apache ProxyPassProxyPassReverse通过相同的子域服务器2个单独的Web应用程序。

我这样做的方法是使用标准HTTP代理,但也可以使用AJP连接器(我相信)。我认为这需要一个webapps在不同的tomcat下运行(由于server.xml需要一个唯一的Host条目 - 见下文,但我不是100%肯定这一点。)

将以下内容添加到Apache conf文件中(例如vhosts.conf或vhosts.d / servername.conf):

<VirtualHost *:80>
     ServerName 127.0.0.1
     ServerName externalName1

     ProxyRequests Off

     # AJP example
     #ProxyPreserveHost On
     #ProxyPass / ajp://localhost:8009/
     #ProxyPassReverse / ajp://localhost:8009/

     ProxyPass         /ws   http://internalName1:8080/webapp1/
     ProxyPassReverse  /ws   http://internalName1:8080/webapp1/
     ProxyPass         /     http://internalName2:8080/webapp2/
     ProxyPassReverse  /     http://internalName2:8080/webapp2/

</VirtualHost>

由于ProxyPass条目的顺序决定了优先级,因此对/ws/*的任何请求将始终转到第一台服务器。但是第一台服务器必须有一个/ws控制器来响应这些请求 - 换句话说,/ws不是应用程序的上下文路径,而是webapp的内部路径。 webapp2可以包含包含/ws的路径,但只会被忽略,因为所有请求都会转到webapp1

每个webapp都需要tomcat Host文件中的server.xml条目,如:

<Host name="externalName1" debug="0" appBase="webapps/webapp1" unpackWARs="true" autodeploy="true">
    <Alias>serverName1AltName</Alias>
    <Context path="" docBase="" debug="5" reloadable="true"/>
</Host>

我自己已经配置了很多年并从我们运行的几台服务器中提取了信息,所以如果有任何错误或错误我会道歉。