微服务打包方式的选择,jar还是war?
微服务打包方式的选择,jar还是war?
公司刚刚开始摸索使用微服务,之前的项目打包都是war包的形式,丢到tomcat中就好了,上了微服务,发现似乎主流都是直接打成jar包,或者说,直接编写dockerFile文件,打成镜像,然后运行镜像就行了。
公司现在的打包方式还是传统的先打成war,然后丢到docker容器的映射目录下,自动解压war包,其实就是把docker当成一个小的虚拟机来使用。因为服务也不算太多,这种方式还算可以接受,而且涉及到修改配置,升级tomcat的时候都比较方便,总结起来,就是将docker当成了虚拟机在使用。项目因为不算太大,k8s和配置中心都没有加入。
想问下,大家部署是怎么弄的,如果涉及到tomcat的升级,临时性修改某些配置怎么办呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(20)
你这种方式其实挺好的,如果你的项目包很大,你会发现你的容器会非常大,维护起来还是很麻烦的,但挂在外面还是挺好的。
但你如果用k8s,就涉及到要把pod分配到指定节点进行挂载,建议还是用dockerfile+jar比较好,如果项目真的大,就别用容器了。
推荐Jib
你这是似懂非懂的结论;你写的程序还远远达不到阿里的规模
当然是jar。你们现在的打包方式还是虚拟机时代的思维,既然选了容器,方式要变一变
都是一样的代码何来更好,都是启动socket监听一模一样的容器代码人家在springboot启动了serverstart方法和sh脚本启动的main方法完全没区别
回复
应该是tomcat的配置硬加易于修改调优化,只要改配置文件就行了,sprintboot修改tomcat配置比较麻烦
springboot用的也是tomcat,何来性能差距,不能凭感觉
回复
个人觉得tomcat配置还要去web容器上修改 ,springboot更方便yml还可以区分多个环境的配置明显更优秀啊,唯一的点是tomcat在xml容器支持修改的参数多一点,这点也可以通过重写start解决稍微麻烦点就是了
tomcat web性能应该比springboot的要好吧,只是感觉,
1. dockerFile
2.jar
3.war
打包的目标文件就一个 app.jar。
启动脚本都一样。
Spring boot、Spring cloud因为内嵌了web容器,所以才首选jar。war包是专供web容器使用的,可以包含jar,其结构基本固定,除非web容器规范改变。
请教一下 分层jar 怎么玩
其实真正的选项只有jar和war(Dockerfile的话,也要从war和jar中选择一个,然后放到镜像中)。
Spring官方时推荐jar的,从Spring boot、Spring cloud的官方文档就可以看出来。
另外一点就是,jar的方式也一直在优化,比如最近支持了分层jar,而war方式就一直没有改进。
所以,结论就是,开始用jar吧。
这哥俩是不同规范的产物,Jar 是 Java 的规则类库的打包形式,换句话来说,只要是 Java,就必然支持并使用 Jar,就象是人的零部件一样,是个正常人都会都会自带使用。。War 是 J2EE 规范的产品,是参考 Jar 的基础上,为了 J2EE (中Servlet 容器)而定制的(特定)打包格式。。因此,其只能在 Servlet 容器中使用(不包括 Servlet 容器作为应用本身的一部分存在),很明显两者的有着各自的使用场景。。如果你的应用跑在一个外部 Servlet 容器时,通常会建议使用 War 来打包(正常情况下,也只能以 War 形式打包),但如果不是一个外部 Servlet 容器,你硬用 war 来打包,除了增添烦恼以外,好象也没什么好处,所以正常来说会以你所跑的环境所指定的官方格式打包。。例如 SpringBoot 环境,官方建议打包成 jar (无论跑不跑在 docker 环境)。。
再简说 Jar 与 War 之间的差异。。。两者都是 zip 压缩文件,区别在于:war 对内部有着特别的规定,例如标准的资源文件应放在那里,所引用的外部 jar 包应该放在那里,所编译好的 class 应该放在那里,这样 Servlet 容器就能根据这些特定的位置找到所需要的内容,而 jar 就灵活得多,放什么,怎么放,除了一些简单的 META-INF 的描述外,就依赖你的需求,即从另一个角度来看,对 jar 内容的加载(特别是资源文件),更多依赖你的应用和运行环境,jar 本身并没提供特定的支持(不象 war 对于 servlet 容器)。。。这引申出来:如果你的运行环境或框架,并没有提供 jar 包格式要求的话,你就要自己来编写从 jar 包加载内容的代码。。。SpringBoot 建议打包成 jar 包,涉及到资源文件的加载时,为什么会有一些约定(目录)或配置的原因。。
总结:如果你的应用是跑在外部 Servlet 容器的话,打成 war 包是不二之选。。。其他的情况下,参考应用所跑的环境,使用官方建议进行(因为官方建议的背后会有一套完整的支持,通常不太需要过多的额外定制)
所有评论中,你是最优秀的
有道理!
现实可能就是这样,大神!
我就是大神嘴里的野孩子。。。突然成了野孩子了。
war 需要 appserver 作为底层环境支持,配置上war 自己的参数和 appserver 的参数也需要分开配置,这种 deployment 还能叫“微”服务吗?
可见提问的人不懂微服务的基本概念,连个 self-contained 意识都没有……估计就是公司把项目一扔也没人带的野孩子,或者带你的前辈也是野孩子出身……