WildFly 32.0.1部署互通信双应用遇访问异常求助
问题分析与解决方案
核心问题梳理
- Spring Boot端口配置无效:部署到WildFly的WAR包,
application.properties中的server.port会被容器忽略,端口由WildFly的Socket Binding和Undertow配置决定。 - 虚拟主机与监听器未绑定:额外创建的HTTP监听器未关联到对应虚拟主机,导致访问端口时仍路由到默认主机的欢迎页。
- Socket Binding端口冲突:配置中
connex-http和http3都使用8888端口,引发端口占用问题。 - 虚拟主机访问逻辑不匹配:未正确关联监听器与主机,导致WildFly无法识别不同端口对应的应用。
具体修复步骤
1. 修正Socket Binding端口冲突
编辑standalone.xml的socket-binding-group,删除重复端口配置,保留清晰的绑定关系:
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}"> <socket-binding name="ajp" port="${jboss.ajp.port:8009}"/> <socket-binding name="http" port="${jboss.http.port:8080}"/> <!-- 为两个应用分别配置独立端口,命名更清晰 --> <socket-binding name="xsupport-http" port="8889"/> <socket-binding name="connex-http" port="8888"/> <socket-binding name="https" port="${jboss.https.port:8443}"/> <socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"/> <socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9993}"/> <socket-binding name="tenant-http" interface="public" port="8887" fixed-port="false"/> <socket-binding name="txn-recovery-environment" port="4712"/> <socket-binding name="txn-status-manager" port="4713"/> <outbound-socket-binding name="mail-smtp"> <remote-destination host="${jboss.mail.server.host:localhost}" port="${jboss.mail.server.port:25}"/> </outbound-socket-binding> </socket-binding-group>
2. 绑定HTTP监听器与虚拟主机
修改Undertow子系统配置,让每个监听器默认关联对应虚拟主机,确保访问指定端口时直接路由到目标应用:
<subsystem xmlns="urn:jboss:domain:undertow:14.0" statistics-enabled="true"> <byte-buffer-pool name="default" buffer-size="1024" max-pool-size="1024"/> <buffer-cache name="default"/> <server name="default-server"> <http-listener name="default" socket-binding="http" buffer-pool="default" redirect-socket="https" enable-http2="true"/> <!-- 给xsupport应用的监听器指定默认主机 --> <http-listener name="xsupport-http" socket-binding="xsupport-http" buffer-pool="default" enable-http2="true" default-host="xsupport-web"/> <!-- 给connex应用的监听器指定默认主机 --> <http-listener name="connex-http" socket-binding="connex-http" buffer-pool="default" enable-http2="true" default-host="connex"/> <https-listener name="https" socket-binding="https" buffer-pool="default" ssl-context="applicationSSC" enable-http2="true"/> <host name="default-host" alias="localhost"> <location name="/" handler="welcome-content"/> <filter-ref name="server-header"/> <filter-ref name="x-powered-by-header"/> </host> <!-- 配置xsupport应用的虚拟主机,指定默认WAR包 --> <host name="xsupport-web" alias="xsupport.com" default-web-module="xsupport-tool-1.0.0.war"/> <!-- 配置connex应用的虚拟主机,指定默认WAR包 --> <host name="connex" alias="connex-api.com" default-web-module="connex-1.0.0.war"/> </server> <servlet-container name="default"> <jsp-config/> <websockets/> </servlet-container> <handlers> <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/> </handlers> <filters> <response-header name="server-header" header-name="Server" header-value="WildFly/18"/> <response-header name="x-powered-by-header" header-name="X-Powered-By" header-value="Undertow/1"/> </filters> </subsystem>
3. 移除Spring Boot的无效端口配置
编辑两个应用的application.properties,删除server.port配置(容器部署时该配置不生效):
- App A(xsupport-tool):
spring.config.import=classpath:api-endpoints.properties server.servlet.session.timeout=450m spring.main.allow-bean-definition-overriding=true
- App B(connex):
spring.config.import=classpath:query-config.properties apiPrefix=/api web.endpoint=http://localhost:8887/ logging.level.org.springframework.jdbc.core=TRACE spring.main.allow-bean-definition-overriding=true management.endpoints.web.exposure.include=*
4. 验证应用部署状态
登录WildFly管理控制台(http://localhost:9990),确认两个WAR包均处于已启动状态,且default-web-module配置的文件名与实际部署的WAR包完全一致(包括版本号)。
5. 测试访问与应用间通信
- 访问App A的UI:
http://localhost:8889 - 访问App B的API:
http://localhost:8888/api/xxx(替换xxx为具体接口路径) - App A调用App B时,直接使用
http://localhost:8888/api/xxx作为请求地址即可。
内容的提问来源于stack exchange,提问作者Lehlohonolo Nkosi
相关产品推荐
相关产品推荐

