FastAPI+GCP+Docker架构下跨API通信出现SSLEOFError问题求助
FastAPI+GCP+Docker架构下跨API通信出现SSLEOFError问题求助
大家好,我现在遇到一个非常棘手的问题,想请教一下社区的朋友们。我的微服务架构部署在GCP上,用Python+FastAPI开发并做了Docker化处理,一共有7个API服务,互相之间通过HTTP请求完成通信。
三周前,我完全没有改动任何代码的情况下,突然出现了一个通信错误,实在找不到原因,希望能得到大家的帮助。
错误场景与具体报错
这个错误出现在Shipping API调用E-CommerceCommunication API的环节,报错信息如下:
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='anyurl', port=443): Max retries exceeded with url: /anyEndpoint (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1002)')))
奇怪的是,这个错误是在Shipping API完成两个正常HTTP请求后才触发的,完整的业务流程是:
- 生成运单(HTTP请求,正常完成)
- 为运单生成PDF文件(HTTP请求,正常完成)
- 向E-Commerce API发送物流信息(HTTP请求,此处失败)
相关配置与代码
Dockerfile
FROM python:3.11-slim-bookworm COPY . . ENV PYTHONUNBUFFERED=1 RUN pip install -r requirements.txt CMD exec gunicorn --bind :$PORT --workers 4 --worker-class uvicorn.workers.UvicornWorker --timeout 3600 Main:app
依赖包清单(requirements.txt)
-i https://pypi.org/simple anyio==3.7.0 ; python_version >= '3.7' cachetools==5.3.1 ; python_version >= '3.7' certifi==2023.5.7 ; python_version >= '3.6' charset-normalizer==3.1.0 ; python_full_version >= '3.7.0' click==8.1.3 ; python_version >= '3.7' colorama==0.4.6 ; platform_system == 'Windows' fastapi==0.99.1 fuzzywuzzy==0.18.0 google-api-core==2.11.1 ; python_version >= '3.7' google-auth==2.21.0 ; python_version >= '3.6' google-cloud-core==2.3.2 ; python_version >= '3.7' google-cloud-storage==2.10.0 google-crc32c==1.5.0 ; python_version >= '3.7' google-resumable-media==2.5.0 ; python_version >= '3.7' googleapis-common-protos==1.59.1 ; python_version >= '3.7' greenlet==2.0.2 ; platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32'))))) gunicorn==20.1.0 h11==0.14.0 ; python_version >= '3.7' idna==3.4 ; python_version >= '3.5' levenshtein==0.21.1 numpy==1.25.0 ; python_version >= '3.10' pandas==2.0.3 protobuf==4.23.3 ; python_version >= '3.7' pyasn1==0.5.0 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' pyasn1-modules==0.3.0 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' pydantic==1.10.10 ; python_version >= '3.7' pymysql==1.1.0 pypdf==3.12.0 python-dateutil==2.8.2 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' python-dotenv==1.0.0 python-multipart==0.0.6 pytz==2023.3 rapidfuzz==3.1.1 ; python_version >= '3.7' requests==2.31.0 ; python_version >= '3.7' rsa==4.9 ; python_version >= '3.6' and python_version < '4' setuptools==68.0.0 ; python_version >= '3.7' six==1.16.0 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' sniffio==1.3.0 ; python_version >= '3.7' sqlalchemy==2.0.17 starlette==0.27.0 ; python_version >= '3.7' suds==1.1.2 typing-extensions==4.7.1 ; python_version >= '3.7' tzdata==2023.3 ; python_version >= '2' urllib3==1.26.16 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' uvicorn==0.22.0
出错的请求代码
这是Shipping API调用E-CommerceComm-API的核心代码:
from Models.PydanticSchemes.GuidesScheme import DbGuides import requests class ECommerceCommunicationsAPI(): @staticmethod def UpdateOrders(Orders: list[DbGuides]): URL = "https://myurl.com/updateOrders" payload = [] for order in Orders: tracking_urls = { "Domina" : f"https://oriontracking.infokairos.com.co/envios/{order.GuideNumber}/tracking/cliente", "E-Box" : f"https://enviexpresslogistica.com/tracking/result/?NoGuia={order.GuideNumber}", "Coordinadora" : f"https://www.coordinadora.com/portafolio-de-servicios/servicios-en-linea/rastrear-guias/?guia={order.GuideNumber}" } orderJson = { "OrderNumber" : order.OrderNumber, "GuideNumber" : order.GuideNumber, "Company" : order.Company, "Tracking_URL" : tracking_urls[order.Company] } payload.append(orderJson) response = requests.post(URL, json = payload, verify = False) # 已经关闭证书验证,但问题依旧
已尝试的解决方案
我已经试过以下几种方法,但都没能解决问题:
- 将Docker基础镜像从
python:3替换为python:3.11-slim-bookworm - 删除所有依赖包后重新安装
- 卸载了pyopenssl库
- 将容器推送到全新的GCP实例运行
希望有经验的朋友能给我一些排查方向或者解决方案,非常感谢!
备注:内容来源于stack exchange,提问作者Dann V
相关产品推荐
相关产品推荐

