Commit b817c7bb by ypenglv

gateway聚合swagger

1 parent 45319684
......@@ -4,13 +4,19 @@ package org.nafmii.admin.swagger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
import java.util.List;
/**
* 用于在swagger-ui.html上展示所有Api接口
......@@ -22,14 +28,19 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2;
public class SwaggerConfig {
@Bean
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)
.select ()
.apis (RequestHandlerSelectors.basePackage ("org.nafmii.admin.user"))
.paths (PathSelectors.any ())
.build ()
.apiInfo (apiInfo ())
.useDefaultResponseMessages (false);
.select()
.apis(RequestHandlerSelectors.basePackage("org.nafmii.admin"))
.paths(PathSelectors.any())
.build().globalOperationParameters(pars)
.apiInfo(apiInfo());
}
private static ApiInfo apiInfo() {
......
package org.nafmii.app.swagger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Bean;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
import java.util.List;
/**
* 用于在swagger-ui.html上展示所有Api接口
......@@ -22,21 +28,25 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2;
public class SwaggerConfig {
@Bean
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)
.select ()
.apis (RequestHandlerSelectors.basePackage ("org.nafmii.app"))
// .apis(RequestHandlerSelectors.basePackage ("org.nafmii.app"))
.paths (PathSelectors.any ())
.build ()
.apiInfo (apiInfo ())
.useDefaultResponseMessages (false);
.select()
.apis(RequestHandlerSelectors.basePackage("org.nafmii.app"))
.paths(PathSelectors.any())
.build().globalOperationParameters(pars)
.apiInfo(apiInfo());
}
private static ApiInfo apiInfo() {
return new ApiInfoBuilder ()
.title ("NAFMIIapp应用层接口说明")
.description ("NAFMIIapp应用层接口说明")
.title ("NAFMII-APP应用层接口说明")
.description ("NAFMII-APP应用层接口说明")
.version ("1.0")
.build ();
}
......
......@@ -21,7 +21,7 @@ import org.springframework.web.bind.annotation.*;
* @remark:
*/
@RestController
@RequestMapping("app/nafmii/user")
@RequestMapping("/app/nafmii/user")
@Api(tags = "2.0.1", description = "用户登陆注册操作操作【zjh】")
public class UserController {
@Autowired
......
......@@ -199,14 +199,12 @@
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>4.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/p6spy/p6spy -->
</dependencies>
......
......@@ -29,7 +29,7 @@ public class RequestUtils {
public static Long getUserId(){
//token 获取用户信息
String token = getToken();
if (StringUtils.isNotBlank(token)){
if (StringUtils.isBlank(token)){
throw new BusinessException("令牌不能为空");
}
Map<String,Object> map = (Map<String, Object>) JwtUtils.getUserInfo(token).get(HttpClientHeaderEnum.USER_VO.getCode());
......
......@@ -29,9 +29,6 @@ import java.util.Map;
@Component
public class AccessFilter implements GlobalFilter, Ordered {
private String[] skipAuthUrls;
private ObjectMapper objectMapper;
@Autowired
private AntPathMatcher antPathMatcher; //路径匹配器
......@@ -39,9 +36,15 @@ public class AccessFilter implements GlobalFilter, Ordered {
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
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
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);
}
......
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:
- Path=/nafmii-app/**
filters:
- StripPrefix=1
- id: nafmii-admin
uri: lb://nafmii-admin
predicates:
- Path=/nafmii-admin/**
filters:
- StripPrefix=1
logging:
config: classpath:logback-spring.xml
nafmii:
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!