Swagger UI 试试吧!不适用于 Kubernetes 入口

mve*_*ezm 5 swagger swagger-ui spring-boot kubernetes kubernetes-ingress

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

它在本地主机中正常工作(使用邮递员和 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
Run Code Online (Sandbox Code Playgroud)

现在入口:

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
Run Code Online (Sandbox Code Playgroud)

然后,在线部署在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 路径。

谢谢!

Rya*_*son 3

问题是如何使 swagger 的基本路径与代理后面使用的路径相匹配。根据https://github.com/springfox/springfox/issues/1443有不止一种解决方案

由于您有一个特定的主机,我建议使用该主机来更改 swagger 根据请求发送到的主机所了解的基本路径。通过这种方式,您可以为本地主机和远程主机进行不同的设置。您需要在 Swagger @Configuration 类的自定义摘要部分中为主机设置relativepathprovider,如https://github.com/springfox/springfox/issues/1443#issuecomment-274540681