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

时间:2018-08-14 08:15:36

标签: spring-boot kubernetes swagger swagger-ui kubernetes-ingress

我们有一个带有Swagger和docker的Java Spring Boot项目。我们将其部署在入口控制器后面的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上,使用诸如邮递员之类的应用程序,我们必须调用: 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路径。

谢谢!

1 个答案:

答案 0 :(得分:1)

问题在于如何获取swagger的基本路径以匹配代理后面正在使用的路径。根据{{​​3}}

有不止一种解决方案

由于您有一个特定的主机,因此建议您与该主机一起根据请求所要访问的主机更改swagger知道的基本路径。这样,您可以为本地主机和远程主机进行不同的设置。您需要在Swagger @Configuration类的自定义记录部分中为主机设置一个RelativePathProvider,例如https://github.com/springfox/springfox/issues/1443