线上k8s环境swagger2调用接口失败

最近后端项目集成了swagger2,浏览器正常打开了swagger-ui.html,但是调用接口时却报404错误,仔细一看是接口调用地址和浏览器访问地址并不相同。

线上k8s环境swagger2调用接口失败_第1张图片

分析了下接口调用地址的host,它竟然是k8s环境中的后端应用的service。

由于当前项目通过k8s部署,前端和后端app均以容器的形式运行在pod之中,pod之间通过service指定的host和端口号来进行访问,所以浏览器打开swagger-ui.html后,swagger2实际调用的接口地址的host也变成了service,所以会出现404。

解决这个问题的方案很简单,即为swagger2指定host:

初始化Docket对象时通过host方法指定swagger2的host:

@Value("${swagger.host}")
private String swaggerHost;

new Docket(DocumentationType.SWAGGER_2).host(swaggerHost)
        .groupName("demo")
        .apiInfo(getApiInfo())
        .select()...

将接口地址配置在application.properties中:

swagger.host=xxx.biz/api

这种方案虽然可行,但是不推荐。

由于当前后端应用部署在k8s环境中,镜像挂载到不同namespace中,不同的namespace就是不同的开发环境,而所有镜像都使用了同一个配置文件,所以这就意味着不同开发环境的swagger2调用了同一个地址,显然不合理。如果要避免这个情况,则每次发版打镜像时都需要修改application.properties中的host,很不方便。

所以当前项目决定将swagger2的host配置到k8s的环境变量里面,由于不同开发环境创建Deployment对象的配置文件不同,所以避免了不同环境共用同一个host的情况。

最终解决方案:

在application.properties中添加:

swagger.host=${SERVER_HOST}

在创建Deployment对象的配置文件aws-k8s-devx.yaml中添加:

- name: SERVER_HOST
  value: xxx.biz/api            

 

你可能感兴趣的:(SpringBoot,swagger)