springboot+cloud 學習(四)Zuul整合Swagger2

前言

在微服務架構下,服務是分散的,怎麼把全部服務接口整合到一塊兒是咱們須要關注的。html

下面舉例用zuul做爲分佈式系統的網關,同時使用swagger生成文檔,想把整個系統的文檔整合在同一個頁面上來講明。spring

項目結構

eureka-server:eureka服務註冊中心,端口8761,api

eureka-server2:eureka服務註冊中心,端口8762, springboot

eureka-server3:eureka服務註冊中心,端口8763, 架構

zuul-swagger2:zuul網關,端口8090, app

management-device:外接設備系統,端口8083, 分佈式

management-equip:設備管理系統,端口8082, ide

Zuul整合Swagger2

eureka註冊中心的搭建這裏再也不講述,直接來看zuul-swagger2項目裏怎麼集成swaggerspring-boot

pom.xml文件中引入依賴:微服務

<!-- 必需要引入 springboot parent ,幫咱們實現了不少jar包的依賴管理 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.2.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.0</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: 8090
#應用名稱
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
相關文章
相關標籤/搜索