经过以前的两篇文章,能够简单的搭建一个路由网关了。而咱们知道,如今都奉行
先后端分离
开发,先后端开发的沟通成本就增长了,因此通常上咱们都是经过swagger
进行api文档生成的。如今因为使用了统一路由网关了,都但愿各微服务的api文档
统一的聚合在网关服务中,也方便前端用户查阅,不须要每一个服务单独查看。固然了,也是能够作一个文档索引网页进行各微服务的api文档连接的。今天,咱们就来说下使用swagger
实现自动化聚合微服务文档功能。html
注:关于Swagger
的介绍和使用,因为在以前的SpringBoot
系列文章中有说起,这里就不在过多阐述了,不理解的能够点击:第十章:Swagger2的集成和使用进行查看,了解下基本用法。前端
为了实现自动聚合功能,简单来讲就是经过Zuul
api获取全部的路由信息,根据其具体地址进行自动转配到Swagger
的SwaggerResource
下。java
另外,为了项目的独立,本章节建立个maven
多模块工程项目。总体结构以下:git
同时,会启动一个基于Eureka
的注册服务,具体能够查看源码:spring-cloud-eureka-server。github
为了演示,建立两个微服务spring-cloud-zuul-service-one
和spring-cloud-zuul-service-two
。web
这里以构建spring-cloud-zuul-service-one
为例,spring-cloud-zuul-service-two
基本上是同样的,能够查看源码示例。spring
0.引入相关依赖后端
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 客户端依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </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>
1.编写swagger配置类。api
/** * swagger配置类 * @author oKong * */ @EnableSwagger2 @Configuration public class SwaggerConfig { //是否开启swagger,正式环境通常是须要关闭的,可根据springboot的多环境配置进行设置 @Value(value = "${swagger.enabled}") Boolean swaggerEnabled; @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()) // 是否开启 .enable(swaggerEnabled).select() // 扫描的路径包 .apis(RequestHandlerSelectors.basePackage("cn.lqdev.learning.springcloud.zuul.service")) // 指定路径处理PathSelectors.any()表明全部的路径 .paths(PathSelectors.any()).build().pathMapping("/"); } //设置api信息 private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("路由网关(Zuul):利用swagger2聚合API文档-service-one") .description("oKong | 趔趄的猿") // 做者信息 .contact(new Contact("oKong", "https://blog.lqdev.cn/", "499452441@qq.com")) .version("1.0.0") .build(); } }
2.编写控制层,设置对外api服务信息,同时建立了请求和响应的实体类。springboot
DemoController.java
/** * demo示例 * @author oKong * */ @RestController @Api(tags="servicie-one服务") @Slf4j public class DemoController { @GetMapping("/hello") @ApiOperation(value="demo示例") public DemoResp hello(DemoReq demoReq) { log.info("DemoReq:{}", demoReq); return DemoResp.builder() .code(demoReq.getCode()) .name(demoReq.getName()) .remark(demoReq.getRemark()) .build(); } }
DemoReq.java
/** * 请求实体 * @author oKong * */ @Data @Builder @NoArgsConstructor @AllArgsConstructor @ApiModel public class DemoReq { @ApiModelProperty(name="code",value="编码",example="oKong") String code; @ApiModelProperty(name="name",value="名称",example="趔趄的猿") String name; @ApiModelProperty(name="remark",value="备注",example="blog:blog.lqdev.cn") String remark; }
DemoResp.java
/** * 响应实体 * @author Okong * */ @Data @Builder @NoArgsConstructor @AllArgsConstructor @ApiModel public class DemoResp { @ApiModelProperty(name="code",value="编码",example="oKong") String code; @ApiModelProperty(name="name",value="名称",example="趔趄的猿") String name; @ApiModelProperty(name="remark",value="备注",example="blog:blog.lqdev.cn") String remark; }
3.编写启动类。
/** * api服务1 示例 * @author oKong * */ @SpringBootApplication @EnableDiscoveryClient @Slf4j public class ServiceOneApplication { public static void main(String[] args) throws Exception { SpringApplication.run(ServiceOneApplication.class, args); log.info("spring-cloud-zuul-service-one启动!"); } }
4.添加配置信息。
spring.application.name=api-service-one server.port=789 # 注册中心地址 -此为单机模式 eureka.client.service-url.defaultZone=http://127.0.0.1:1000/eureka # 启用ip配置 这样在注册中心列表中看见的是以ip+端口呈现的 eureka.instance.prefer-ip-address=true # 实例名称 最后呈现地址:ip:2000 eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port} # swagger开关 swagger.enabled=true
5.启动应用,访问:http://127.0.0.1:789/swagger-ui.html 就能够单应用api文档配置成功了
建立项目:spring-cloud-zuul-gateway
关于zuul的使用,能够查看:第九章:路由网关(Zuul)的使用
0.引入相关依赖。
<!-- zuul 依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <!-- 客户端依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </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>
1.添加相关配置信息。
spring.application.name=zuul-gateway server.port=8899 # 注册中心地址 -此为单机模式 eureka.client.service-url.defaultZone=http://127.0.0.1:1000/eureka # 启用ip配置 这样在注册中心列表中看见的是以ip+端口呈现的 eureka.instance.prefer-ip-address=true # 实例名称 最后呈现地址:ip:15678 eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port} # swagger开启开关 swagger.enabled=true
2.编写swagger配置类(重点)
@EnableSwagger2 @Configuration @Primary //多个bean时 此类优先使用 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("cn.lqdev.learning.springcloud.zuul.swagger2")) // 指定路径处理PathSelectors.any()表明全部的路径 .paths(PathSelectors.any()).build().pathMapping("/"); } //设置api信息 private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("路由网关(Zuul):利用swagger2聚合API文档") .description("oKong | 趔趄的猿") // 做者信息 .contact(new Contact("oKong", "https://blog.lqdev.cn/", "499452441@qq.com")) .version("1.0.0") .termsOfServiceUrl("https://github.com/xie19900123/") .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")); }); //也能够直接 继承 Consumer接口 // routeLocator.getRoutes().forEach(new Consumer<Route>() { // // @Override // public void accept(Route t) { // // TODO Auto-generated method stub // // } // }); 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; } }
这里继承SwaggerResourcesProvider
接口是实现聚合api的关键,另外经过RouteLocator
类获取路由
列表是实现自动聚合的关键。
固然,这里也是能够手动进行添加的。
3.编写zuul内部控制层。
/** * zuul 内部提供对外服务示例 * @author oKong * */ @RestController @RequestMapping("/demo") @Api(tags="zuul内部rest api") public class DemoController { @GetMapping("/hello") @ApiOperation(value="demo示例",notes="demo示例") @ApiImplicitParam(name="name",value="名称",example="oKong") public String hello(String name) { return "hi," + name + ",this is zuul api! "; } }
4.编写启动类。
/** * zuul使用swagger2聚合微服务api示例 * @author oKong * */ @SpringBootApplication @EnableZuulProxy @EnableDiscoveryClient @Slf4j public class ZuulSwaggerApplication { public static void main(String[] args) throws Exception { SpringApplication.run(ZuulSwaggerApplication.class, args); log.info("spring-cloud-zuul-gateway启动!"); } }
5.启动应用,访问:http://127.0.0.1:8899/swagger-ui.html 能够看见页面显示的是网关项目的swagger
文档信息。
如今看看右上角的Select a spec
下拉框,能够看见下拉框中包含了注册中心下的全部微服务了。
此时,咱们切换下api-service-one
,能够看见api-service-one
的api列表了。
切换到api-service-two
,也能够看见都要的api列表信息。
本章节主要简单介绍了如何在
Zuul
路由网关服务利用Swagger2
进行微服务api的聚合功能。这样查看各微服务的api文档就很方便,集中,不须要在切换不一样文档地址了。
目前互联网上大佬都有分享
SpringCloud
系列教程,内容可能会相似,望多多包涵了。原创不易,码字不易,还但愿你们多多支持。若文中有错误之处,还望提出,谢谢。
499452441
lqdevOps
我的博客:http://blog.lqdev.cn
源码示例:https://github.com/xie19900123/spring-cloud-learning
如下教程可能你会感兴趣:
原文地址:https://blog.lqdev.cn/2018/10/19/SpringCloud/chapter-eleven/