目錄
前言
準備
實踐
網關服務配置
1.pom.xml 引入 webflux 版本 springboc 依賴
2.application-dev.yml 配置 springboc 多服務地址
3.application-dev.yml 配置springboc 文檔路由
4.網關過濾器AuthFilter.class 中放行 springboc 訪問路徑
業務服務配置
1.pom.xml 引入 webmvc 版本 springboc 依賴
2.新增 springdoc 接口文檔配置類
調試
1.啟動并訪問
2.請求登錄接口
3.請求用戶名稱接口
前言
在上一篇文章中,我們提到微服務的 API 提供方案選擇了 業務子服務高度自治、獨立提供 API 接口 的模式,并通過 統一的網關服務 將請求轉發到具體的子服務進行邏輯處理。這樣雖然保證了子服務的獨立性,但也帶來了一個新的問題:項目中的接口分散在不同的子服務中,訪問入口地址各不相同,給接口的統一管理與查看帶來了不小的挑戰。
本篇文章將圍繞這一問題展開,介紹如何在分布式的微服務架構下,實現接口的集中管理與統一查看。
準備
主要依賴版本:
- spring boot 3.3.5
- spring cloud 2023.0.1
- spirng cloud alibaba 2023.0.1.0
- jdk 17
參看源碼地址:
About 基于spring cloud alibaba生態快速構建微服務腳手架
實踐
網關服務配置
1.pom.xml 引入 webflux 版本 springboc 依賴
<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webflux-ui</artifactId><version>2.6.0</version>
</dependency>
2.application-dev.yml 配置 springboc 多服務地址
springdoc:swagger-ui:urls:- name: cloud-producerurl: /cloud-producer/v3/api-docs- name: cloud-consumerurl: /cloud-consumer/v3/api-docs- name: 用戶服務url: /cloud-user/v3/api-docs
3.application-dev.yml 配置springboc 文檔路由
每個有 api 文檔的服務都需要配置,可新增到接口路由地址后面
spring:cloud:gateway:discovery:locator:enabled: true # 開啟自動服務發現routes:#此處省略之前配置的服務路由配置- id: cloud-user-docsuri: lb://cloud-userpredicates:- Path=/cloud-user/v3/api-docs- id: cloud-consumer-docsuri: lb://cloud-consumerpredicates:- Path=/cloud-consumer/v3/api-docs- id: cloud-producer-docsuri: lb://cloud-producerpredicates:- Path=/cloud-producer/v3/api-docs
4.網關過濾器AuthFilter.class 中放行 springboc 訪問路徑
@Slf4j
@Component
public class AuthFilter implements GlobalFilter, Ordered {private static final List<String> EXCLUDE_PATH_LIST = List.of("/cloud-user/user/login");@Resourceprivate RedisTemplate redisTemplate;private static final String SECRET_KEY = "expected-secret";@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();String requestURI = request.getURI().getPath();// 白名單直接放行if (EXCLUDE_PATH_LIST.stream().anyMatch(requestURI::startsWith) ||requestURI.contains("/v3/api-docs") ||requestURI.contains("/doc.html")) {//...}}
}
業務服務配置
不需要單獨在每個服務子服務中配置,因為我們前面提供了一個公共服務 cloud-common,每個業務子服務都引入了,所以只需要在公告服務中配置就能生效
1.pom.xml 引入 webmvc 版本 springboc 依賴
<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.6.0</version>
</dependency>
2.新增 springdoc 接口文檔配置類
- 統一配置每個服務接口訪問前綴
- 添加全局請求頭 token 屬性字段
@Configuration
public class OpenApiConfig {@Value("${spring.application.name}")private String serverName;private static final String SECURITY_SCHEME_NAME = "TokenAuth";@Beanpublic OpenAPI customOpenAPI() {return new OpenAPI().servers(List.of(new Server().url("http://localhost:9090/" + serverName) // 這里寫網關地址)) // 配置全局 SecurityScheme.components(new Components().addSecuritySchemes(SECURITY_SCHEME_NAME,new SecurityScheme().type(SecurityScheme.Type.APIKEY).in(SecurityScheme.In.HEADER).name(HttpHeaders.AUTHORIZATION) // 請求頭token字段名))// 應用到所有接口.addSecurityItem(new SecurityRequirement().addList(SECURITY_SCHEME_NAME));}
}
注:http://localhost:9090網關地址根據具體環境進行調整
調試
1.啟動并訪問
啟動網關服務:cloud-gateway
啟動業務子服務:cloud-user
訪問路徑:http://localhost:9090/swagger-ui.html
2.請求登錄接口
3.請求用戶名稱接口
將登錄返回的 token 設置到文檔全局 token 中
請求接口成功