[英]Spring boot - Rest Service - Getting random HTTP status 400
[英]Spring boot service in kubernetes always responses with HTTP status 400
我們在Kubernetes運行Spring Boot服務。
該服務有端點:
- GET / healthz
我們有使用此端點的活動探測器。 探針成功運行。
這意味着可以從服務pod(localhost)訪問端點。
當我在服務pod中運行時: wget https://localhost:8080/healthz
我得到了答案(確定)
當我嘗試在pod wget https://myhost:8080/healthz
之外調用此端點時,我得到沒有正文的響應400 。
我沒有看到Sprint的任何日志。 它似乎沒有到達Sprint。
當我添加標志-Djavax.net.debug=all
我在日志中看到TLS握手完成然后:
GET /healthz HTTP/1.1
host: myhost:8080
accept: application/json
Connection: close
並立即
HTTP/1.1 400
Transfer-Encoding: chunked
Date: Mon, 25 Jun 201 8 08:43:43 GMT
Connection: close
當我嘗試wget https://myhost:8080/blahblah
(非現有端點)時,我仍然得到400,而不是404!
當我嘗試wget https://myWronghost:8080/healthz
(錯誤的主機)時,我收到一個錯誤的Bad address
。 這意味着主機'myhost'是正確的(否則我會收到此錯誤)。
Docker文件:
來自openjdk:8-jdk-alpine
VOLUME / tmp
ARG JAR_FILE
COPY $ {JAR_FILE} app.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding = UTF8
ENTRYPOINT [“java”,“ - Djavax.net.debug = all”,“ - Djava.security.egd = file:/ dev /./ urandom”,“ - jar”,“/ app.jar”]
EXP80 8080
加起來:
服務端點可從服務pod中訪問,但無法從pod外部訪問。
知道為什么嗎?
更新:
通過使用完全限定的域名調用服務來解決該問題: serviceName.namespaceName.svc.cluster.local
Tomcat不接受短域serviceName.namespaceName的調用,它回復400。
您的問題可能是由https://github.com/spring-projects/spring-boot/issues/13205引起的。 您所要做的就是將Tomcat版本升級到8.5.32。 您可以通過在pom.xml文件中添加版本來實現。
<properties>
<!-- your properties -->
<tomcat.version>8.5.32</tomcat.version>
</properties>
如果您使用的是Spring boot 2,這可能是由於Tomcat 8.5.31中的錯誤,它在FQDN的最后部分中不允許使用' - '
將Tomcat更新到8.5.32修復此問題。
參考:
不確定它是否對此有任何影響,但您正在使用https
嘗試所有內容。 你可以嘗試使用http
嗎? 您的春季應用程序可能不支持端口8080上的https。
通過使用完全限定的域名調用服務解決了該問題:
服務name.namespace-name.svc.cluster.local
該服務不接受service-name.namespace-name的調用,響應400。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.