Docker Compose部署下Spring Cloud Gateway调用微服务异常问题求助
问题1:Docker Compose环境下localhost连接失败原因
Docker 为每个容器分配了独立的网络命名空间,容器内的localhost指向的是容器自身,而非宿主机或同网络下的其他容器。Docker Compose 启动时会默认创建一个内部桥接网络,所有服务会自动加入这个网络,且可以通过docker-compose.yml中定义的服务名作为主机名互相解析访问。
你之前将路由uri改为服务名的思路是正确的,但配置存在格式错误,也是后续空响应的诱因之一。
问题2:200 OK空响应解决方案
按优先级排查以下配置即可:
- 修正网关路由uri的协议前缀
你当前的配置缺少http://前缀,Spring Cloud Gateway 无法正确识别转发协议,会导致响应处理异常。将所有路由的uri改为如下格式:
uri: 'http://books-ms:8000'
同理其他服务的uri也要补上http://前缀。另外注意你的路由ID存在重复配置,两个用户服务的路由ID均为user_service,请修改为唯一值,避免配置加载时出现覆盖或异常。
- 验证服务本身的接口响应
直接在宿主机调用localhost:8000/api/books,确认服务单独访问时能正常返回数据:- 如果直接调用也返回空:说明是books-ms自身的问题,检查数据库的
books表是否有数据,或者接口的序列化配置是否过滤了正常返回字段 - 如果直接调用返回正常:继续排查网关配置
- 如果直接调用也返回空:说明是books-ms自身的问题,检查数据库的
- 检查网关路径转发规则
如果你的books-ms接口没有/api前缀,需要添加StripPrefix过滤器截断路径,示例配置如下:
- id: book_service uri: 'http://books-ms:8000' predicates: - Path=/api/books/** filters: - StripPrefix=1 # 会把路径的第一级/api去掉,转发到服务的路径为/books/**
- 排查网关全局配置
检查是否配置了全局响应修改过滤器、跨域拦截规则,是否存在错误清空响应体的逻辑。
前端访问问题补充
前端代码运行在用户浏览器中,浏览器无法解析Docker内部的服务名,所以前端的API请求地址直接写宿主机的网关地址http://localhost:8080即可,不需要修改为服务名。
内容的提问来源于stack exchange,提问作者perrywinkle
相关产品推荐
相关产品推荐

