springboot构建web项目的集群部署之路

最近搞了个springboot构建的bbs项目,项目整体是从github上面clone的,到本地做了一些环境移植,最后部署到linux环境下,部署2个节点,算是一个集群。期间踩坑无数,这里记录一下,以备后用,免蹈覆辙。

1.springboot构建的web项目,例子里面都是写main类,打jar包直接执行。因为在spring-boot-starter-web这个包里,内置了tomcat。这个tomcat也可以做设置,但是总归有点隔靴搔痒。线上环境还是老实打war包放到正规的tomcat里面执行比较稳妥。如何把jar改造成war,一搜一大堆,简单来说:1)改打包类型;2)添加打war包插件;3)修改启动的main类,继承SpringBootServletInitializer,重写configure方法。这里多说一句,我理解是:原来是main类启动,拿参数,起容器。现在不用你操心了,继承这个类之后,你变成容器启动过程中的一个环节了。4)注意修改springboot-starter-web这个依赖,exclusion掉内置的tomcat,然后单独引一个tomcat的包,并且修改scope为provided.同时Tomcat下的J2EE相关的包也要单独引入一下,同时设置为provided。为什么这么麻烦,主要是为了设置provided属性,这样我们测试的时候还用tomcat以及相关J2EE包,打包的时候就不要了,不然会跟容器里面的包冲突。5)对第4点的补充,如果是用idea的话,这里的provided需要改为compile,否则会提示找不到j2EE相关的包。

2.jar包改为war包后,有一些事情发生了变化,比如原来访问项目jar包起的都是直接地址+端口访问了,省略了项目的contextpath,比如我clone这个项目的代码,在freemaker的模板页面里,都是直接访问的资源路径,改成war之后,如果放在webapp下面是一定要带contextpath的,这样就不得不修改原来的访问路径。另外action里涉及到redirect的地方,也要加上项目的contextpath。

3.静态资源文件在打包时需要指定一下,尤其在开发时没有严格按照springboot约定放的话。也注意修改配置文件中的路径,使其与打包时的路径保持一致。

4.打war包成功,在本地测试无误,放到linux服务器上,总是起不来。我一开始就发现是jdk版本问题,因为服务器全局变量用的1.7,项目用的1.8,在之前测试jar包的时候,就特别指定了1.8的JDK,这次启动tomcat,也在网上搜了如何指定jdk,有人说是修改setclasspath.sh,修改过后,确实启动tomcat输出信息显示的jre是1.8.这个假象迷惑了我好几天,一度让我放弃打war包这条路。后来在这位仁兄的帖子里找到了有效的办法:https://blog.csdn.net/u012476249/article/details/54913482,就是直接在catalina.sh里面指定。我也是后来在逐行查看tomcat的启动日志时发现里面有个1.7的字样,才意识到是jdk的事。总之,这个坑是自己不好好读日志引起的,活该遭此一劫。

5.打包和启动的问题解决了,新的问题出现了:部署两个节点,资源文件,尤其是用户上传的图片资源,如何访问。正常的情况当然是建立一个单独的文件服务器,这样可以避免多节点带来的一系列问题。但是,我一开始根本没考虑这个问题。好在服务器上有NAS,如果把资源文件放在NAS上,大家实际访问的还是同一份数据。接下来就是解决资源文件外放后的访问问题,一开始我想通过搭建Nginx服务,使用动静分离的策略,单独指定静态资源的路径,这样需要多开一个端口,时间来不及。后来一查,tomcat中可以通过增加context属性,指定访问路径和实际路径的映射,比如:



这样把上传的文件指定到NAS目录中,两个节点上传的文件存在同一个地方,通过自己的服务地址都可以访问,就算负载均衡下,交叉访问也不会有问题。

6.其他的问题,一个是session问题,可能会出现用户在这个节点登陆,下一个请求被分配到另一个节点,要求重新登录的问题。由于负载均衡服务器是F5,一般是不给设置的,只能从应用角度解决。接下来要解决的问题。

7.总结来说,之所以遇到这么多问题,主要是自己对各种功能一知半解,在复杂的项目环境下不能见招拆招,从而持续踩坑。不过踩了坑之后,竟然觉得神清气爽。毕竟看别人的经验攻略即使再详细,也不如自己亲自经历一遍。

你可能感兴趣的:(java)