微服务应用(除了网关):
pom文件
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-autoconfigure</artifactId>
</dependency>
bootstrap.yml
server:
port: 9208
spring:
application:
name: forum-file
profiles:
active: dev
cloud:
nacos:
discovery:
server-addr: 127.0.0.0:8858
config:
server-addr: 127.0.0.0:8858
file-extension: yml
namespace: 433ed0c8-55ff-4e84-8bbc-704cfaf21bbd
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
配置文件
package com.linmain.swagger.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
@Configuration
@EnableSwagger2WebMvc
@Import(BeanValidatorPluginsConfiguration.class)
public class Swagger2Config {
@Value("${spring.application.name}")
private String serviceName;
@Bean
public Docket webApiConfig(){
return new Docket(DocumentationType.SWAGGER_2)
.groupName(serviceName)
.apiInfo(webApiInfo())
.select()
.paths(PathSelectors.any())
.build();
}
private ApiInfo webApiInfo(){
return new ApiInfoBuilder()
.title(serviceName)
.description("接口文档")
.version("1.0")
.contact(new Contact("LinMain", "http://baidu.com", "1580752420@qq.com"))
.build();
}
}
网关:
pom文件
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-ui</artifactId>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-autoconfigure</artifactId>
</dependency>
java文件
package com.linmain.gateway.utils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
@Component
@RequiredArgsConstructor
@Primary
@Slf4j
public class MySwaggerResourceProvider implements SwaggerResourcesProvider {
private static final String SWAGGER2_URL = "/v2/api-docs";
private final RouteLocator routeLocator;
@Value("${spring.application.name}")
private String gatewayName;
@Override
public List<SwaggerResource> get() {
List<SwaggerResource> resources = new ArrayList<>();
Set<String> routeHosts = new TreeSet<>();
routeLocator.getRoutes()
.filter(route -> route.getUri().getHost() != null)
.filter(route -> !gatewayName.equals(route.getUri().getHost()))
.subscribe(route -> routeHosts.add(route.getUri().getHost()));
for (String routeHost : routeHosts) {
log.info("===========输出路由地址"+routeHost+"==============");
String serviceUrl = "/" + routeHost + SWAGGER2_URL+"?group="+routeHost;
SwaggerResource swaggerResource = new SwaggerResource();
swaggerResource.setUrl(serviceUrl);
swaggerResource.setName(routeHost);
swaggerResource.setSwaggerVersion("2.0.0");
resources.add(swaggerResource);
}
return resources;
}
}
package com.linmain.gateway.controller;
import com.linmain.gateway.utils.MySwaggerResourceProvider;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.swagger.web.SwaggerResource;
import java.util.List;
@RestController
@RequestMapping("/swagger-resources")
@RequiredArgsConstructor
public class SwaggerResourceController {
private final MySwaggerResourceProvider swaggerResourceProvider;
@RequestMapping
public ResponseEntity<List<SwaggerResource>> swaggerResources() {
return new ResponseEntity<>(swaggerResourceProvider.get(), HttpStatus.OK);
}
}