前言

在微服务架构下,服务是分散的,怎么把所有服务接口整合到一起是我们需要关注的。

下面举例用zuul作为分布式系统的网关,同时使用swagger生成文档,想把整个系统的文档整合在同一个页面上来说明。

项目结构

eureka-server:eureka服务注册中心,端口8761,

eureka-server2:eureka服务注册中心,端口8762,

eureka-server3:eureka服务注册中心,端口8763,

zuul-swagger2:zuul网关,端口8090,

management-device:外接设备系统,端口8083,

management-equip:设备管理系统,端口8082,

Zuul整合Swagger2

eureka注册中心的搭建这里不再讲述,直接来看zuul-swagger2项目里怎么集成swagger

pom.xml文件中引入依赖:

  1. <!-- 必须要引入 springboot parent ,帮我们实现了很多jar包的依赖管理 -->
  2. <parent>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-parent</artifactId>
  5. <version>2.0..RELEASE</version>
  6. <relativePath /> <!-- lookup parent from repository -->
  7. </parent>
  8.  
  9. <dependencyManagement>
  10. <dependencies>
  11. <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies -->
  12. <dependency>
  13. <groupId>org.springframework.cloud</groupId>
  14. <artifactId>spring-cloud-dependencies</artifactId>
  15. <version>Finchley.RELEASE</version>
  16. <type>pom</type>
  17. <scope>import</scope>
  18. </dependency>
  19. </dependencies>
  20. </dependencyManagement>
  21.  
  22. <!-- 版本集中配置 -->
  23. <properties>
  24. <swagger2.version>2.9.</swagger2.version>
  25. </properties>
  26.  
  27. <dependencies>
  28. <!-- eureka client -->
  29. <dependency>
  30. <groupId>org.springframework.cloud</groupId>
  31. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  32. </dependency>
  33.  
  34. <!-- zuul -->
  35. <dependency>
  36. <groupId>org.springframework.cloud</groupId>
  37. <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
  38. </dependency>
  39.  
  40. <!-- swagger2 依赖 -->
  41. <dependency>
  42. <groupId>io.springfox</groupId>
  43. <artifactId>springfox-swagger2</artifactId>
  44. <version>${swagger2.version}</version>
  45. </dependency>
  46. <dependency>
  47. <groupId>io.springfox</groupId>
  48. <artifactId>springfox-swagger-ui</artifactId>
  49. <version>${swagger2.version}</version>
  50. </dependency>
  51. </dependencies>

在配置文件application.yml中添加配置(这里只做了eureka注册,没有做路由映射):

  1. #端口
  2. server:
  3. port:
  4. #应用名称
  5. spring:
  6. application:
  7. name: zuul-swagger2
  8. #服务注册
  9. eureka:
  10. instance:
  11. hostname: zuul-swagger2
  12. client:
  13. serviceUrl:
  14. defaultZone: http://skyworth:skyworth1@eureka-server:8761/eureka/,http://skyworth:skyworth2@eureka-server2:8762/eureka/,http://skyworth:skyworth3@eureka-server3:8763/eureka/
  15. # 路由配置方式一
  16. #zuul:
  17. # routes:
  18. #所有请求management-equip的请求,都会被拦截,并且转发到equip上
  19. # management-equip: /equip/**
  20.  
  21. # 路由配置方式二
  22. #zuul:
  23. # routes:
  24. # # 其中equip是路由名称,可以随便定义,但是path和service-id需要一一对应
  25. # equip:
  26. # path: /equip/**
  27. # # management-equip为注册到Eureka上的服务名
  28. # service-id: management-equip

Swagger2配置类:

这里比较重要的是2个配置类。第一个:SwaggerConfig.class是swagger的配置类,DocumentationConfig,用于整合配置接口文档

