Swagger UI 试试吧!不适用于 Kubernetes ingress

Swagger UI try It! does not work with Kubernetes ingress

我们有一个 Java Spring 带有 Swagger 和 docker 的引导项目。我们将其部署在入口控制器后面的 kubernetes 上。

它在 localhost 中正常工作(使用 postman 和 swagger-ui 尝试按钮)。 一部署就出问题了

休息控制器:

@ApiOperation(value = "Operation", 
          notes = "it does something<br />")
@RequestMapping(value="/operation", method=RequestMethod.POST)
@ApiResponses({
    @ApiResponse(code = 200, message = "OK")
})
@ResponseBody public ResponseEntity<String> operation(@RequestBody BodyThing thing) {

    return new ResponseEntity<>("OK", HttpStatus.OK);
} //operation

现在入口:

apiVersion: extensions/v1beta1
kind: Ingress

metadata:
  name: myapp-ingress
  namespace: __NAMESPACE__
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /

spec:
  tls:
  - hosts:
    - test.host.com
    secretName: key-pair
  rules:
  - host: test.host.com


http:
  paths:
  - path: /myapp
    backend:
      serviceName: myapp-service
      servicePort: 8080

然后,应用在线部署在K8S上,使用类似postman的应用,我们必须调用: https://test.host.com/myapp/operation 才能调用 API。没问题。

如果我们在Swagger中输入问题就来了UI传送门:https://test.host.com/myapp/swagger-ui.html

如果我们尝试在 swagger UI 中调用 API,它会尝试调用 https://test.host.com/operation,但失败并显示 404 代码。

Swagger-UI 使端点 URL 具有:host + basepath + operation_path 即:test.host.com + / + operation

它不聚合入口路径。

我们该如何应对? 当然,只有当我们使用入口控制器部署它时才会发生这种情况,因为我们添加了 /myapp 路径。

谢谢!

问题是如何让 swagger 的基本路径与代理后面使用的路径相匹配。根据 https://github.com/springfox/springfox/issues/1443

有不止一种解决方案

由于您有一个特定的主机,我建议您使用该主机根据请求转到的主机更改 swagger 知道的基本路径。这样您就可以为本地主机和远程主机设置不同的设置。您需要在 Swagger @Configuration class 的自定义摘要部分为您的主机设置一个 RelativePathProvider,就像在 https://github.com/springfox/springfox/issues/1443#issuecomment-274540681

中一样