springcloud gateway集成swagger3实现API统一入口
背景
项目使用springcloud gateway作为网关,统一路由各个服务的请求。产品为微服务架构,每一个web controller聚合服务都需要暴露接口给前端(VUE组件实现swagger自动配置API出入参和类型)。在云原生背景下,暴露每个web聚合服务的路由运维成本高且使用不方便。因此使用网关作为open api入口,实现每个聚合服务的接入、访问和debug.
组件
spring-cloud-starter-gateway:2.2.6.RELEASE
springfox-swagger:3.0.0
简易架构图
接入swagger
1. 聚合服务
- pom
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
</dependency>
- configuration for java code
package com.lee.web.config.swagger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import java.util.ArrayList;
import java.util.List;
@Configuration
@EnableOpenApi
public class SwaggerConfig {
@Value("${swagger.switch:true}")
private String switchFlag;
/**
* docket 不加载也可以,swagger会有默认的docket,其作用是分组
*
* @return Docket
*/
@Bean(value = "WebApiDocket")
@Profile({
"dev", "test", "pre"})
public Docket defaultApiDocket() {
return new Docket(DocumentationType.OAS_30)
// 开启开关
.enable(Boolean.parseBoolean(switchFlag))
.apiInfo(apiInfo())
// 分组名称
.groupName("WebApiDocket")
//分组名称
.select()
//这里指定Controller扫描包路径
.apis(RequestHandlerSelectors.basePackage("com.lee.web"))
// 分组路径
.paths(PathSelectors.any())
.build();
// .securitySchemes(securitySchemes())
// .securityContexts(securityContexts());
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder().title("web页面")
.description("web页面")
.contact(new Contact("lighter", null, "lee@gmail.com"))
.version("lee.v1.0")
.build();