如何为不支持Docker的Docmosis服务部署多转换器容器?
解决Docmosis多转换器容器的服务发现与连接问题
我刚好处理过类似的Docmosis容器化部署场景,给你梳理一套可行的方案,分服务发现搭建和Docmosis配置适配两部分来拆解:
一、先搞定服务发现:两种轻量适配Docker的方案
方案1:用Docker Swarm内置服务发现(最省心,贴合Docker生态)
如果你还没用到Swarm,只需要把现有容器转换成Swarm服务,就能自动获得服务发现和负载均衡能力:
- 初始化Swarm(单节点也可以用):
docker swarm init - 部署4个转换器实例作为Swarm服务:
部署完成后,Swarm会自动维护这4个实例,所有请求通过docker service create --name docmosis-converter \ --replicas 4 \ --publish 9080:9080 \ your-docmosis-converter-imagedocmosis-converter这个服务名就能分发到不同实例上——你不用关心具体容器的IP,Swarm的内置DNS会自动解析并做负载均衡。
方案2:用Consul做独立服务发现(适合不用Swarm的场景)
如果不想用Swarm,Consul是轻量且成熟的服务发现工具:
- 启动Consul容器:
docker run -d -p 8500:8500 --name consul consul:latest - 修改转换器的Dockerfile,加入Consul注册逻辑(启动转换器前把实例注册到Consul):
# 注册当前转换器实例到Consul curl -X PUT -d '{ "ID": "docmosis-converter-'$HOSTNAME'", "Name": "docmosis-converter", "Address": "'$HOSTNAME'", "Port": 9080, "Check": {"HTTP": "http://'$HOSTNAME':9080/health", "Interval": "10s"} }' http://consul:8500/v1/agent/service/register # 启动Docmosis转换器 java -cp your-classpath com.docmosis.converter.Main - 核心应用这边,可以通过Consul的DNS接口获取所有实例:把应用的DNS服务器指向Consul容器的IP,然后直接查询
docmosis-converter.service.consul就能拿到所有转换器的IP列表,再做客户端侧的负载均衡。
二、让Docmosis库适配服务发现
接下来要解决Docmosis库只认单个地址的问题,分三种情况处理:
情况1:Docmosis支持配置多个转换器地址
查一下Docmosis的配置文档,如果有类似docmosis.converter.urls这样的属性,直接把从服务发现拿到的所有实例地址用逗号分隔配置进去就行:
docmosis.converter.urls=http://converter-1:9080,http://converter-2:9080,http://converter-3:9080,http://converter-4:9080
注意:这种方式需要动态更新配置,当实例增减时要同步刷新,你可以写个简单的定时任务从服务发现拉取最新列表更新配置。
情况2:Docmosis支持自定义地址提供者
如果Docmosis提供了地址解析的扩展接口,你可以写一个自定义的地址提供者类,在里面调用Consul/Swarm的服务发现API获取实例列表,然后把这个类配置到Docmosis的属性中:
docmosis.converter.address.provider=com.yourcompany.ConsulConverterAddressProvider
这个类的逻辑大概是:调用Consul的/v1/catalog/service/docmosis-converter接口拿到所有实例,返回给Docmosis库。
情况3:Docmosis只支持单个地址(最常见的情况)
这种情况下,在核心应用和转换器之间加一层反向代理(比如Traefik或Nginx),让代理来做服务发现和负载均衡:
- 用Traefik的话,它能自动集成Swarm或Consul的服务发现,只需要配置Traefik监听服务发现的服务名,然后核心应用只需要配置Traefik的地址即可,比如
docmosis.converter.url=http://traefik:8080/docmosis,Traefik会自动把请求转发到所有转换器实例。
调试小技巧
- 先验证服务发现是否正常:用
docker service inspect docmosis-converter(Swarm)或者curl http://consul:8500/v1/catalog/service/docmosis-converter(Consul),确认能拿到4个实例的信息。 - 查看Docmosis的日志,确认它是否在使用配置的地址,有没有重试或负载均衡的逻辑。
内容的提问来源于stack exchange,提问作者tofagerl
相关产品推荐
相关产品推荐

