Spring 项目如何实现可以拆开部署也可以合并成一个 web 项目部署

2020-04-23 16:00:33 +08:00
 rizon

我们有几个 spring 服务,期望实现的效果是:

在某些客户方,我们把这几个服务作为一个 web 服务来部署。

在某些客户方,我们把服务拆分成多个 web 服务来部署。

有什么好的实现办法吗?

4125 次点击
所在节点    程序员
27 条回复
rizon
2020-04-23 16:32:20 +08:00
木有人吗? 果然是太奇葩了吗,,但是现实就是如此啊,生活总比小说敢演
wky809982944
2020-04-23 16:37:08 +08:00
如果是 SpringCloud,父 maven 打成一个 jar 和每个 maven 分别打 jar,或者再进一步,根据业务打成不同的 docker 镜像(随便说的,才大三)
rizon
2020-04-23 16:38:05 +08:00
@wky809982944 #2 你说的这种打 jar 的方式在考虑,但是具体操作起来 有点麻烦,没找到可行的方案
0x666666
2020-04-23 16:42:16 +08:00
@rizon 上家公司就是用 Spring cloud, 每个服务一个 jar 包,然后通过 docker+k8s 部署
rizon
2020-04-23 16:44:01 +08:00
@0x666666 #4 这是分开部署没什么问题。现在的问题是,需要能把多个 jar 包合并成一个 web 服务来部署
wky809982944
2020-04-23 16:45:17 +08:00
@rizon 打 jar 应该不麻烦吧,mvn package clean 就行,一个 maven 模块对应一个微服务对应一个 jar 包,根据业务需要组装对应的 jar 包为 docker 镜像就行了,不同的客户对应不同的 Git 分支写不同的 jekins 脚本然后部署到 k8s 上
wky809982944
2020-04-23 16:47:24 +08:00
@rizon 一个 docker 镜像能对应多个 jar 包,没毛病啊
gz911122
2020-04-23 16:49:45 +08:00
@rizon 一个 docker 里面塞多个 jar 包完事 ,反正从外面看上去是一个不就得了
louis2003
2020-04-23 16:52:55 +08:00
多个部署好了 用 nginx 转发不就好了 都是多个部署 ,或者前面加一个 gateway 配置一下路径转发。
louis2003
2020-04-23 16:54:14 +08:00
其他的方式肯定要修改蛮多的。
wky809982944
2020-04-23 16:54:40 +08:00
@gz911122 说实话不太符合 docker 的设计原则,docker 不能当虚拟机用,一个 docker 最好还是对应一个微服务,非要合在一起还是打成一个 jar 靠谱,当然用是能用
rizon
2020-04-23 16:55:17 +08:00
@wky809982944 #7
@gz911122 #8
@louis2003 #9

那不行,需要实现的是合并成一个 jar 包。。作为一个 spring 服务来启动。
odirus
2020-04-23 16:59:08 +08:00
要不每个微服务打包成两种?一种是 jar 、一种是 war,需要合并的话就把多个 war 包丢到一个 Tomcat 里面
undeflife
2020-04-23 16:59:46 +08:00
yalin
2020-04-23 17:01:21 +08:00
假装微服务?
NoKey
2020-04-23 17:09:30 +08:00
个人感觉,看能不能从工程上下手,把整个工程改成多个子工程,然后在 maven 上进行配置,通过配置某个关键字进去,打包成整体或者打包成分开的,找个 maven 高手来问问看可行不
gemini767
2020-04-23 17:10:40 +08:00
我的思路是重构 业务代码分模块 多模块部署就是每一个模块一个 main 打 jar
单模块部署就是单独建一个 main 模块,把之前多模块全部依赖进来,合并一个 main 打 jar

理论上这样改冻最小 只是剥离出入口函数和业务耦合部分
hengyunabc
2020-04-23 17:46:38 +08:00
用 spring boot 是可以做到的,不过对代码的控制要求有点高。要灵活运用各种 `@Configuration` 来组织 service web 配置,可以参考 spring boot 官方的项目: https://github.com/spring-io/initializr,它的各种模块都是独立的。
lqw3030
2020-04-23 18:01:22 +08:00
把模块打进 jar 然后自定义一个类加载器按需求加载模块
guyeu
2020-04-23 18:57:18 +08:00
我们也有这个需求,实现方式是一个 maven 模块,按包划分子模块,每个子模块有单独的 SpringBootApplication 主类,单独启可以单独启子模块的 SpringBootApplication 主类,合并启的话 springboot 原生支持的,SpringApplication.run 有一个重载可以传入多个主类。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/665371

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX