目录
Spring Cloud Gateway 学习专栏
1. Spring Cloud : Gateway 服务网关认识(一)
2. Spring Cloud :整合Gateway 学习 (二)
3. Spring Cloud:Gateway 路由定义定位器 RouteDefinitionLocator (三)
4. Spring Cloud : Gateway 网关过滤器 GatewayFilter(四)
5. Spring Cloud : Gateway 网关限流(五)
6. Spring Cloud:Gateway 集成 Sentinel (六)
7. Spring Cloud : Gateway Redis动态路由 (七)
8. Spring Cloud : Gateway 整合Swagger (八)
如果发现本文有错误的地方,请大家毫不吝啬,多多指教,欢迎大家评论,谢谢!
一、概述
前面几篇文章对 Gateway 有详细介绍,这一篇文章整合 Swagger,Swagger是一个简单但功能强大的API表达工具。它具有地球上最大的API工具生态系统,可以自动帮我们生产接口文档,可以写文档接口时间。
二、整合 Swagger
1. 添加 pom 依赖
<properties>
<knife4j.version>2.0.4</knife4j.version>
</properties>
<dependencies>
<!--整合Knife4j-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
</dependencies>
2. 配置文件
server:
port: 9000
service-url:
user-service: http://localhost:8200
spring:
application:
name: mall-gateway
main:
allow-bean-definition-overriding: true
## redis配置
redis:
database: 0
host: 47.103.20.21
password: zlp123456
port: 6379
timeout: 7000
cloud:
## nacos注册中心
nacos:
discovery:
server-addr: 47.103.20.21:8848
## gateway配置
gateway:
routes:
- id: user #路由的ID 保证唯一
uri: ${service-url.user-service} # 目标服务地址:uri以lb://开头(lb代表从注册中心获取服务),后面就是需要转发到的服务名称
predicates:
# 断言,路径相匹配的进行路由 (谓词)
- Path=/user/** # 路径匹配
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 1 # 以恒定速率存入令牌
redis-rate-limiter.burstCapacity: 2 # 桶的总容量
key-resolver: "#{@remoteAddrKeyResolver}" #这个必须要配置,否则返回403 paramsKeyResolver
# 将 /user/user/getUserInfo?userId=1 重写为 /user/getUserInfo?userId=1
- RewritePath=/user/(?<segment>.*),/$\{segment}
- id: product
uri: lb://api-product
order: 2
predicates:
- Path=/product/**
filters:
# 重写 /product/**
- RewritePath=/product/(?<segment>.*),/$\{segment}
## 整合sentinel
sentinel:
transport:
dashboard: 47.103.20.21:8000
port: 8080
# 服务启动直接建立心跳连接
eager: true
#
gateway:
encodeKey: abcdefgabcdefg12
# 暴露 route 端点
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always
3. SwaggerHandler
@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() {
return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK)));
}
}
4. SwaggerProvider
@Slf4j
@Primary
@Component
@AllArgsConstructor
public class SwaggerProvider implements SwaggerResourcesProvider {
public static final String API_URI = "/v2/api-docs";
private final RouteLocator routeLocator;
private final 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(routeDefinition -> routeDefinition.getPredicates().stream()
.filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName()))
.forEach(predicateDefinition -> resources.add(swaggerResource(routeDefinition.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("2.0");
return swaggerResource;
}
}
三、访问 Swagger
1. 项目 model 结构
序号 | 项目名称 | 端口号 |
1 | mall-gateway (父项目) | |
2 | user-service | 8200 |
3 | product-service | 8300 |
4 | api-gateway | 9000 |
启动 product-service 、user-service、api-gateway 这个三个服务
2. 访问 Swagger
http://127.0.0.1:9000/doc.html
源码地址
mall-gateway 这个项目