SpringCloudl两种方法整合Swagger
Swagger
Swagger优点
1.统一的API文档管理,可以方便接口开发和使用。
2.提供测试功能,方便在线测试
3.说明接口
SpringCloud Swagger集成
方法一:每个模块引用Swagger的配置
- pom.xml
<!-- swagger2.0集成 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
- Swagger配置类
@EnableSwagger2
@Configuration
public class SwaggerConfig {
private ApiInfo apiInfo() {
return new ApiInfoBuilder().title("springcloud最佳实践")
.description("SpringCloud集成Swagger") .termsOfServiceUrl("https://blog.csdn.net/qq_37248504/")
.contact("MarlonBrando")
.license("MarlonBrando")
.licenseUrl("#").version("1.0").build();
}
@Bean
public Docket newsApi() {
Docket docket = new Docket(DocumentationType.SWAGGER_2);
docket.enable(true);
docket.apiInfo(apiInfo())
.select()
//借口扫描的路径
.apis(RequestHandlerSelectors.basePackage("com.li"))
.paths(PathSelectors.any()).build();
return docket;
}
}
- Spring Cloud中单独的模块启动类:项目中启动这模块,会配置swagger,需要的模块引入swaager就可以
@SpringBootApplication
public class OsCoreServerApplication {
public static void main(String[] args) {
SpringApplication.run(OsCoreServerApplication.class, args);
}
}
- 模块的启动类中引入Swagger的配置类
@SpringBootApplication
@Import({com.li.os_core.config.SwaggerConfig.class})
public class MenuApplication {
public static void main(String[] args) {
SpringApplication.run(MenuApplication.class, args);
}
}
方法一在访问Swagger的借口文档时候,因为每个模块都引入了Swagger的配置,在访问的时候只
能用localhost:模块端口号/ swagger-ui.html
进行访问。这种方式比较繁琐,每个模块的Swagger接口得要去不同的端口访问。
方法二:统一网关(这个配置贼难受、模块的结构必须保持一致贼坑)
我的项目模块如下:Eureka为注册中心、ConfigServer为本地文件系统、Menu、Order、Core为服务模块,必须是SpringCloud模块
Menu和Order模块为相同的服务模块他们的pom.xml如下,先单独给每个模块配置swagger,用各自的端口访问成功后,进行下面的集成。
- Order和Menu的pom.xml
<!-- 父模块-->
<parent>
<artifactId>OnlineShop</artifactId>
<groupId>com.li</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>order</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
<!--swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
- 这两个模块下的Swagger配置类
@EnableSwagger2
@Configuration
public class SwaggerConfig {
private ApiInfo apiInfo() {
return new ApiInfoBuilder().title("springcloud最佳实践").description("SpringCloud集成Swagger")
.termsOfServiceUrl("https://blog.csdn.net/qq_37248504/article/details/106750307").contact("MarlonBrando")
.license("MarlonBrando ").licenseUrl("#").version("1.0").build();
}
@Bean
public Docket newsApi() {
Docket docket = new Docket(DocumentationType.SWAGGER_2);
docket.enable(true);
docket.apiInfo(apiInfo())
.select()
//借口扫描的路径
.apis(RequestHandlerSelectors.basePackage("com.li"))
.paths(PathSelectors.any()).build();
return docket;
}
}
这两个模块和方法一完全一致,必须能够通过自己的Ip端口访问swagger的地址。
Zuul模块集成Swagger
- core模块pom.xml,其他依赖和上面的一样,因为都是子模块,添加zuul的依赖
<!-- zuul 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
- 编写Swagger的配置类
@EnableSwagger2
@Configuration
@Primary
public class SwaggerConfig implements SwaggerResourcesProvider {
//是否开启swagger,正式环境一般是需要关闭的,可根据springboot的多环境配置进行设置
@Value(value = "${swagger.enabled}")
Boolean swaggerEnabled;
@Autowired
RouteLocator routeLocator;
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
// 是否开启
.enable(swaggerEnabled).select()
// 扫描的路径包
.apis(RequestHandlerSelectors.basePackage("com.li"))
// 指定路径处理PathSelectors.any()代表所有的路径
.paths(PathSelectors.any()).build().pathMapping("/");
}
//设置api信息
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("路由网关(Zuul):利用swagger2聚合API文档")
.description("测试接口文档")
// 作者信息
.contact(new Contact("MarlonBrando", "https://blog.csdn.net/qq_37248504/article/details/106750307", "[email protected]"))
.version("1.0.0")
.termsOfServiceUrl("https://blog.csdn.net/qq_37248504/")
.build();
}
@Override
public List<SwaggerResource> get() {
//利用routeLocator动态引入微服务
List<SwaggerResource> resources = new ArrayList<>();
resources.add(swaggerResource("zuul-gateway","/v2/api-docs","1.0"));
//循环 使用Lambda表达式简化代码
routeLocator.getRoutes().forEach(route ->{
//动态获取
resources.add(swaggerResource(route.getId(),route.getFullPath().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;
}
}
- 注意在每个模块的配置文件中加上
swagger: enabled: true
- core模块启动类
@SpringBootApplication
@EnableZuulProxy
public class CoreApplication {
public static void main(String[] args) {
SpringApplication.run(CoreApplication.class, args);
}
}
项目启动可以各自访问swagger页面,也可以访问core模块的,访问如下,可以切换路由进行访问。
》》》》》》》》有点坑 槽!