Commit b817c7bb by ypenglv

gateway聚合swagger

1 parent 45319684
...@@ -4,13 +4,19 @@ package org.nafmii.admin.swagger; ...@@ -4,13 +4,19 @@ package org.nafmii.admin.swagger;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo; import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2; import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
import java.util.List;
/** /**
* 用于在swagger-ui.html上展示所有Api接口 * 用于在swagger-ui.html上展示所有Api接口
...@@ -22,14 +28,19 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2; ...@@ -22,14 +28,19 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2;
public class SwaggerConfig { public class SwaggerConfig {
@Bean @Bean
public Docket adminApi() { public Docket adminApi() {
// String basePackage = ADMIN_SWAGGER;// 要暴露的API接口的基础包名 ParameterBuilder ticketPar = new ParameterBuilder();
List<Parameter> pars = new ArrayList<Parameter>();
ticketPar.name("Authorization").description("Authorization")
.modelRef(new ModelRef("string")).parameterType("header")
.required(false).build(); //header中的ticket参数非必填,传空也可以
pars.add(ticketPar.build()); //根据每个方法名也知道当前方法在设置什么参数
return new Docket (DocumentationType.SWAGGER_2) return new Docket (DocumentationType.SWAGGER_2)
.select () .select()
.apis (RequestHandlerSelectors.basePackage ("org.nafmii.admin.user")) .apis(RequestHandlerSelectors.basePackage("org.nafmii.admin"))
.paths (PathSelectors.any ()) .paths(PathSelectors.any())
.build () .build().globalOperationParameters(pars)
.apiInfo (apiInfo ()) .apiInfo(apiInfo());
.useDefaultResponseMessages (false);
} }
private static ApiInfo apiInfo() { private static ApiInfo apiInfo() {
......
package org.nafmii.app.swagger; package org.nafmii.app.swagger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Bean;
import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo; import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2; import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
import java.util.List;
/** /**
* 用于在swagger-ui.html上展示所有Api接口 * 用于在swagger-ui.html上展示所有Api接口
...@@ -22,21 +28,25 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2; ...@@ -22,21 +28,25 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2;
public class SwaggerConfig { public class SwaggerConfig {
@Bean @Bean
public Docket adminApi() { public Docket adminApi() {
// String basePackage = ADMIN_SWAGGER;// 要暴露的API接口的基础包名 ParameterBuilder ticketPar = new ParameterBuilder();
List<Parameter> pars = new ArrayList<Parameter>();
ticketPar.name("Authorization").description("Authorization")
.modelRef(new ModelRef("string")).parameterType("header")
.required(false).build(); //header中的ticket参数非必填,传空也可以
pars.add(ticketPar.build()); //根据每个方法名也知道当前方法在设置什么参数
return new Docket (DocumentationType.SWAGGER_2) return new Docket (DocumentationType.SWAGGER_2)
.select () .select()
.apis (RequestHandlerSelectors.basePackage ("org.nafmii.app")) .apis(RequestHandlerSelectors.basePackage("org.nafmii.app"))
// .apis(RequestHandlerSelectors.basePackage ("org.nafmii.app")) .paths(PathSelectors.any())
.paths (PathSelectors.any ()) .build().globalOperationParameters(pars)
.build () .apiInfo(apiInfo());
.apiInfo (apiInfo ())
.useDefaultResponseMessages (false);
} }
private static ApiInfo apiInfo() { private static ApiInfo apiInfo() {
return new ApiInfoBuilder () return new ApiInfoBuilder ()
.title ("NAFMIIapp应用层接口说明") .title ("NAFMII-APP应用层接口说明")
.description ("NAFMIIapp应用层接口说明") .description ("NAFMII-APP应用层接口说明")
.version ("1.0") .version ("1.0")
.build (); .build ();
} }
......
...@@ -21,7 +21,7 @@ import org.springframework.web.bind.annotation.*; ...@@ -21,7 +21,7 @@ import org.springframework.web.bind.annotation.*;
* @remark: * @remark:
*/ */
@RestController @RestController
@RequestMapping("app/nafmii/user") @RequestMapping("/app/nafmii/user")
@Api(tags = "2.0.1", description = "用户登陆注册操作操作【zjh】") @Api(tags = "2.0.1", description = "用户登陆注册操作操作【zjh】")
public class UserController { public class UserController {
@Autowired @Autowired
......
...@@ -199,14 +199,12 @@ ...@@ -199,14 +199,12 @@
<artifactId>mysql-connector-java</artifactId> <artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version> <version>8.0.20</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP --> <!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP -->
<dependency> <dependency>
<groupId>com.zaxxer</groupId> <groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId> <artifactId>HikariCP</artifactId>
<version>4.0.0</version> <version>4.0.0</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/p6spy/p6spy -->
</dependencies> </dependencies>
......
...@@ -29,7 +29,7 @@ public class RequestUtils { ...@@ -29,7 +29,7 @@ public class RequestUtils {
public static Long getUserId(){ public static Long getUserId(){
//token 获取用户信息 //token 获取用户信息
String token = getToken(); String token = getToken();
if (StringUtils.isNotBlank(token)){ if (StringUtils.isBlank(token)){
throw new BusinessException("令牌不能为空"); throw new BusinessException("令牌不能为空");
} }
Map<String,Object> map = (Map<String, Object>) JwtUtils.getUserInfo(token).get(HttpClientHeaderEnum.USER_VO.getCode()); Map<String,Object> map = (Map<String, Object>) JwtUtils.getUserInfo(token).get(HttpClientHeaderEnum.USER_VO.getCode());
......
...@@ -29,9 +29,6 @@ import java.util.Map; ...@@ -29,9 +29,6 @@ import java.util.Map;
@Component @Component
public class AccessFilter implements GlobalFilter, Ordered { public class AccessFilter implements GlobalFilter, Ordered {
private String[] skipAuthUrls;
private ObjectMapper objectMapper;
@Autowired @Autowired
private AntPathMatcher antPathMatcher; //路径匹配器 private AntPathMatcher antPathMatcher; //路径匹配器
...@@ -39,9 +36,15 @@ public class AccessFilter implements GlobalFilter, Ordered { ...@@ -39,9 +36,15 @@ public class AccessFilter implements GlobalFilter, Ordered {
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String url = exchange.getRequest().getURI().getPath(); String url = exchange.getRequest().getURI().getPath();
//相关不需要的接口地址 //相关不需要的接口地址
String skip ="/nafmii-app/app/nafmii/user/loginTest"; String skip0 ="/nafmii-app/app/nafmii/user/userLogin";
String skip1 ="/nafmii-admin/nafmii/admin/user/login";
String skip2 ="/nafmii-app/v2/api-docs";
String skip3 ="/nafmii-admin/v2/api-docs";
//跳过不需要验证的url //跳过不需要验证的url
if (antPathMatcher.match(skip, url)){ if (antPathMatcher.match(skip0, url)
||antPathMatcher.match(skip1,url)
||antPathMatcher.match(skip2,url)
||antPathMatcher.match(skip3,url) ){
return chain.filter(exchange); return chain.filter(exchange);
} }
......
package org.nafmii.gateway.config;
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.HashSet;
import java.util.List;
import java.util.Set;
/**
* @author lvyp
* @date 2021/4/29
*/
@Component
@Primary
public class MySwaggerResourceProvider implements SwaggerResourcesProvider {
/**
* swagger2默认的url后缀
*/
private static final String SWAGGER2URL = "/v2/api-docs";
/**
* 网关路由
*/
private final RouteLocator routeLocator;
/**
* 网关应用名称
*/
@Value("${spring.application.name}")
private String self;
public MySwaggerResourceProvider(RouteLocator routeLocator) {
this.routeLocator = routeLocator;
}
@Override
public List<SwaggerResource> get() {
List<SwaggerResource> resources = new ArrayList<>();
List<String> routeHosts = new ArrayList<>();
// 由于我的网关采用的是负载均衡的方式,因此我需要拿到所有应用的serviceId
// 获取所有可用的host:serviceId
routeLocator.getRoutes().filter(route -> route.getUri().getHost() != null)
.filter(route -> !self.equals(route.getUri().getHost()))
.subscribe(route -> routeHosts.add(route.getUri().getHost()));
// 记录已经添加过的server,存在同一个应用注册了多个服务在nacos上
Set<String> dealed = new HashSet<>();
routeHosts.forEach(instance -> {
// 拼接url,样式为/serviceId/v2/api-info,当网关调用这个接口时,会自动通过负载均衡寻找对应的主机
String url = "/" + instance + SWAGGER2URL;
if (!dealed.contains(url)) {
dealed.add(url);
SwaggerResource swaggerResource = new SwaggerResource();
swaggerResource.setUrl(url);
swaggerResource.setName(instance);
resources.add(swaggerResource);
}
});
return resources;
}
}
package org.nafmii.gateway.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
import springfox.documentation.swagger.web.*;
import javax.annotation.Resource;
import java.util.Optional;
/**
* @author lvyp
* @date 2021/4/29
*/
@RestController
@RequestMapping("/swagger-resources")
public class SwaggerResourceController {
@Autowired(required = false)
private SecurityConfiguration securityConfiguration;
@Autowired(required = false)
private UiConfiguration uiConfiguration;
@Resource
private final SwaggerResourcesProvider swaggerResources;
public SwaggerResourceController(SwaggerResourcesProvider resourcesProvider) {
this.swaggerResources = resourcesProvider;
}
@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() {
return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK)));
}
}
...@@ -25,6 +25,12 @@ spring: ...@@ -25,6 +25,12 @@ spring:
- Path=/nafmii-app/** - Path=/nafmii-app/**
filters: filters:
- StripPrefix=1 - StripPrefix=1
- id: nafmii-admin
uri: lb://nafmii-admin
predicates:
- Path=/nafmii-admin/**
filters:
- StripPrefix=1
logging: logging:
config: classpath:logback-spring.xml config: classpath:logback-spring.xml
nafmii: nafmii:
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!