Swagger-API文檔管理

1.代碼地址

鏈接:https://pan.baidu.com/s/1KbVTpA5BuRlNzKESTj4Y-A 
提取碼:y0yx

2.Swagger好處在哪裏

傳統開發的幾個痛處

  1. 對API文檔進行更新的時候,需要通知前端開發人員,導致文檔更新交流不及時;
  2. API接口返回信息不明確
  3. 大公司中肯定會有專門文檔服務器對接口文檔進行更新。
  4. 缺乏在線接口測試,通常需要使用相應的API測試工具,比如postman、SoapUI等
  5. 接口文檔太多,不便於管理

Swagger具有以下優點

  1. 功能豐富:支持多種註解,自動生成接口文檔界面,支持在界面測試API接口功能;
  2. 及時更新:開發過程中花一點寫註釋的時間,就可以及時的更新API文檔,省心省力;
  3. 整合簡單:通過添加pom依賴和簡單配置,內嵌於應用中就可同時發佈API接口文檔界面,不需要部署獨立服務。

爲了解決傳統API接口文檔維護的問題,爲了方便進行測試後臺Restful接口並實現動態的更新,因而引入Swagger接口工具。

3.SpringBoot整合Swagger

1. 依賴文件

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
    </parent>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.M7</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!-- SpringBoot整合Web組件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- SpringBoot整合eureka客戶端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!-- swagger2 -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.8.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.8.0</version>
        </dependency>
    </dependencies>
    <!-- 注意: 這裏必須要添加, 否者各種依賴有問題 -->
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

</project>

2.配置文件

@Configuration
//開啓swagger功能
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()
                // 生成掃包的範圍
                .apis(RequestHandlerSelectors.basePackage("com.disney.api")).paths(PathSelectors.any()).build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder().title("微服務電商系統").description("Java分佈式")
                .termsOfServiceUrl("http://www.baidu.com")
                // 文檔的版本號
                .version("1.0").build();
    }

}

3. controller

@RestController
//對於的接口的描述
@Api("測試控制器")
public class SwaggerController {

    @ApiOperation("swagger接口")
    @GetMapping("/index") //這裏儘可能用restful風格的請求路徑,不然寫requestMapping的話,任何的形式的請求都會有,很亂
    public String getIndex(){
        return "index";
    }
}

4.啓動類

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

訪問http://localhost:8989/swagger-ui.html#/swagger-controller 即可看到如下界面
在這裏插入圖片描述

4.參數的生成

  @ApiOperation("參數的獲取")
    @GetMapping("/getname")
    @ApiImplicitParam(name = "name",value = "用戶參數",required = true,dataType = "String")
    public String getName(String name){
     return name;
    }

在這裏插入圖片描述

5.微服務網關Zuul集羣整合Swagger

所面臨的的問題: Swagger是針對單獨所在項目接口進行生成,那麼微服務的所有服務的接口,如何整合在一起呢?

相關的SpirngCloud Zuul網關的可以參考https://blog.csdn.net/qq_42292373/article/details/103227925

  1. 分別在Member和Order項目,Zuul網關 添加依賴
       <dependency>
            <groupId>com.spring4all</groupId>
            <artifactId>swagger-spring-boot-starter</artifactId>
            <version>1.7.0.RELEASE</version>
        </dependency>

2,啓動類改變(Order 和Member )

@SpringBootApplication
@EnableFeignClients
@EnableEurekaClient
@EnableHystrix
//生成swagger文檔
@EnableSwagger2Doc
public class AppOrder {
    public static void main(String[] args) {
        SpringApplication.run(AppOrder.class, args);
    }
}

3.增加掃描接口的路徑

###服務啓動端口號
server:
  port: 8020
###服務名稱(服務註冊到eureka名稱)
spring:
  application:
    name: app-itmayiedu-order
###服務註冊到eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8100/eureka
    ###因爲該應用爲註冊中心,不會註冊自己
    register-with-eureka: true
    ###是否需要從eureka上獲取註冊信息
    fetch-registry: true
###設置feign客戶端超時時間
ribbon:
  ###指的是建立連接所用的時間,適用於網絡狀況正常的情況下,兩端連接所用的時間。
  ReadTimeout: 5000
  ###指的是建立連接後從服務器讀取到可用資源所用的時間。
  ConnectTimeout: 5000
#feign:
#  hystrix:
#enabled: true
swagger:
  base-package: com.member.impl  # 掃描的路徑

4,對接口的說明

@RestController
@Api("訂單服務接口")
public class OrderServiceImpl  implements IOrderService {

    @Autowired
    private MemberServiceFeigin memberServiceFeigin;

    @RequestMapping("/orderToMember")
    public String orderToMember(String name) {
        UserEntity user = memberServiceFeigin.getMember(name);
        return user == null ? "沒有找到用戶信息" : user.toString();
    }
//    @HystrixCommand(fallbackMethod = "fallbackMethod")
    @ApiOperation("getIndex")
    @RequestMapping("/getIndex")
    public String getIndex(){
        return memberServiceFeigin.getIndex();
    }

    public String fallbackMethod(){
        return "對不起當前方法不可用";
    }
}

  1. 在Zuul網關服務中添加配置和啓動類的修改
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
@EnableSwagger2Doc
public class ZuulApplication {
    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication.class,args);
    }

    @RefreshScope
    @ConfigurationProperties("zuul")
    public ZuulProperties zuulProperties(){
        return new ZuulProperties();
    }


    // 添加文檔來源
    @Component
    @Primary
    class DocumentationConfig implements SwaggerResourcesProvider {
        @Override
        public List<SwaggerResource> get() {
            List resources = new ArrayList<>();
            //arg 根據服務別名,確定文檔的目標
            //arg1 通過網關進行查詢API文檔
            //arg2
            resources.add(swaggerResource("app-itmayiedu-member", "/api-member/v2/api-docs", "2.0"));
            resources.add(swaggerResource("app-itmayiedu-order", "/api-order/v2/api-docs", "2.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;
        }
    }

}

然後訪問http://localhost:81/swagger-ui.html或者http://localhost:82/swagger-ui.html 任意網關端口號,即可看到如下的界面

在這裏插入圖片描述
注意:如果有ZullFilter的話,可能會出現這個界面,所以上面的圖片,我註釋掉了ZuulFilter,也請各位大佬,可以分享下這個解決問題的建議,在這裏,提前謝謝你們
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章