天天看點

內建SWAGGER2服務-spring cloud 入門教程

Swagger 是最流行的用于設計、建構和記錄 RESTful API 的工具。它與 Spring Boot 有很好的內建。要将其與 Spring 結合使用,我們需要向 Maven管理檔案中 添加以下兩個依賴項

pom.xml

1

2

3

4

5

6

7

8

9

10

<

dependency

>

<

groupId

>io.springfox</

groupId

>

<

artifactId

>springfox-swagger2</

artifactId

>

<

version

>2.6.1</

version

>

</

dependency

>

<

dependency

>

<

groupId

>io.springfox</

groupId

>

<

artifactId

>springfox-swagger-ui</

artifactId

>

<

version

>2.6.1</

version

>

</

dependency

>

單個 Spring Boot 服務的 Swagger 配置非常簡單。如果您想為多個分離的微服務建立一個文檔,則複雜程度更高。此類文檔應在 API 網關上可用。在下圖中,您可以看到我們示例解決方案的架構。

內建SWAGGER2服務-spring cloud 入門教程

首先,我們應該在每個微服務上配置 Swagger。要啟用它,我們必須

@EnableSwagger2

在主類上聲明。在應用程式啟動期間,Swagger 庫将根據源代碼自動生成 API 文檔。程序由

Docket

@Bean

控制,在主類中聲明。我們還使用apiInfo方法設定了一些其他屬性,如标題、作者和描述。預設情況下,Swagger 為所有 REST 服務生成文檔,包括由 Spring Boot 建立的服務。我們希望将文檔僅限于

@RestController

位于com.microservices.advanced.account.api包中的文檔。

@Bean

public

Docket api()

throws

IOException, XmlPullParserException {

MavenXpp3Reader reader =

new

MavenXpp3Reader();

Model model = reader.read(

new

FileReader(

"pom.xml"

));

return

new

Docket(DocumentationType.SWAGGER_2)

.select()

.apis(RequestHandlerSelectors.basePackage(

"com.microservices.advanced.account.api"

))

.paths(PathSelectors.any())

.build().apiInfo(

new

ApiInfo(

"Account Service Api Documentation"

,

"Documentation automatically generated"

, model.getParent().getVersion(),

null

,

new

Contact(

"Jack.Yang"

,

"**@163.com"

,

"**@163.com"

),

null

,

null

));

}

這是我們的 API RESTful 控制器。

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

@RestController

public

class

AccountController {

@Autowired

AccountRepository repository;

protected

Logger logger = Logger.getLogger(AccountController.

class

.getName());

@RequestMapping

(value =

"/accounts/{number}"

, method = RequestMethod.GET)

public

Account findByNumber(

@PathVariable

(

"number"

) String number) {

logger.info(String.format(

"Account.findByNumber(%s)"

, number));

return

repository.findByNumber(number);

}

@RequestMapping

(value =

"/accounts/customer/{customer}"

, method = RequestMethod.GET)

public

List findByCustomer(

@PathVariable

(

"customer"

) String customerId) {

logger.info(String.format(

"Account.findByCustomer(%s)"

, customerId));

return

repository.findByCustomerId(customerId);

}

@RequestMapping

(value =

"/accounts"

, method = RequestMethod.GET)

public

List findAll() {

logger.info(

"Account.findAll()"

);

return

repository.findAll();

}

@RequestMapping

(value =

"/accounts"

, method = RequestMethod.POST)

public

Account add(

@RequestBody

Account account) {

logger.info(String.format(

"Account.add(%s)"

, account));

return

repository.save(account);

}

@RequestMapping

(value =

"/accounts"

, method = RequestMethod.PUT)

public

Account update(

@RequestBody

Account account) {

logger.info(String.format(

"Account.update(%s)"

, account));

return

repository.save(account);

}

}

每個微服務上都存在類似的 Swagger 配置。API 文檔位于http://localhost:/swagger-ui.html 下。現在,我們希望為所有微服務啟用一個嵌入網關的文檔。這是 Spring

@Component

實作

SwaggerResourcesProvider

接口,它覆寫 Spring 上下文中存在的預設提供程式配置。

@Component

@Primary

@EnableAutoConfiguration

public

class

DocumentationController

implements

SwaggerResourcesProvider {

@Override

public

List get() {

List resources =

new

ArrayList<>();

resources.add(swaggerResource(

"account-service"

,

"/api/account/v2/api-docs"

,

"2.0"

));

resources.add(swaggerResource(

"customer-service"

,

"/api/customer/v2/api-docs"

,

"2.0"

));

resources.add(swaggerResource(

"product-service"

,

"/api/product/v2/api-docs"

,

"2.0"

));

resources.add(swaggerResource(

"transfer-service"

,

"/api/transfer/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;

}

}

所有微服務 api-docs 都作為 Swagger 資源添加。位置位址通過 Zuul 網關代理。這是網關路由配置。

zuul:

prefix: /api

routes:

account:

path: /account/**

serviceId: account-service

customer:

path: /customer/**

serviceId: customer-service

product:

path: /product/**

serviceId: product-service

transfer:

path: /transfer/**

serviceId: transfer-service

現在,API 文檔在網關位址http://localhost:8765/swagger-ui.html下可用。您可以在下圖中看到它如何查找帳戶服務。我們可以在标題面闆内的組合框中選擇源服務。

內建SWAGGER2服務-spring cloud 入門教程

通過提供

UIConfiguration

@Bean

. 在下面的代碼中,我通過将“list”設定為第二個構造函數參數 - docExpansion 來更改預設操作擴充級别。

@Bean

UiConfiguration uiConfig() {

return

new

UiConfiguration(

"validatorUrl"

,

"list"

,

"alpha"

,

"schema"

,

UiConfiguration.Constants.DEFAULT_SUBMIT_METHODS,

false

,

true

, 60000L);

}

您可以展開每個操作以檢視詳細資訊。每個操作都可以通過提供所需參數并單擊Try it out來測試!按鈕。

內建SWAGGER2服務-spring cloud 入門教程
內建SWAGGER2服務-spring cloud 入門教程

使用 Zuul、Ribbon、Feign、Eureka 和 Sleuth、Zipkin 建立簡單spring cloud微服務用例-spring cloud 入門教程

微服務內建SPRING CLOUD SLEUTH、ELK 和 ZIPKIN 進行監控-spring cloud 入門教程

使用Hystrix 、Feign 和 Ribbon建構微服務-spring cloud 入門教程

使用 Spring Boot Admin 監控微服務-spring cloud 入門教程

基于Redis做Spring Cloud Gateway 中的速率限制實踐-spring cloud 入門教程

內建SWAGGER2服務-spring cloud 入門教程

Hystrix 簡介-spring cloud 入門教程

Hystrix 原理深入分析-spring cloud 入門教程 

使用Apache Camel建構微服務-spring cloud 入門教程

內建 Kubernetes 來建構微服務-spring cloud 入門教程

內建SPRINGDOC OPENAPI 的微服務實踐-spring cloud 入門教程

SPRING CLOUD 微服務快速指南-spring cloud 入門教程

基于GraphQL的微服務實踐-spring cloud 入門教程

最火的Spring Cloud Gateway 為經過身份驗證的使用者啟用速率限制實踐-spring cloud 入門教程

繼續閱讀