Spring Cloud 項目在網關聚合 Swagger 文檔

文章目錄

    • Spring Cloud 項目在網關聚合 Swagger 文檔
      • 各個微服務的改動
        • 改動一:新增依賴
        • 改動二:新增配置類
        • 關鍵項說明
      • Gateway 的改動
        • 改動一:新增依賴
        • 改動二:新增配置類和處理類
        • 改動三:改動配置文件

Spring Cloud 項目在網關聚合 Swagger 文檔

示例代碼:Gitee 倉庫 中的

項目說明
swagger-2-sample-knife4j-cloudswagger 請求走網關

各個微服務的改動

改動一:新增依賴
<dependency>  <groupId>com.github.xiaoymin</groupId>  <artifactId>knife4j-micro-spring-boot-starter</artifactId>  <version>${knife4j.version}</version>  <!-- 3.0.3 --><exclusions>  <exclusion>  <groupId>javax.validation</groupId>  <artifactId>validation-api</artifactId>  </exclusion>  </exclusions>  
</dependency>
改動二:新增配置類
  
@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() 方法的的值是你的請求通過網關時“必要的前綴”。

換句話說,一個請求經過網關之后,為了確保要能夠被網關“轉”到你的當前微服務中,網關所收到的請求 URI 中的前綴必須是一個特定的、約定好的內容。

在這里(默認情況下),我們都是以微服務的服務名作為前綴。這個值,就是項目配置文件中的 spring.application.name 配置項的值。

所以,(不出意外的話):

  • 如果是 xxx-service 的 Swagger 配置,這里的 .pathMapping() 方法的值應該是 “/xxx-service”;
  • 如果是 yyy-service 的 Swagger 配置,這里的 .pathMapping() 方法的值應該是 “/yyy-service”;
  • 如果是 zzz-service 的 Swagger 配置,這里的 .pathMapping() 方法的值應該是 “/zzz-service”。

Gateway 的改動

改動一:新增依賴
<dependency>  <groupId>com.github.xiaoymin</groupId>  <artifactId>knife4j-spring-boot-starter</artifactId>  <version>${knife4j.version}</version>  <!-- 3.0.3 -->
</dependency>
改動二:新增配置類和處理類

提示:以下三個類你可以專門放在一個 swagger 包中進行統一管理。

@Component  
public class SwaggerHeaderFilter extends AbstractGatewayFilterFactory {  private static final String HEADER_NAME = "X-Forwarded-Prefix";  private static final String URI = "/v3/api-docs";  @Override  public GatewayFilter apply(Object config) {  return (exchange, chain) -> {  ServerHttpRequest request = exchange.getRequest();  String path = request.getURI().getPath();  if (!StringUtils.endsWithIgnoreCase(path,URI )) {  return chain.filter(exchange);  }  String basePath = path.substring(0, path.lastIndexOf(URI));  ServerHttpRequest newRequest = request.mutate().header(HEADER_NAME, basePath).build();  ServerWebExchange newExchange = exchange.mutate().request(newRequest).build();  return chain.filter(newExchange);  };  }  
}
@Primary  
@Configuration  
@RequiredArgsConstructor  
public class SwaggerResourceConfig implements SwaggerResourcesProvider {  private final RouteLocator routeLocator;  private final GatewayProperties gatewayProperties;  @Override  public List<SwaggerResource> get() {  List<SwaggerResource> resources = new ArrayList<>();  List<String> routes = new ArrayList<>();  routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));  // resources為所有路由都加載到文檔,如果需要部分顯示,在下方使用filter進行過濾即可  gatewayProperties.getRoutes().stream().filter(routeDefinition -> routes.contains(routeDefinition.getId())).forEach(route -> {  route.getPredicates().stream()  .filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName()))  .forEach(predicateDefinition -> resources.add(swaggerResource(route.getId(),  predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX + "0")  .replace("**", "v3/api-docs"))));  });  return resources;  }  private SwaggerResource swaggerResource(String name, String url) {  SwaggerResource swaggerResource = new SwaggerResource();  swaggerResource.setName(name);  swaggerResource.setLocation(url);  swaggerResource.setUrl(url);  swaggerResource.setSwaggerVersion("3.0");  return swaggerResource;  }  }
@RestController  
public class SwaggerHandler {  @Qualifier  private final SwaggerResourcesProvider swaggerResources;  public SwaggerHandler(SwaggerResourcesProvider swaggerResources) {  this.swaggerResources = swaggerResources;  }  @GetMapping("/swagger-resources")  public Mono<ResponseEntity<List<SwaggerResource>>> swaggerResources() {  return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK)));  }  }

以上三個新增代碼都不需要做任何改動。

