我们有几个 spring 服务,期望实现的效果是:
在某些客户方,我们把这几个服务作为一个 web 服务来部署。
在某些客户方,我们把服务拆分成多个 web 服务来部署。
有什么好的实现办法吗?
1
rizon OP 木有人吗? 果然是太奇葩了吗,,但是现实就是如此啊,生活总比小说敢演
|
2
wky809982944 2020-04-23 16:37:08 +08:00
如果是 SpringCloud,父 maven 打成一个 jar 和每个 maven 分别打 jar,或者再进一步,根据业务打成不同的 docker 镜像(随便说的,才大三)
|
3
rizon OP @wky809982944 #2 你说的这种打 jar 的方式在考虑,但是具体操作起来 有点麻烦,没找到可行的方案
|
6
wky809982944 2020-04-23 16:45:17 +08:00
@rizon 打 jar 应该不麻烦吧,mvn package clean 就行,一个 maven 模块对应一个微服务对应一个 jar 包,根据业务需要组装对应的 jar 包为 docker 镜像就行了,不同的客户对应不同的 Git 分支写不同的 jekins 脚本然后部署到 k8s 上
|
7
wky809982944 2020-04-23 16:47:24 +08:00
@rizon 一个 docker 镜像能对应多个 jar 包,没毛病啊
|
9
louis2003 2020-04-23 16:52:55 +08:00
多个部署好了 用 nginx 转发不就好了 都是多个部署 ,或者前面加一个 gateway 配置一下路径转发。
|
10
louis2003 2020-04-23 16:54:14 +08:00
其他的方式肯定要修改蛮多的。
|
11
wky809982944 2020-04-23 16:54:40 +08:00
@gz911122 说实话不太符合 docker 的设计原则,docker 不能当虚拟机用,一个 docker 最好还是对应一个微服务,非要合在一起还是打成一个 jar 靠谱,当然用是能用
|
12
rizon OP |
13
odirus 2020-04-23 16:59:08 +08:00
要不每个微服务打包成两种?一种是 jar 、一种是 war,需要合并的话就把多个 war 包丢到一个 Tomcat 里面
|
14
undeflife 2020-04-23 16:59:46 +08:00
|
15
yalin 2020-04-23 17:01:21 +08:00
假装微服务?
|
16
NoKey 2020-04-23 17:09:30 +08:00
个人感觉,看能不能从工程上下手,把整个工程改成多个子工程,然后在 maven 上进行配置,通过配置某个关键字进去,打包成整体或者打包成分开的,找个 maven 高手来问问看可行不
|
17
gemini767 2020-04-23 17:10:40 +08:00
我的思路是重构 业务代码分模块 多模块部署就是每一个模块一个 main 打 jar
单模块部署就是单独建一个 main 模块,把之前多模块全部依赖进来,合并一个 main 打 jar 理论上这样改冻最小 只是剥离出入口函数和业务耦合部分 |
18
hengyunabc 2020-04-23 17:46:38 +08:00
用 spring boot 是可以做到的,不过对代码的控制要求有点高。要灵活运用各种 `@Configuration` 来组织 service web 配置,可以参考 spring boot 官方的项目: https://github.com/spring-io/initializr,它的各种模块都是独立的。
|
19
lqw3030 2020-04-23 18:01:22 +08:00
把模块打进 jar 然后自定义一个类加载器按需求加载模块
|
20
guyeu 2020-04-23 18:57:18 +08:00
我们也有这个需求,实现方式是一个 maven 模块,按包划分子模块,每个子模块有单独的 SpringBootApplication 主类,单独启可以单独启子模块的 SpringBootApplication 主类,合并启的话 springboot 原生支持的,SpringApplication.run 有一个重载可以传入多个主类。
|
21
guyeu 2020-04-23 18:57:43 +08:00
当然同样的原理,分成 maven 子模块也可以。
|
22
wangxiaoaer 2020-04-23 19:16:06 +08:00
app-1:jar
app-2:jar app-3:jar app-1-release:war <--app-1.jar app-2-release:war <--app-2.jar app-3-release:war <--app-3.jar app-all-release:war <-- app-1.jar,app-2.jar,app-3.jar maven 的话一共 7 个 module,需要哪个打包哪个 |
23
rizon OP @guyeu #20 怎么解决 web 的上下文问题?每个独立部署的时候 有自己的 context-path 合并之后 上下文怎么办?
|
24
SaltedFish12138 2020-04-23 20:10:12 +08:00
我觉得,从大的方向上来说,你要在变化的客户需求之前,保证自己牢固的项目基础。如果可能,尽量以外部工具和设置满足客户差异化的部署需求。
就楼主的实际情况来分析: 1. 做成微服务,至于各模块要拆开为不同的项目,还是 subproject 或者 module 就随意了 2. 用 docker 部署, 每个微服务不同的 dockerfile (实现多服务部署);再做一个 dockerfile,把所有微服务集成到一个 docker image 里(实现一个服务部署)(诚如楼主所言,不太符合 docker 设计原则,但客户需求千奇百怪,咱也得灵活运用工具不是) 3. 多服务部署时,使用 docker compose 维护依赖和各容器间环境变量的关系。单服务的环境变量和上下文就很随意了,用 docker 设置还是 Spring 配置文件就看自己需求了 |