携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情
配置通过网关访问
- 网关:spring cloud gateway
- 认证:spring security
引入依赖
父pom配置总版本
<knife4j.version>3.0.3</knife4j.version>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-micro-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
common模块引入knife4j-micro-spring-boot-starter
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-micro-spring-boot-starter</artifactId>
</dependency>
gateway模块引入knife4j-spring-boot-starter
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
</dependency>
修改SwaggerConfig
@Slf4j
@Configuration
@EnableOpenApi
@EnableKnife4j
public class SwaggerConfig {
/** 默认的排除路径,排除Spring Boot默认的错误处理路径和端点(在解析的url规则之上) /* /error,由于服务通常加前缀,所以前面/*忽略前缀 */
private static final List<String> DEFAULT_EXCLUDE_PATH = Arrays.asList("/error","/actuator/**","/*/error");
/** swagger会解析的url规则 */
private static final String BASE_PATH = "/**";
@Bean(value = "createRestApi")
public Docket createRestApi() {
return new Docket(DocumentationType.OAS_30)
.apiInfo(groupApiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("young.abandon.controller"))
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
.paths(PathSelectors.any())
.build();
}
private ApiInfo groupApiInfo() {
return new ApiInfoBuilder()
.title("swagger-3 !!!")
.description("<div style='font-size:14px;color:red;'>swagger- 3 -demo RESTful APIs</div>")
.termsOfServiceUrl("http://www.group.com/")
.contact(new Contact("hy", "qwer", "group@qq.com"))
.version("1.0")
.build();
}
@Bean
public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
return new BeanPostProcessor() {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
}
return bean;
}
private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {
List<T> copy = mappings.stream()
.filter(mapping -> mapping.getPatternParser() == null)
.collect(Collectors.toList());
mappings.clear();
mappings.addAll(copy);
}
@SuppressWarnings("unchecked")
private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
try {
Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
field.setAccessible(true);
return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
} catch (IllegalArgumentException | IllegalAccessException e) {
throw new IllegalStateException(e);
}
}
};
}
}
修改yml配置文件
- 添加网关路由配置
- 网关放行路径
- todo /api-docs接口校验
spring:
application:
name: gateway
cloud:
gateway:
discovery:
locator:
#让gateway可以发现nacos中的微服务
enabled: true
#使用小写服务名,默认是大写
lower-case-service-id: true
# 路由的目标地址的 Spring EL 表达式,默认为 "'lb://' + serviceId"。
# swagger无法解析
url-expression: "'lb://' + serviceId"
# 路由数组可以存放多个路由,满足什么条件可以转发到指定的微服务
routes:
- id: consumer # 路由的编号
uri: lb://consumer # 路由到的目标地址
predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
- Path=/consumer/**
filters:
- StripPrefix=1 # 在请求转发路径去掉一层
- id: provider # 路由的编号
uri: lb://provider # 路由到的目标地址
predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
- Path=/provider/**
filters:
- StripPrefix=1 # 在请求转发路径去掉一层
- id: user # 路由的编号
uri: lb://user # 路由到的目标地址
predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
- Path=/user/**
filters:
- StripPrefix=1 # 在请求转发路径去掉一层
- id: auth # 路由的编号
uri: lb://auth # 路由到的目标地址
predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
- Path=/auth/**
filters:
- StripPrefix=1 # 在请求转发路径去掉一层
secure:
ignore:
urls: #免校验路径
- "/actuator/**"
- "/auth/oauth/token"
- "/auth/rsa/publicKey"
- "/rsa/publicKey"
- "/doc.html"
- "/v2/api-docs"
- "/*/v2/api-docs"
- "/webjars/**"
- "/swagger-resources"
- "/swagger-resources/**"
- "/swagger-ui.html"
- "/swagger-ui/**"
测试
启动网关服务
访问地址:http://localhost:8888/doc.html 成功访问!
tips
新增模块集成时需要
- yml配置文件添加AntPathMatcher。
- 网关yml文件添加对应路由信息。