改動三:改動配置文件

本來,我們的網關項目的配置文件中有個配置項:

spring:cloud:gateway:discovery:locator:enabled: true

這個配置項“幫”我們省略掉了大段的、啰嗦的配置簡化了配置文件的內容。

但是,出人意料的是:它對我們引入的 Swagger/Knife4j 無效!

所以,如果我們需要網關處引入 Swagger,用以聚合各個微服務的 Swagger,那么,我們需要把這個簡寫配置項還原成以前大段的、啰嗦的寫法…

例如:

spring:  cloud:  gateway:  routes:  - id: 部門微服務  uri: lb://department-servicepredicates:  - Path=/department-service/**filters:  - RewritePath=/department-service/(?<segment>.*), /${segment} - id: 員工微服務  uri: lb://employee-service  predicates:  - Path=/employee-service/**  filters:  - RewritePath=/employee-service/(?<segment>.*), /${segment}

上面的配置內容,就是以前被一個配置項簡化掉的、現在需要再還原回來的內容。它的意思是:

  • 當網關收到以 /department-service/ 開頭的請求,就“轉給” department-service,并且將請求 URI 前段的 /department-service/ 部分截去。

  • 當網關收到以 /employee-service/ 開頭的請求,就“轉給” employee-service,并且將請求 URI 前段的 /department-service/ 部分截去。

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

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

相關文章

一千題,No.0026(Ternary String)

描述 You are given a string s such that each its character is either 1, 2, or 3. You have to choose the shortest contiguous substring of s such that it contains each of these three characters at least once. A contiguous substring of string s is a string …

Python3 筆記:IDLE的幾個基本設置

1、設置字體&#xff1a; Options > Configure IDLE > Fonts 2、設置文字顏色&#xff08;設置高亮&#xff09;&#xff1a; Options > Configure IDLE > Highlights 3、設置背景顏色&#xff1a; Options > Configure IDLE > Highlights 4、設置窗口&a…

各位數字和-第13屆藍橋杯選拔賽Python真題精選

[導讀]&#xff1a;超平老師的Scratch藍橋杯真題解讀系列在推出之后&#xff0c;受到了廣大老師和家長的好評&#xff0c;非常感謝各位的認可和厚愛。作為回饋&#xff0c;超平老師計劃推出《Python藍橋杯真題解析100講》&#xff0c;這是解讀系列的第72講。 各位數字和&#…

MongoDB(介紹,安裝,操作,Springboot整合MonggoDB)

目錄 MongoDB 1 MongoDB介紹 MongoDB簡介 MongoDB的特點 MongoDB使用場景 小結 2 MongoDB安裝 安裝MongoDB 連接MongoDB MongoDB邏輯結構 MongoDB數據類型 小結 3 MongoDB操作 操作庫和集合 操作文檔-增刪改 操作文檔-查詢 MongoDB索引 小結 4 SpringBoot整合…

c# sqlite使用