SwaggerConfig.class

  1. @Configuration
  2. @EnableSwagger2
  3. public class SwaggerConfig {
  4.  
  5. @Bean
  6. public Docket buildDocket() {
  7. return new Docket(DocumentationType.SWAGGER_2)
  8. .apiInfo(buildApiInf()) // .apiInfo(apiInfo())
  9. .select()
  10. .apis(RequestHandlerSelectors.basePackage(""))// 需要生成文档的包的位置
  11. .paths(PathSelectors.any())
  12. .build();
  13. }
  14.  
  15. private ApiInfo buildApiInf() {
  16. return new ApiInfoBuilder()
  17. .title("海外智能云平台系统接口详情")
  18. .description("Zuul+Swagger2构建RESTful APIs")
  19. .termsOfServiceUrl("http://www.skyworth.com")
  20. .contact(new Contact("skyworth", "http://www.skyworth.com", ""))
  21. .version("1.0")
  22. .build();
  23. }
  24. }

DocumentationConfig.class(注意红色部分,通过遍历eureka路由方式自动添加所有微服务 API 文档,SwaggerResourcesProvider 是资源提供者,我们重写他,把各个微服务的API文档资源路径返回,注释部分为手动添加的方式)

 
  1. @Component
  2. @Primary
  3. public class DocumentationConfig implements SwaggerResourcesProvider {
  4. private final RouteLocator routeLocator;
  5.  
  6. public DocumentationConfig(RouteLocator routeLocator) {
  7. this.routeLocator = routeLocator;
  8. }
  9.  
  10. @Override
  11. public List<SwaggerResource> get() {
  12. List<SwaggerResource> resources = new ArrayList<>();
  13. List<Route> routes = routeLocator.getRoutes();
  14. routes.forEach(route -> {
  15. resources.add(swaggerResource(route.getId(), route.getFullPath().replace("**", "v2/api-docs"), "1.0"));
  16. });
  17. return resources;
  18. }
  19.  
  20. // @Override
  21. // public List<SwaggerResource> get() {
  22. // List resources = new ArrayList<>();
  23. // resources.add(swaggerResource("外接设备系统", "/management-device/v2/api-docs", "1.0"));
  24. // resources.add(swaggerResource("设备管理系统", "/management-equip/v2/api-docs", "1.0"));
  25. // return resources;
  26. // }
  27.  
  28. private SwaggerResource swaggerResource(String name, String location, String version) {
  29. SwaggerResource swaggerResource = new SwaggerResource();
  30. swaggerResource.setName(name);
  31. swaggerResource.setLocation(location);
  32. swaggerResource.setSwaggerVersion(version);
  33. return swaggerResource;
  34. }
  35. }

最后是启动类Application

  1. @SpringBootApplication
  2. @EnableZuulProxy
  3. public class Application {
  4. public static void main(String[] args) {
  5. SpringApplication.run(Application.class, args);
  6. }
  7. }

运行相关服务和zuul-swagger网关,输入:http://localhost:8090/swagger-ui.html

另外谈谈遇到的一个坑,之前没有加eureka.instance.prefer-ip-address=true,导致zuul一直访问不到其他服务(可能是eureka.instance.prefer-ip-address = true 就可以将IP注册到Eureka Server上,而如果不配置就是机器的主机名,而主机名没有做ip映射导致访问不大,具体原因需要探究)。

  1. #服务注册
  2. eureka:
  3. instance:
  4. hostname: device
  5. prefer-ip-address: true

