微服务打包方式的选择,jar还是war?

sprouting 发布于 2020/11/19 16:13
阅读 14K+
收藏 14

NGINX社区官方微服务训练营,深入了解K8s网络,线上课程+专家答疑,立即加入>>>

微服务打包方式的选择,jar还是war?

公司刚刚开始摸索使用微服务,之前的项目打包都是war包的形式,丢到tomcat中就好了,上了微服务,发现似乎主流都是直接打成jar包,或者说,直接编写dockerFile文件,打成镜像,然后运行镜像就行了。

公司现在的打包方式还是传统的先打成war,然后丢到docker容器的映射目录下,自动解压war包,其实就是把docker当成一个小的虚拟机来使用。因为服务也不算太多,这种方式还算可以接受,而且涉及到修改配置,升级tomcat的时候都比较方便,总结起来,就是将docker当成了虚拟机在使用。项目因为不算太大,k8s和配置中心都没有加入。

想问下,大家部署是怎么弄的,如果涉及到tomcat的升级,临时性修改某些配置怎么办呢?

加载中
12
叁拾

war 需要 appserver 作为底层环境支持,配置上war 自己的参数和 appserver 的参数也需要分开配置,这种 deployment 还能叫“微”服务吗?

可见提问的人不懂微服务的基本概念,连个 self-contained 意识都没有……估计就是公司把项目一扔也没人带的野孩子,或者带你的前辈也是野孩子出身……

攻城达瓦里什
攻城达瓦里什
我就是大神嘴里的野孩子。。。突然成了野孩子了。
安宇雨
安宇雨
现实可能就是这样,大神!
s
salmon514
有道理!
猴哥_Z
猴哥_Z
所有评论中,你是最优秀的
6
东胜神洲
东胜神洲

这哥俩是不同规范的产物,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 包是不二之选。。。其他的情况下,参考应用所跑的环境,使用官方建议进行(因为官方建议的背后会有一套完整的支持,通常不太需要过多的额外定制)

 

2
RobertLu
RobertLu

其实真正的选项只有jar和war(Dockerfile的话,也要从war和jar中选择一个,然后放到镜像中)。

Spring官方时推荐jar的,从Spring boot、Spring cloud的官方文档就可以看出来。

另外一点就是,jar的方式也一直在优化,比如最近支持了分层jar,而war方式就一直没有改进。

 

所以,结论就是,开始用jar吧。

也许________
也许________
请教一下 分层jar 怎么玩
kakai
kakai
Spring boot、Spring cloud因为内嵌了web容器,所以才首选jar。war包是专供web容器使用的,可以包含jar,其结构基本固定,除非web容器规范改变。
0
练打字的
练打字的

1. dockerFile
2.jar

3.war

0
wangboak
wangboak

打包的目标文件就一个 app.jar。

启动脚本都一样。

0
六峰山顶专业摄像师

tomcat web性能应该比springboot的要好吧,只是感觉,

eeKiEasd
eeKiEasd
回复 @六峰山顶专业摄像师 : 个人觉得tomcat配置还要去web容器上修改 ,springboot更方便yml还可以区分多个环境的配置明显更优秀啊,唯一的点是tomcat在xml容器支持修改的参数多一点,这点也可以通过重写start解决稍微麻烦点就是了
你们都是技术宅
你们都是技术宅
springboot用的也是tomcat,何来性能差距,不能凭感觉
六峰山顶专业摄像师
回复 @eeKiEasd : 应该是tomcat的配置硬加易于修改调优化,只要改配置文件就行了,sprintboot修改tomcat配置比较麻烦
eeKiEasd
eeKiEasd
都是一样的代码何来更好,都是启动socket监听一模一样的容器代码人家在springboot启动了serverstart方法和sh脚本启动的main方法完全没区别
s
salmon514
你这是似懂非懂的结论;你写的程序还远远达不到阿里的规模
0
风华神使
风华神使

当然是jar。你们现在的打包方式还是虚拟机时代的思维,既然选了容器,方式要变一变

0
hythzx
hythzx

推荐Jib

0
季圣华
季圣华
该评论暂时无法显示,详情咨询 QQ 群:点此入群
0
gammey
gammey

你这种方式其实挺好的,如果你的项目包很大,你会发现你的容器会非常大,维护起来还是很麻烦的,但挂在外面还是挺好的。

但你如果用k8s,就涉及到要把pod分配到指定节点进行挂载,建议还是用dockerfile+jar比较好,如果项目真的大,就别用容器了。

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部