安裝包 使用 const string strconn "Data Sourcedata.db"; using (SQLiteConnection conn new SQLiteConnection(strconn)) {conn.Open();var cmd conn.CreateCommand();cmd.CommandText "select 1";var obj cmd.ExecuteScalar();MessageBox.Show(ob…

ES 查詢踩坑-全字段匹配

需求&#xff1a;name字段需要全匹配查詢 name的映射 普通的must查詢 GET power_engin/_search {"from": 0,"size": 10,"query": {"bool": {"must": [{"term": {"name": {"value": "尼…

刷題之路徑總和Ⅲ(leetcode)

路徑總和Ⅲ 這題和和《為K的數組》思路一致&#xff0c;也是用前綴表。 代碼調試過&#xff0c;所以還加一部分用前序遍歷數組和中序遍歷數組構造二叉樹的代碼。 #include<vector> #include<unordered_map> #include<iostream> using namespace std; //Def…

python從入門到精通01

一、程序員計算器 number int(input("請輸入一個數字&#xff1a;")) print("二進制",bin(number)) print("八進制",oct(number)) print("十六進制",hex(number))二、給電影打分 score int(input("請給電影《肖申克的救贖》打…

計算機畢業設計Hadoop+Hive地震預測系統 地震數據分析可視化 地震爬蟲 大數據畢業設計 Spark 機器學習 深度學習 Flink 大數據

2024 屆本科畢業論文&#xff08;設計&#xff09; 基于Hadoop的地震預測的 分析與可視化研究 姓 名&#xff1a;____田偉情_________ 系 別&#xff1a;____信息技術學院___ 專 業&#xff1a;數據科學與大數據技術 學 號&#xff1a;__2011103094________ 指導…

【大數據面試題】33 Flink SQL做過哪些優化?

一步一個腳印&#xff0c;一天一道面試題 簡單寫幾個 Flink SQL 的優化 1.優化狀態管理 Flink 的狀態管理對整個程序的性能有較大影響。所以優化效果比較好。 設置空閑狀態自動清理&#xff08;TTL Time-to-Live&#xff09;數據量大時選擇 RocksDBStateBackend // 設置狀…

《圖解支付系統設計與實現》電子書_V20240525

相較于上次公開發布的V20240503版本&#xff0c;變更內容如下&#xff1a; 根據掘金網友zz67373&#xff08;李浩銘&#xff09;的勘誤建議&#xff0c;優化了部分描述。增加&#xff1a;金額處理規范&#xff0c;低代碼報文網關實現完整代碼&#xff0c;分布式流控等內容。擴…

Java虛擬機原理(下)-Dalvik vs ART-探秘Android虛擬機內在機制

Android系統作為移動端主流平臺&#xff0c;其高效的虛擬機無疑是其核心競爭力之一。今天&#xff0c;就讓我們一起剝開Dalvik和ART虛擬機的外衣&#xff0c;深入解析它們的工作原理和優缺點&#xff0c;幫助你全面把握Android系統的運行機制。 正文導覽 Dalvik和ART虛擬機的發…

Openstack all-in-one_ironic 部署測試

1. 基礎環境 apt update apt install git python3-dev libffi-dev gcc libssl-dev apt install python3-venv 2. 設置虛擬環境變量 root@controller01:~# python3 -m venv /deploy/venv root@controller01:~# source /deploy/venv/bin/activate (venv) root@controller01:~#…

Nginx - 安全基線配置與操作指南

文章目錄 概述中間件安全基線配置手冊1. 概述1.1 目的1.2 適用范圍 2. Nginx基線配置2.1 版本說明2.2 安裝目錄2.3 用戶創建2.4 二進制文件權限2.5 關閉服務器標記2.6 設置 timeout2.7 設置 NGINX 緩沖區2.8 日志配置2.9 日志切割2.10 限制訪問 IP2.11 限制僅允許域名訪問2.12 …

debugger(一):打斷點的實現以及案例分析

〇、前言 最近在學習 debugger 的實現原理&#xff0c;并按照博客實現&#xff0c;是一個很不錯的小項目&#xff0c;這是地址。由于 macOS 的問題&#xff0c;系統調用并不完全相同&#xff0c;因此實現了兩個版本分支&#xff0c;一個是 main 版本分支&#xff08;macOS M1 …

【一站式學會Kotlin】第八節:kotlin== 和 === 的差別和含義

作者介紹&#xff1a; 百度資深Android工程師T6&#xff0c;在百度任職7年半。 目前&#xff1a;成立趙小灰代碼工作室&#xff0c;歡迎大家找我交流Android、微信小程序、鴻蒙項目。 一&#xff1a;通俗易懂的人工智能教程&#xff1a;https://www.captainbed.cn/nefu/ 點一下…

Altium Designer 中鍵拖動,滾輪縮放,并修改縮放速度

我的版本是AD19&#xff0c;其他版本應該都一樣。 滾輪縮放 首先&#xff0c;要用滾輪縮放&#xff0c;先要調整一下AD 設置&#xff0c;打開Preferences&#xff0c;在Mouse Wheel Configuration 里&#xff0c;把Zoom Main Window 后面Ctrl 上的對勾取消掉&#xff0c;再把…

C++中的懸掛指針和野指針

懸掛指針&#xff08;dangling pointer&#xff09;和野指針&#xff08;wild pointer&#xff09;是兩種常見的指針錯誤&#xff0c;雖然它們都可能導致未定義行為&#xff0c;但它們產生的原因和表現有所不同。 1.懸掛指針&#xff08;Dangling Pointer&#xff09; 懸掛指…

2024 ISCC pwn wp

iscc 練武pwn 總結第一周chaosISCC_easyFlagshopping 第二周ISCC_easyISCC_Uheapheap 第三周miaoYour_programeazy_heap 總結 總體感覺iscc考察的題目都挺基礎的&#xff0c;在目前這種比賽的大環境下&#xff0c;仍然出這種&#xff0c;比較基礎的題目&#xff0c;實在是難得…

智馭未來:探究AIGC行業的戰略入局時機與前景展望

當前時點涉足人工智能生成內容&#xff08;AIGC&#xff09;行業&#xff0c;是一個策略性抉擇&#xff0c;基于對該行業現狀的深度剖析及對未來趨勢的前瞻性預判&#xff0c;其可行性與吸引力顯著。 行業發展階段分析&#xff1a; 技術迭代加速&#xff1a;近年來&#xff0c…