Spring Cloud 項目中使用 Swagger

Spring Cloud 項目中使用 Swagger

  • 關于方案的選擇
    在 Spring Cloud 項目中使用 Swagger 有以下 4 種方式:

  • 方式一 :在網關處引入 Swagger ,去聚合各個微服務的 Swagger。未來是訪問網關的 Swagger 原生界面。

  • 方式二 :在網關處引入 knife4j,去聚合各個微服務的 Swagger。未來是訪問網關的 knife4j 的美化版界面。

  • 方式三 :使用 knife4j 去創建一個獨立的聚合項目,去聚合各個微服務的 Swagger。未來是訪問這個聚合項目的 knife4j 的美化版界面。

  • 方式四 :使用獨立的、另外的第三方工具(例如,Apifox),去聚合各個微服務的 Swagger。未來是訪問這個第三方工具。

在上述 4 種方案中,我們選擇的是方案四,原因在于:

  • 對于方案一方案二而言,本質上是一樣的,主要無非就是頁面美不美觀的問題。knife4j 的頁面要強過 swagger 的原生界面的,但和第三方工具比起來,還是遠不如第三方插件好看(和功能豐富)。
  • knife4j 對原生 Swagger 有所拓展,提升了便捷性,但是提升有效。如果拋開“頁面美觀”這個主要優點,其它有關“拓展”層面的優點并沒有那么多的“非用不可”。
  • 方案三的 knife4j 的聚合項目雖然能夠很方便的集合各個微服務,使用上要方便于網關聚合,但是,你是用它就意味著你的測試請求都繞過了網關,如果你在網管處有代碼邏輯,那么這部分代碼就“跳”過去了,不利于測試。

所以,從美觀、完善各方面綜合考慮,我們采用上面的方案四

使用方案四意味著:

  • 我們的項目中只需要引入 swagger 的包,不需要引入 knife4j 的包。
  • 如果我們不需要在網關處看到原生的 swagger 頁面,那么網關項目不需要有任何改動。原生的 swagger 頁面,那么網關項目不需要有任何改動。

各個微服務的改動

