swagger集成步骤(包含springboot集成与springcloud集成方案

简述swagger:服务端常用的文档页面,可自动通过扫描生成接口文档,也可以通过添加指定的注解显示接口。

我这里主要是在集成springcloud微服务的时候,考虑多个模块的sw能不能集成到一个端口对外开放,因为我们知道微服务的优势就是多个服务分开运行,这样带来的问题就是多个端口开放,与此同时如果配合使用swagger并访问的话,那需要对每个服务的端口单独访问才能看到对应的swagger生成的接口文档,例如:

现在有服务A,端口为5001;服务B,端口为5001;zuul服务,端口5003。

如果你想要看A服务的sw(swagger简称,后续都是),那么就是访问 http://youip:5001:swagger-ui.html,访问B服务的sw就是http://youip:5002:swagger-ui.html.

1.这样是比较不便

2.在采用微服务的时候,我们并不会将这些端口一一对外开放,而是采用zuul(zuul相关这里不讲解可以自行查看一下)等方式,转发服务对外统一只开放一个端口。

所以更好的操作应该是在每个服务中集成sw,在zuul中统一集成各个服务的sw,这样就可以通过一个端口访问多个服务的sw。访问http://youip:5003:swagger-ui.html.就可以在其中看到A,B服务的sw文档内容。

接下来是步骤:

1.在各个服务中集成sw

 1.1添加依赖

<!-- swagger -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>
<!-- swagger-ui -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>

在这里添加完依赖后,重新启动服务,sw就算集成完毕(它会自动扫描与生成文档),可以直接访问 http://ip:服务port/swagger-ui.html 去查看自动生成好的sw.到此我们的第一步,服务中集成sw就完成了。

示例图:

 1.2 拓展:sw 除了方便可自动生成外,当然也可以自定义一些规则,可以通过自己写一个SwaggerConfig的配置,也可以不写,写的话可以自己定制一些规则,这里简单提一下,比如我这里是写了的因为要添加默认的请求头:

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket createRestApi() {

        //添加head参数start
        ParameterBuilder tokenPar = new ParameterBuilder();
        ParameterBuilder tokenPar2 = new ParameterBuilder();
        List<Parameter> pars = new ArrayList<Parameter>();
        tokenPar.name("token").description("请求token").modelRef(new ModelRef("string")).parameterType("header").required(true).build();
        tokenPar2.name("userId").description("请求userId").modelRef(new ModelRef("string")).parameterType("header").required(true).build();
        pars.add(tokenPar.build());
        pars.add(tokenPar2.build());
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.zq.controller"))//指定包下的才会被扫描
//                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))//带有指定注解的类才会被扫描
//                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                .paths(PathSelectors.any())
                .build()
                .globalOperationParameters(pars);
    }


    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Spring Boot Swagger2 RESTful APIs")
                .description("calligraphy")
                .version("1.0")
                .build();
    }
}

需要在其上面添加@EnableSwagger2注解 这一步,就可完成,至于@Configuration 是用来告诉spring项目这是配置类。

2.第一步只是可以各个服务访问接口,第二步则是要在zuul集成各个服务的sw,可以通过访问一个端口的sw而去访问到多个sw。

 2.1首先还是在zuul中添加sw依赖与1.1完全相同

 2.2 然后不同的是zuul中需要你集成其他的sw,通过写zuul自动省的sw配置,而去访问其他服务的sw(本质上是访问其他服务sw提供的api),而集成一个新的sw.操作如下:

 在application上添加@EnableSwagger2注解  然后写配置文件swaggerconfig.class

/**
 * desc
 * author zhouqi
 * data 2020/10/15
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket createRestApi() {
        //添加head参数start 这在里可以不要这个
        ParameterBuilder tokenPar = new ParameterBuilder();
        ParameterBuilder tokenPar2 = new ParameterBuilder();
        List<Parameter> pars = new ArrayList<Parameter>();
        pars.add(tokenPar.build());
        pars.add(tokenPar2.build());
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .paths(PathSelectors.any())
                .build()
                .globalOperationParameters(pars);
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .version("1.0")
                .build();
    }

    /**
     * 重点是这一步,集成其他的sw
     */
    @Configuration
    @Primary
    public class MySwaggerResourceProvider implements SwaggerResourcesProvider {

        @Autowired
        ZuulProperties zuulProperties;

        @Override
        public List<SwaggerResource> get() {
            List resources = new ArrayList<>();
            //去访问其他的服务的路由地址对应sw的api,这样在zuul中集成各个服务的sw文档
            zuulProperties.getRoutes().values().stream().forEach(zuulRoute -> {
                //为了认清地址api
                        resources.add(swaggerResource(zuulRoute.getServiceId(), zuulRoute.getPath().replace("**", "v2/api-docs"), "1.0"));
                    }
            );
            return resources;
        }

        private SwaggerResource swaggerResource(String name, String location, String version) {
            SwaggerResource swaggerResource = new SwaggerResource();
            swaggerResource.setName(name);
            swaggerResource.setLocation(location);
            swaggerResource.setSwaggerVersion(version);
            return swaggerResource;
        }
    }
}

这样zuul中的sw也算是配置好了,然后逐一的启动服务与zuul,访问zuul中你就可以看到各个服务的sw文档了。

示例图:(我这里是多个服务,可自行选择,它会显示出各个服务详细的sw)

 

到此,在springboot中集成sw,与在springcloud微服务中集成sw的方法与实现就完成了。

至于sw中其他注解与更细致的操作,可以访问sw官网或者看其他的博客,这里就不重复描述了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值