spring cloud alibaba 集成 knife4j (二)

457 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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

新增模块集成时需要

  1. yml配置文件添加AntPathMatcher。
  2. 网关yml文件添加对应路由信息。