springboot+cloud 学习(四)Zuul整合Swagger2的更多相关文章

  1. SpringBoot(十四)-- 整合Swagger2

    1.pom依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-s ...

  2. spring cloud 学习(6) - zuul 微服务网关

    微服务架构体系中,通常一个业务系统会有很多的微服务,比如:OrderService.ProductService.UserService...,为了让调用更简单,一般会在这些服务前端再封装一层,类似下 ...

  3. springboot学习四:整合mybatis

    在application.properties加入配置 ## Mybatis 配置 mybatis.typeAliasesPackage=org.spring.springboot.domain my ...

  4. spring cloud学习(四) 动态路由

    Zuul的主要功能是路由和过滤器.路由功能是微服务的一部分,zuul实现了负载均衡. 1.1 新建模块zuul pom.xml <?xml version="1.0" enc ...

  5. springboot+cloud 学习(五)统一配置中心 spring cloud config + cloud bus + WebHooks +RibbitMQ

    前言 微服务要实现集中管理微服务配置.不同环境不同配置.运行期间也可动态调整.配置修改后可以自动更新的需求,Spring Cloud Config同时满足了以上要求.Spring Cloud Conf ...

  6. springboot+cloud 学习(三)消息中间件 RibbitMQ+Stream

    安装RabbitMQ window下安装: (1):下载erlang,原因在于RabbitMQ服务端代码是使用并发式语言erlang编写的,下载地址:http://www.erlang.org/dow ...

  7. springboot+cloud 学习(二)应用间通信Feign(伪RPC,实则HTTP)

    在微服务中,使用什么协议来构建服务体系,一直是个热门话题. 争论的焦点集中在两个候选技术:  RPC or Restful Restful架构是基于Http应用层协议的产物,RPC架构是基于TCP传输 ...

  8. SpringBoot实战(十四)之整合KafKa

    本人今天上午参考了不少博文,发现不少博文不是特别好,不是因为依赖冲突问题就是因为版本问题. 于是我结合相关的博文和案例,自己改写了下并参考了下,于是就有了这篇文章.希望能够给大家帮助,少走一些弯路. ...

  9. springboot深入学习(四)-----tomcat配置、websocket

    一.更改servlet服务器 springboot中默认可以集成多种servlet容器,当引入如下依赖时: springboot默认以tomcat作为项目的servlet容器,如果用户想要替换tomc ...

随机推荐

  1. 关于双重for循环封装数据问题

    1.问题描述 在使用双重for循环进行封装数据时出现一个问题,就是有的数据封装上了,有的数据未封装上,找了很久原因: for (A a:ListA) { for (B b: ListB) { if(a ...

  2. trinitycore 魔兽服务器源码分析(三) 多线程相关

    先看LockedQueue.h template <class T, typename StorageType = std::deque<T> >class LockedQue ...

  3. STM32 + RC522(SPI2 和 模拟SPI)

    STM32 + RC522(SPI2 和 模拟SPI) 一. STM32 + RC522(SPI2 模式) 1. 头文件: rc522.h #include "stm32f10x.h&quo ...

  4. qhfl-1 跨域

    CORS跨域请求 CORS即Cross Origin Resource Sharing 跨域资源共享,那么跨域请求还分为两种,一种叫简单请求,一种是复杂请求 简单请求 HTTP方法是下列方法之一 HE ...

  5. UnionFind问题总结

    UnionFind就是acm中常用的并查集... 并查集常用操作 另外补充一下STL常用操作 相关问题: 547. Friend Circles 纯裸题噢... class Solution { pu ...

  6. Tarjan算法(图论)(转)

    有点烦人的算法 贴个算法解析合辑先:https://blog.csdn.net/hurmishine/article/details/75248876

  7. 1119 Pre- and Post-order Traversals

    Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can ...

  8. Linux(以centos7为例)下自动挂载NTFS硬盘

    Linux(以centos7为例)下自动挂载NTFS硬盘 作者:子敬叔叔 编写时间:2017年5月3日星期三 需求:     为了熟悉Linux的使用,在自己的笔记本上新安装一个centos7, 但我 ...

  9. mevan中GroupId和ArtifactId到底怎么填?

    groupid和artifactId被统称为“坐标”是为了保证项目唯一性而提出的,如果你要把你项目弄到maven本地仓库去,你想要找到你的项目就必须根据这两个id去查找. groupId一般分为多个段 ...

  10. attempt to open datawindow failed@安装两个PB软件

    attempt to open datawindow failed@安装两个PB软件 安装了不同版本的PB软件后,默认打开方式为后一个安装的版本. 如果想改为第一个安装版本,在“右键”——>”打 ...