关于knife4j工具聚合api文档的使用

这是我参与11月更文挑战的第17天,活动详情查看:11月更文挑战

在目前微服务项目中, 通常使用swagger作为在线文档交流使用,但各个微服务的文档都各自管理, 比较分散, 且没有导出离线文档等功能,而knife4j工具可以解决上述问题

1 knife4j工具的介绍

knife4j是2017年开源的一款增强swagger的工具, 主要是为Java开发框架集成Swagger生成Api文档的增强解决方案(主要是Java的Spring MVC, Spring Boot, Spring Cloud等非Java语言),前身是swagger-bootstrap-ui,取名knife4j是作者希望她能像一把匕首一样小巧,轻量,并且功能强悍.

简单案例

knife4j是增强swagger的工具,所以使用方式,配置等和使用swagger类似.

前提: 准备一个可运行的SpringBoot环境.

1 导入Knife4j依赖

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>2.0.7</version>
</dependency>
复制代码

2 添加配置文件

@Configuration
@EnableSwagger2WebMvc
public class Knife4jDocConfiguration {

    /**
     * 构建Docket对象
     */
    @Bean
    @ConditionalOnMissingBean
    public Docket apiDocket2() {
        // 默认组名, 文档更具组名查询,不同组名不能聚合
        String groupName = "default";
        return new Docket(DocumentationType.SWAGGER_2)
                // 文档信息
                .apiInfo(getApiInfo())
                // 组名
                .groupName(groupName)
                .select()
                // 指定Controller扫描包路径(如下面第一个apis方法)     因Controller类上要添加Api注解, 所以可通过指定类上注解
                // .apis(RequestHandlerSelectors.basePackage("com.github.xiaoymin.knife4j.controller"))
                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
                .paths(PathSelectors.any())
                .build()
    }


    /**
     * 创建api文档信息
     */
    private ApiInfo getApiInfo() {
        // 用ApiInfoBuilder进行定制
        return new ApiInfoBuilder()
                // 设置标题
                .title(appName + "服务接口文档")
                // 描述
                .description("接口的相关文档")
                // 作者信息
                .contact(new Contact("李白", "www.libai.com", "[email protected]"))
                // 版本
                .version("1.0")
                .build();
    }

}
复制代码

3 添加控制器

@RestController
@Slf4j
@Api(value = "AConController", tags = "消费者控制器")
public class AConController {

    @Autowired
    private ProviderFeign providerFeign;

    @GetMapping("/consumer")
    public String list() {
        String info = "我是consumerA,8081    ";
        log.info(info);
        String result = providerFeign.list();
        return JSON.toJSONString(info + result);
    }

}
复制代码

4 查看文档

访问文档地址http://localhost:8080/doc.html

2 knife4j工具的使用

聚合微服务文档案列

准备服务: 一个文档服务,两个业务服务,nacos注册配置中心

文档服务

1 准备一个可运行的SpringBoot服务

2 添加knife4j依赖

    <dependency>
      <groupId>com.github.xiaoymin</groupId>
      <artifactId>knife4j-aggregation-spring-boot-starter</artifactId>
      <version>2.0.9</version>
    </dependency>
复制代码

3 application.yml文件添加配置

knife4j:
  # 开启聚合  
  enableAggregation: true
  nacos:
    enable: true
    serviceUrl: http://localhost:8848/nacos
    routeAuth:
      enable: true
      password: nacos
      username: nacos
    routes:
      - name: provider-a服务
        serviceName: provider-a
        location: /v2/api-docs?group=default
        servicePath: /
      - name: consumer-a服务
        serviceName: consumer-a
        location: /v2/api-docs?group=default
        servicePath: /
复制代码

业务服务1

1 准备一个可运行的SpringBoot服务

2 添加配置类

@Configuration
@EnableSwagger2WebMvc
public class Knife4jDocConfiguration {

    /**
     * 服务名称
     */
    @Value("${spring.application.name:应用}")
    private String appName;

    /**
     * 引入Knife4j提供的扩展类 OpenApiExtensionResolver辅助类需要配置knife4j.enable=true才能自动@Autowired
     */
    @Autowired(required = false)
    private OpenApiExtensionResolver openApiExtensionResolver;

    /**
     * 1、限制哪些类可以生成api文档 2、限制哪些url可以生成api文档
     */
    @Bean
    @ConditionalOnMissingBean
    public Docket apiDocket2() {
        // 默认组名, 文档更具组名查询,不同组名不能聚合
        String groupName = "default";
        return new Docket(DocumentationType.SWAGGER_2)
                // 文档信息
                .apiInfo(getApiInfo())
                // 组名
                .groupName(groupName)
                .select()
                // 指定Controller扫描包路径(如下面第一个apis方法)     因Controller类上要添加Api注解, 所以可通过指定类上注解
                // .apis(RequestHandlerSelectors.basePackage("com.github.xiaoymin.knife4j.controller"))
                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
                .paths(PathSelectors.any())
                .build()
                // 赋予插件体系
                .extensions(getExtensions(groupName));
    }


    /**
     * 创建api文档信息
     */
    private ApiInfo getApiInfo() {
        // 用ApiInfoBuilder进行定制
        return new ApiInfoBuilder()
                // 设置标题
                .title(appName + "服务接口文档")
                // 描述
                .description("接口的相关文档")
                // 作者信息
                .contact(new Contact("李白", "www.libai.com", "[email protected]"))
                // 版本
                .version("1.0")
                .build();
    }

    /**
     * 根据组名添加插件
     */
    private List<VendorExtension> getExtensions(String groupName) {
        return null != openApiExtensionResolver ? openApiExtensionResolver
                .buildExtensions(groupName) : new ArrayList<>();
    }
}
复制代码

3 可在后台配置,添加到自动装配 (增强特性时使用)

在resources文件夹下增加META-INF文件夹,spring.factories文件

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.cf.config.Knife4jDocConfiguration
复制代码

ps: 如果有多个自动配置注入使用,\分隔

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.cf.config.Knife4jDocConfiguration,\
com.cf.config.Configuration
复制代码

4 添加控制器

@RestController
@Slf4j
@Api(value = "AConController", tags = "消费者控制器")
public class AConController {

    @Autowired
    private ProviderFeign providerFeign;

    @GetMapping("/consumer")
    public String list() {
        String info = "我是consumerA,8081    ";
        log.info(info);
        String result = providerFeign.list();
        return JSON.toJSONString(info + result);
    }

}
复制代码

业务服务2

基本配置和服务一相同.

查看文档

1 启动本地nacos ,再依次启动文档服务knife4j-doc服务 , provider-a服务 , consumer-a服务

2 启动本地nacos服务,查看服务列表,发现存在三个服务

knife4j-doc服务
provider-a服务
consumer-a服务
复制代码

3 查看文档服务knife4j-doc的文档

http://localhost:8000/doc.html

发现provider-a和consumer-a服务的Controller文档已经被聚合出来,可以查看和测试了.

参考资料:

doc.xiaominfo.com/knife4j/doc…

blog.csdn.net/weixin_4756…

猜你喜欢

转载自juejin.im/post/7034824889475268639