SpringCloudGateway整合knife4j在線api文檔
整合官網: (點擊打開)
1.User用戶微服改造
1.1 添加依賴
<!--knife4j-micro-包含swagger2依賴-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-micro-spring-boot-starter</artifactId>
<version>2.0.2</version>
</dependency>
1.2 編寫Swagger2Config
@Configuration
@EnableSwagger2
@EnableKnife4j
public class Swagger2Config {
/**
* 創建RestApi 幷包掃描controller
* @return
*/
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.any())// 對所有api進行監控
.paths(PathSelectors.any())
//不顯示錯誤的接口地址
.paths(Predicates.not(PathSelectors.regex("/error.*")))//錯誤路徑不監控
.build();
}
/**
* 創建Swagger頁面 信息
* @return
*/
private ApiInfo apiInfo() {
return new ApiInfoBuilder().title("用戶微服")
.description("用戶微服")
.version("1.0.0-SNAPSHOT")
.build();
}
}
1.3 application
配置文件加上,開啓生產環境不啓用文檔
#生產環境,屏蔽文檔接口(默認false)
knife4j.production=${knife4j}
1.4 接口註解編寫
@RestController
@Api(tags = "用戶管理",value = "獲取用戶信息")
public class WebController {
@Autowired
private OrderFeignService orderFeignService;
@ApiOperation(value = "用戶查詢", notes = "獲取測試",response = String.class)
@ApiImplicitParams({@ApiImplicitParam(name = "name", value = "用戶名", dataType = "STRING", paramType = "QUERY", defaultValue = "lilei",required = true)})
@GetMapping(value = "/hi")
public String hi(String name){
String id = orderFeignService.findId(name);
return id;
}
@ApiOperation(value = "MemberVip查詢", notes = "獲取MemberVip測試",response = MemberVip.class)
@GetMapping(value = "/hello")
public MemberVip hello(){
MemberVip memberVip = new MemberVip();
memberVip.setId("123456");
memberVip.setMemberId("654321");
memberVip.setUsedNubmer(888);
memberVip.setLimitNumber(666);
memberVip.setExpiredNumber(999);
memberVip.setVipLevel(100);
return memberVip;
}
}
1.5 實體類註解編寫
public class MemberVip implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主鍵")
private String id;
@ApiModelProperty(value = "用戶ID")
private String memberId;
......
}
2. spring-cloud-starter-gateway
網關整合所有微服api
2.1 添加依賴
<!--knife4j依賴-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>2.0.2</version>
</dependency>
2.2編寫配置類
@Configuration
@Primary //代表是Swagger主 配置
public class DocumentationConfig implements SwaggerResourcesProvider {
public static final String API_URI = "v2/api-docs";
private final RouteLocator routeLocator;
private final GatewayProperties gatewayProperties;
public DocumentationConfig(RouteLocator routeLocator, GatewayProperties gatewayProperties) {
this.routeLocator = routeLocator;
this.gatewayProperties = gatewayProperties;
}
@Override
public List<SwaggerResource> get() {
List<SwaggerResource> resources = new ArrayList<>();
List<String> routes = new ArrayList<>();
routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));
gatewayProperties.getRoutes().stream().filter(routeDefinition -> routes.contains(routeDefinition.getId())).forEach(route -> {
route.getPredicates().stream()
.filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName()))
.forEach(predicateDefinition -> resources.add(swaggerResource(route.getId(),
predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX + "0")
.replace("**", API_URI))));
});
return resources;
}
private SwaggerResource swaggerResource(String name, String location) {
SwaggerResource swaggerResource = new SwaggerResource();
swaggerResource.setName(name);
swaggerResource.setLocation(location);
swaggerResource.setSwaggerVersion("1.0");
return swaggerResource;
}
}
2.3 編寫SwaggerHandler
獲取api接口信息
/**
* 獲取api接口信息
*/
@RestController
@RequestMapping("/swagger-resources")
public class SwaggerHandler {
@Autowired(required = false)
private SecurityConfiguration securityConfiguration;
@Autowired(required = false)
private UiConfiguration uiConfiguration;
private final SwaggerResourcesProvider swaggerResources;
@Autowired
public SwaggerHandler(SwaggerResourcesProvider swaggerResources) {
this.swaggerResources = swaggerResources;
}
@GetMapping("/configuration/security")
public Mono<ResponseEntity<SecurityConfiguration>> securityConfiguration() {
return Mono.just(new ResponseEntity<>(
Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()), HttpStatus.OK));
}
@GetMapping("/configuration/ui")
public Mono<ResponseEntity<UiConfiguration>> uiConfiguration() {
return Mono.just(new ResponseEntity<>(
Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK));
}
@GetMapping("")
public Mono<ResponseEntity> swaggerResources() {
Mono<ResponseEntity> just = Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK)));
return just;
}
}
2.4 啓動配置
最後,項目啓動類添加相關注解,代碼如下:
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
注意點
在集成Spring Cloud Gateway網關的時候,會出現沒有basePath的情況(即定義的例如/user、/order等微服務的前綴),這個情況在使用zuul網關的時候不會出現此問題,因此,在Gateway網關需要添加一個Filter實體Bean
解決看官網。