前言

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

下面举例用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文件中引入依赖:

<!-- 必须要引入 springboot parent ,帮我们实现了很多jar包的依赖管理 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0..RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent> <dependencyManagement>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement> <!-- 版本集中配置 -->
<properties>
<swagger2.version>2.9.</swagger2.version>
</properties> <dependencies>
<!-- eureka client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency> <!-- zuul -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency> <!-- swagger2 依赖 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger2.version}</version>
</dependency>
</dependencies>

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

#端口
server:
port:
#应用名称
spring:
application:
name: zuul-swagger2
#服务注册
eureka:
instance:
hostname: zuul-swagger2
client:
serviceUrl:
defaultZone: http://skyworth:skyworth1@eureka-server:8761/eureka/,http://skyworth:skyworth2@eureka-server2:8762/eureka/,http://skyworth:skyworth3@eureka-server3:8763/eureka/
# 路由配置方式一
#zuul:
# routes:
#所有请求management-equip的请求,都会被拦截,并且转发到equip上
# management-equip: /equip/** # 路由配置方式二
#zuul:
# routes:
# # 其中equip是路由名称,可以随便定义,但是path和service-id需要一一对应
# equip:
# path: /equip/**
# # management-equip为注册到Eureka上的服务名
# service-id: management-equip

Swagger2配置类:

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

SwaggerConfig.class

@Configuration
@EnableSwagger2
public class SwaggerConfig { @Bean
public Docket buildDocket() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(buildApiInf()) // .apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage(""))// 需要生成文档的包的位置
.paths(PathSelectors.any())
.build();
} private ApiInfo buildApiInf() {
return new ApiInfoBuilder()
.title("海外智能云平台系统接口详情")
.description("Zuul+Swagger2构建RESTful APIs")
.termsOfServiceUrl("http://www.skyworth.com")
.contact(new Contact("skyworth", "http://www.skyworth.com", ""))
.version("1.0")
.build();
}
}

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

 
@Component
@Primary
public class DocumentationConfig implements SwaggerResourcesProvider {
private final RouteLocator routeLocator; public DocumentationConfig(RouteLocator routeLocator) {
this.routeLocator = routeLocator;
} @Override
public List<SwaggerResource> get() {
List<SwaggerResource> resources = new ArrayList<>();
List<Route> routes = routeLocator.getRoutes();
routes.forEach(route -> {
resources.add(swaggerResource(route.getId(), route.getFullPath().replace("**", "v2/api-docs"), "1.0"));
});
return resources;
} // @Override
// public List<SwaggerResource> get() {
// List resources = new ArrayList<>();
// resources.add(swaggerResource("外接设备系统", "/management-device/v2/api-docs", "1.0"));
// resources.add(swaggerResource("设备管理系统", "/management-equip/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;
}
}

最后是启动类Application

@SpringBootApplication
@EnableZuulProxy
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

运行相关服务和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映射导致访问不大,具体原因需要探究)。

#服务注册
eureka:
instance:
hostname: device
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. 19. pt-query-digest

    慢查询参数 slow_query_log=1slow_query_log_file=/mysql3306/log/slow.log 记录的是查询语句,而非管理语句.除非启用 los_slow_admi ...

  2. 基于UML的中职班主任工作管理系统的分析与设计--文献随笔(二)

    一.基本信息 标题:基于UML的中职班主任工作管理系统的分析与设计 时间:2016 出版源:遵义航天工业学校 关键字:中职学校; 班主任工作管理; UML建模 二.研究背景 问题定义:班主任是一项特殊 ...

  3. windows下使用redis c++

    redis是高效key-value NOSQL 数据库 代码开源 windows下使用需要使用微软在redis官方上的改进版 地址 https://redis.io/download 寻找window ...

  4. SprirngBoot微服务之间的交互—— restTemplate

    一 例:需要在storage服务中请求utils服务的某个接口(两个服务都已向同一台eureka server 注册) 步骤: 1 在utils创建需被调用的接口 @RestController @R ...

  5. 主键生成策略sequence

    http://blog.csdn.net/shanhuhau/article/details/24978253 表示:如果不写序列名,会走默认的序列 若写,则seq_表名_属性名

  6. (PMP)第12章-----项目采购管理

    B D 12.1 规划采购管理 输入 工具与技术 输出 1.项目章程 2.商业文件 (商业文件, 效益管理计划) 3.项目管理计划 (范围,质量,资源管理计划, 范围基准) 4.项目文件 (里程碑清单 ...

  7. 走进JDK(五)------AbstractList

    接下来的一段时间重点介绍java.util这个包中的内容,这个包厉害了,包含了collection与map,提供了集合.队列.映射等实现.一张图了解java中的集合类: AbstractList 一. ...

  8. Noxim Overview

    PE+Router= Tile Node Architectural Elements: Buffer.h, Router.h, LocalRoutingTable.h, Tile.h, NoC.h, ...

  9. 提取日志中出现的userId或其他信息

    项目上线后经常出现需要统计用户数据.接口请求等.完美的情况下,在项目开始前就设计好哪些request.中间过程需要落地到db.或以一定格式存入专门的log中,但也常需要同学们临时去业务日志中grep ...

  10. C#使用iTextSharp+ZXing.Net+FreeSpire.PDF生成和打印pdf文档

    项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.Net+FreeSpire.PDF三个类库实现了生成pdf.生成条形码和打印pdf功能. 首先在项 ...