1.代碼地址
鏈接:https://pan.baidu.com/s/1KbVTpA5BuRlNzKESTj4Y-A
提取碼:y0yx
2.Swagger好處在哪裏
傳統開發的幾個痛處
- 對API文檔進行更新的時候,需要通知前端開發人員,導致文檔更新交流不及時;
- API接口返回信息不明確
- 大公司中肯定會有專門文檔服務器對接口文檔進行更新。
- 缺乏在線接口測試,通常需要使用相應的API測試工具,比如postman、SoapUI等
- 接口文檔太多,不便於管理
Swagger具有以下優點
- 功能豐富:支持多種註解,自動生成接口文檔界面,支持在界面測試API接口功能;
- 及時更新:開發過程中花一點寫註釋的時間,就可以及時的更新API文檔,省心省力;
- 整合簡單:通過添加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
- 分別在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 "對不起當前方法不可用";
}
}
- 在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,也請各位大佬,可以分享下這個解決問題的建議,在這裏,提前謝謝你們