改動一:引包和配置文件
<dependency>  <groupId>com.github.xiaoymin</groupId>  <artifactId>knife4j-spring-boot-starter</artifactId>  <version>3.0.3</version>  <!--<version>2.0.9</version>-->  
</dependency>
# knife4j公共配置  
knife4j.enable=true
改動二:新增配置類
@Configuration  
@EnableOpenApi  
@RequiredArgsConstructor  
public class SwaggerConfiguration {  private final OpenApiExtensionResolver openApiExtensionResolver;  @Value("${spring.application.name}")  private String applicationName;  @Bean  @Order(value = 1)  public Docket docDocket() {  return new Docket(DocumentationType.OAS_30)  .pathMapping("/" + applicationName) // ==> /department-service  .enable(true)  .apiInfo(groupApiInfo())  .select()  .apis(RequestHandlerSelectors.withMethodAnnotation(Operation.class))  .paths(PathSelectors.any())  .build()  .extensions(openApiExtensionResolver.buildExtensions("部門微服務"))  ;  }  private ApiInfo groupApiInfo() {  return new ApiInfoBuilder()  .title("Knife4j接口文檔")  .description("Knife4j接口文檔")  .termsOfServiceUrl("https://doc.xiaominfo.com/")  .version("1.0.0")  .build();  }
}
關鍵項說明

上述內容,無論是 pom 引包,還是加配置類,絕大部分內容都是復制粘貼,無需改動的。

但是在配置類中,有一個信息必須注意,它必須和你的 spring-cloud 的配置相關:

.pathMapping("/" + applicationName) 

.pathMapping() 方法的值表示的是:Swagger 對外暴露的測試功能中,在原本的(@RestController)的 URI 之外,額外加上一段什么樣的前綴。

為什么會有這樣的要求?

未來,無論是在 Apifox 這樣的第三方工具中測試,還是在網關處的原生的 Swagger 頁面上進行測試,我們的測試請求都是應該發送給網關的,再由網關將請求路由給微服務。

所以,在 Apifox 中,或者是網管處的原生的 Swagger 中,我們發送請求的“前一段”的 IP 和 Port 的組合是網關的 IP 和 Port 。而網關在默認情況下則是根據它所收到的“請求的 URI 中的前一段和微服務的服務名的匹配情況”作為依據來路由請求。

如果,各個微服務的 Swagger 的配置中沒有主動的多“加上”一段能路由到自己的 URI 前綴,那么 Swagger 所暴露出來的請求測試功能所產生的拼接出來的 URI 就成了:網關的 IP 和 Port 拼上微服務的 URI,而沒有微服務標識那一段。例如:

## 127.0.0.1:10000 是網關地址
http://127.0.0.1:10000/department/delete

但是,從上帝視角看,本應該是:

## 127.0.0.1:10000 是網關地址
http://127.0.0.1:10000/department-service/department/delete

只有這樣,Swagger 所暴露出來的測試功能才能正常使用。

所以,這就需要 department-service 自己在它的 Swagger 配置中說明:在自己的 Swagger 暴露的測試功能中,需要在正常的 URI 前面“多”加上 /department-service 前綴,這樣才能讓 Swagger 暴露的 URI 經過網關后正常路由到自己這里來。

網關處的改動

注意
如果你不指望在網關處看到、訪問原生的 Swagger 界面,那么,這一步操作就不是必須的,不用做。

引入 swagger 包
<dependency>  <groupId>io.springfox</groupId>  <artifactId>springfox-boot-starter</artifactId>  <version>3.0.0</version>  
</dependency>
新增配置類
@Primary  
@Configuration  
@EnableOpenApi  
@RequiredArgsConstructor  
public class SwaggerConfig implements SwaggerResourcesProvider {  private static final String OAS_30_URL = "/v3/api-docs";  private final RouteLocator routeLocator;  private final GatewayProperties gatewayProperties;  /**  * 網關應用名稱     */@Value("${spring.application.name}")  private String self;  @Override  public List<SwaggerResource> get() {  List<SwaggerResource> resources = new ArrayList<>();  List<String> routeHosts = new ArrayList<>();  routeLocator.getRoutes()  .filter(route -> route.getUri().getHost() != null)  .filter(route -> Objects.equals(route.getUri().getScheme(), "lb"))  // 過濾掉網關自身的服務 uri 中的 host 就是服務 id .filter(route -> !self.equalsIgnoreCase(route.getUri().getHost()))  .subscribe(route -> routeHosts.add(route.getUri().getHost()));  // 記錄已經添加過的server,存在同一個應用注冊了多個服務在注冊中心上  Set<String> dealed = new HashSet<>();  routeHosts.forEach(instance -> {  // 拼接 url ,目標 swagger 的 url  String url = "/" + instance.toLowerCase() + OAS_30_URL;  System.out.println("url: " + url);  if (!dealed.contains(url)) {  dealed.add(url);  SwaggerResource swaggerResource = new SwaggerResource();  swaggerResource.setUrl(url);  swaggerResource.setName(instance);  //swaggerResource.setSwaggerVersion("3.0.3");  resources.add(swaggerResource);  }  });  return resources;  }  }

Apifox 引入

image.png

image.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/16026.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16026.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/16026.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RedHat9 | DNS剖析-配置輔助DNS服務器

一、實驗環境 1、輔助域名DNS服務器 DNS通過劃分為若干個區域進行管理&#xff0c;每一個區域由1臺或多臺DNS服務器負責解析&#xff0c;如果僅僅采用1臺DNS服務器&#xff0c;在DNS服務器出現故障后&#xff0c;用戶將無法完成解析。 輔助DNS服務器的優點 容災備份&#x…

區間預測 | Matlab實現DNN-KDE深度神經網絡結合核密度估計多置信區間多變量回歸區間預測

區間預測 | Matlab實現DNN-KDE深度神經網絡結合核密度估計多置信區間多變量回歸區間預測 目錄 區間預測 | Matlab實現DNN-KDE深度神經網絡結合核密度估計多置信區間多變量回歸區間預測效果一覽基本介紹程序設計參考資料 效果一覽 基本介紹 1.Matlab實現DNN-KDE深度神經網絡結合…

MySQL數據處理增刪改

數據處理增刪改DML 由于約束&#xff0c;以下操作都有可能執行失敗&#xff08;后面講約束&#xff09; 插入數據 INSERT 基礎添加&#xff1a;VALUES 值的順序必須和表中字段順序相同 INSERT INTO class VALUES(1,王小,10); 向指定字段添加&#xff1a; 值的順序和指定…

rocketmq初識

package com.ldj.rocketmq.producer;import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.common.message.Message;import java.nio.charset.StandardCharsets;/*** User: ldj* Date: 2024/3/26* Time: 2:26* Description: 單向消息生產…

MT7628原廠Uboot修改交互串口

工作中&#xff0c;遇到用戶用Skylab的SKW92A模組&#xff0c;在參考設計時&#xff0c;將UART接口預留錯的情況&#xff0c;對于這種情況&#xff0c;需要將原廠SDK默認的交互串口UART0&#xff0c;改為UART1。在開發過程中&#xff0c;經常需要在Uboot階段升級固件&#xff0…

【Linux部署】【pig前端部署】Linux安裝- docker/docker-compose/nginx (使用docker優雅部署nginx)

&#x1f338;&#x1f338; Linux安裝- docker/docker-compose/nginx 優雅部署 &#x1f338;&#x1f338; 一、一鍵安裝jdk yum install -y java-1.8.0-openjdk.x86_64驗證 二、安裝docker yum list docker-ce --showduplicates | sort -rsudo yum install -y yum-utils …

LabVIEW波紋補償器無線監測系統

LabVIEW波紋補償器無線監測系統 在石油化工、冶金及電力等行業中&#xff0c;波紋補償器作為一種重要的補償性元件&#xff0c;其安全穩定的運行對管道輸送系統的可靠性至關重要。開發了一種基于LabVIEW的波紋補償器無線監測系統&#xff0c;通過實時監測波紋補償器的工作狀態…

嵌入式單片機寄存器操作與實現方法

大家好,今天給大家分享一下,單片機中寄存器該如何操作與實現。 “芯片里面的寄存器訪問方式一般是: 1.可使用地址訪問,2.可使用指令訪問,3.不可訪問” 第一:掛載到內存地址總線上了的 掛載到內存地址總線上了的,可以使用分配到的地址訪問 如下是STM32單片機存儲器映像…

單條16g和雙條8g哪個好

單條16g和雙條8g各有優劣,具體選擇要根據個人需求和電腦配置來決定。 以下是一些參考信息: ?單條16g內存的價格比雙條8g內存的價格低,而且16g的內存容量大,一條內存十分的方便。 ?兩條8g內存可以組成雙通道,電腦運行速度要快一些。 ?對于普通使用電腦的人群與熱衷于…

Sourcetree安裝教程及使用

1 Sourcetree介紹 Sourcetree是一款免費的Git圖形化客戶端&#xff0c;它由Atlassian開發&#xff0c;提供了跨平臺的支持&#xff0c;可運行在Windows和Mac操作系統上。Sourcetree可以讓開發者更方便地使用Git來管理代碼&#xff0c;不需要在命令行中輸入復雜的Git命令&#x…

asp.net core接入prometheus2-自定義指標

前提 了解一下asp.net core接入prometheus快速入門 https://blog.csdn.net/qq_36437991/article/details/139064138 新建.net 8空web項目 安裝下面三個包 <PackageReference Include"OpenTelemetry.Exporter.Prometheus.AspNetCore" Version"1.8.0-rc.1&…

druid 1.2.14,application.yaml配置文件中,如何進行數據庫加密配置

步驟一&#xff1a;先生成加密的密碼&#xff1a; 步驟二&#xff1a;配置application.yaml文件&#xff1a; spring:datasource:driver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourcedruid:username: rootpassword: aPJ35saFz6ASmnmNt…

FFmpeg濾鏡完整列表

FFmpeg濾鏡完整列表 濾鏡名稱 用途 acompressor 壓縮音頻信號,當輸入信號超過某個預設閾值時&#xff0c;壓縮器就會開始工作。該濾鏡使音量大的部分變得不那么響亮&#xff0c;而音量小的部分相對變得響亮&#xff0c;這樣就可以使整體聽起來更加均衡&#xff0c;常用于音樂…

【汽車操作系統】Autosar和商用OS

目錄 什么是AUTOSAR? CP AUTOSAR架構 CAN通信 AP AUTOSAR 背景 CP&AP 開發方面的不同&#xff1a; WRLinux介紹 QNX介紹 什么是AUTOSAR? 隨著汽車功能越來越多&#xff0c;導致ECU的數量越來越多。1993年的時候&#xff0c;奧迪A8才只有5個ECU現在典型的現代汽車…

計算機二級考試通關秘籍:全面解析、實戰演練與高效備考策略

計算機二級考試通關秘籍&#xff1a;全面解析、實戰演練與高效備考策略 一、計算機二級考試概覽基本概念 二、科目詳解與復習資料推薦C語言程序設計學習重點資料推薦 Java語言程序設計學習重點資料推薦 MySQL數據庫程序設計學習重點資料推薦 Web技術與應用學習重點資料推薦 三、…

兩種單例模式的區別

文章目錄 看兩個栗子傳統指針版單例模式現代靜態變量版單例模式 分析結論 看兩個栗子 傳統指針版單例模式 class Singleton { private:// 私有化構造函數Singleton() {}// 禁止拷貝構造函數Singleton(const Singleton&) delete;// 禁止拷貝賦值操作Singleton& opera…

自然資源-各級國土空間總體規劃的審查要點及流程總結

自然資源-各級國土空間總體規劃的審查要點及流程總結 國土空間規劃是對一定區域國土空間開發保護在空間和時間上作出的安排&#xff0c;包括總體規劃、詳細規劃和相關專項規劃。 國土空間規劃管理是國土空間規劃中重要的一環。中共中央、國務院發布《關于建立國土空間規劃體系…

LabelMe下載及關鍵點檢測數據標注

本文關鍵點數據集鏈接,提取碼:x1pk 1.LabelMe下載 這部分內容和YOLOv8_seg的標注軟件是一樣的,使用anaconda創建虛擬環境安裝LabelMe,指令如下: conda create -n labelme python=3.6 -y conda activate labelme conda install pyqt conda install pillow pip install la…

朝天椒USB服務器為何脫穎而出,與其它產品有何不同?

在數字化時代&#xff0c;USB服務器作為解決U盾、加密狗、Ukey等USB設備原創連接、集中管理和共享使用問題的有效工具&#xff0c;越來越受到各行各業的重視。在眾多品牌中&#xff0c;朝天椒USB服務器憑借其獨特的技術優勢和市場定位&#xff0c;成功脫穎而出&#xff0c;成為…

python:__set_name__使用

python&#xff1a;__set_name__使用 1 前言 在Python中&#xff0c;我們可以通過__set_name__方法來實現一些特殊的操作。該方法是在定義類的時候被調用&#xff0c;用于設置屬性的名稱。這樣一來&#xff0c;我們就可以在類定義中動態地獲取屬性的名稱&#xff0c;從而更好…