0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用Spring構(gòu)建REST服務(wù)(五)

「Spring」認(rèn)證安全架構(gòu) ? 來源:「Spring」認(rèn)證安全架構(gòu) ? 作者:「Spring」認(rèn)證安全 ? 2022-07-28 16:03 ? 次閱讀

書接上文???

在 REST API 中構(gòu)建鏈接

到目前為止,您已經(jīng)使用基本鏈接構(gòu)建了一個可進(jìn)化的 API。為了發(fā)展您的 API 并更好地為您的客戶服務(wù),您需要接受超媒體作為應(yīng)用程序狀態(tài)引擎的概念。

這意味著什么?在本節(jié)中,您將詳細(xì)探討它。

業(yè)務(wù)邏輯不可避免地會建立涉及流程的規(guī)則。此類系統(tǒng)的風(fēng)險在于我們經(jīng)常將此類服務(wù)器端邏輯帶入客戶端并建立強(qiáng)耦合。REST 就是要打破這種連接并最小化這種耦合。

為了展示如何在不觸發(fā)客戶端中斷更改的情況下應(yīng)對狀態(tài)變化,想象一下添加一個履行訂單的系統(tǒng)。

第一步,定義一條Order記錄:

鏈接
/src/main/java/payroll/Order.java

package payroll;import java.util.Objects;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.Table;@Entity@Table(name = "CUSTOMER_ORDER")class Order {  private @Id @GeneratedValue Long id;  private String description;  private Status status;  Order() {}  Order(String description, Status status) {    this.description = description;    this.status = status;  }  public Long getId() {    return this.id;  }  public String getDescription() {    return this.description;  }  public Status getStatus() {    return this.status;  }  public void setId(Long id) {    this.id = id;  }  public void setDescription(String description) {    this.description = description;  }  public void setStatus(Status status) {    this.status = status;  }  @Override  public boolean equals(Object o) {    if (this == o)      return true;    if (!(o instanceof Order))      return false;    Order order = (Order) o;    return Objects.equals(this.id, order.id) && Objects.equals(this.description, order.description)        && this.status == order.status;  }  @Override  public int hashCode() {    return Objects.hash(this.id, this.description, this.status);  }  @Override  public String toString() {    return "Order{" + "id=" + this.id + ", description='" + this.description + '\'' + ", status=" + this.status + '}';  }}復(fù)制
  • 該類需要 JPA@Table注釋將表的名稱更改為,CUSTOMER_ORDER因?yàn)?span style="color:rgb(0,0,153);">ORDER它不是表的有效名稱。
  • 它包括一個description字段以及一個status字段。

從客戶提交訂單到完成或取消訂單時,訂單必須經(jīng)歷一系列狀態(tài)轉(zhuǎn)換。這可以捕獲為 Java enum

鏈接
/src/main/java/payroll/Status.java

package payroll;enum Status {  IN_PROGRESS, //  COMPLETED, //  CANCELLED}復(fù)制

enum捕獲了一個Order可以占據(jù)的各種狀態(tài)。對于本教程,讓我們保持簡單。

要支持與數(shù)據(jù)庫中的訂單交互,必須定義相應(yīng)的 Spring Data 存儲庫:

Spring Data JPA 的JpaRepository基本接口

interface OrderRepository extends JpaRepository {}復(fù)制,>

有了這個,您現(xiàn)在可以定義一個基本的OrderController

鏈接
/src/main/java/payroll/OrderController.java

@RestControllerclass OrderController {  private final OrderRepository orderRepository;  private final OrderModelAssembler assembler;  OrderController(OrderRepository orderRepository, OrderModelAssembler assembler) {    this.orderRepository = orderRepository;    this.assembler = assembler;  }  @GetMapping("/orders")  CollectionModel> all() {    List> orders = orderRepository.findAll().stream() //        .map(assembler::toModel) //        .collect(Collectors.toList());    return CollectionModel.of(orders, //        linkTo(methodOn(OrderController.class).all()).withSelfRel());  }  @GetMapping("/orders/{id}")  EntityModel one(@PathVariable Long id) {    Order order = orderRepository.findById(id) //        .orElseThrow(() -> new OrderNotFoundException(id));    return assembler.toModel(order);  }  @PostMapping("/orders")  ResponseEntity> newOrder(@RequestBody Order order) {    order.setStatus(Status.IN_PROGRESS);    Order newOrder = orderRepository.save(order);    return ResponseEntity //        .created(linkTo(methodOn(OrderController.class).one(newOrder.getId())).toUri()) //        .body(assembler.toModel(newOrder));  }}復(fù)制
  • 它包含與您迄今為止構(gòu)建的控制器相同的 REST 控制器設(shè)置。
  • 它同時注入OrderRepositorya 和 a (not yet built) OrderModelAssembler
  • 前兩個 Spring MVC 路由處理聚合根以及單個項(xiàng)目Order資源請求。
  • 第三條 Spring MVC 路由通過在IN_PROGRESS狀態(tài)中啟動它們來處理創(chuàng)建新訂單。
  • 所有控制器方法都返回 Spring HATEOAS 的RepresentationModel子類之一以正確呈現(xiàn)超媒體(或圍繞此類類型的包裝器)。

在構(gòu)建 之前OrderModelAssembler,讓我們討論需要發(fā)生的事情。您正在對 、 和 之間的狀態(tài)流Status.IN_PROGRESS進(jìn)行Status.COMPLETED建模Status.CANCELLED。向客戶端提供此類數(shù)據(jù)時,一件很自然的事情是讓客戶端根據(jù)此有效負(fù)載決定它可以做什么。

但那是錯誤的。

當(dāng)您在此流程中引入新狀態(tài)時會發(fā)生什么?UI 上各種按鈕的放置可能是錯誤的。

如果您更改了每個州的名稱,可能是在編碼國際支持并顯示每個州的區(qū)域設(shè)置特定文本時會怎樣?這很可能會破壞所有客戶。

輸入HATEOAS超媒體作為應(yīng)用程序狀態(tài)引擎。與其讓客戶端解析有效負(fù)載,不如為它們提供鏈接以發(fā)出有效操作的信號。將基于狀態(tài)的操作與數(shù)據(jù)負(fù)載分離。換句話說,當(dāng)CANCELCOMPLETE是有效操作時,將它們動態(tài)添加到鏈接列表中。客戶端只需要在鏈接存在時向用戶顯示相應(yīng)的按鈕。

這使客戶端不必知道此類操作何時有效,從而降低了服務(wù)器及其客戶端在狀態(tài)轉(zhuǎn)換邏輯上不同步的風(fēng)險。

已經(jīng)接受了 Spring HATEOAS
RepresentationModelAssembler組件的概念,將這樣的邏輯放入其中OrderModelAssembler將是捕獲此業(yè)務(wù)規(guī)則的完美位置:

鏈接
/src/main/java/payroll/OrderModelAssembler.java

package payroll;import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*;import org.springframework.hateoas.EntityModel;import org.springframework.hateoas.server.RepresentationModelAssembler;import org.springframework.stereotype.Component;@Componentclass OrderModelAssembler implements RepresentationModelAssembler> {  @Override  public EntityModel toModel(Order order) {    // Unconditional links to single-item resource and aggregate root    EntityModel orderModel = EntityModel.of(order,        linkTo(methodOn(OrderController.class).one(order.getId())).withSelfRel(),        linkTo(methodOn(OrderController.class).all()).withRel("orders"));    // Conditional links based on state of the order    if (order.getStatus() == Status.IN_PROGRESS) {      orderModel.add(linkTo(methodOn(OrderController.class).cancel(order.getId())).withRel("cancel"));      orderModel.add(linkTo(methodOn(OrderController.class).complete(order.getId())).withRel("complete"));    }    return orderModel;  }}復(fù)制,>

此資源組裝器始終包含指向單項(xiàng)資源的自身鏈接以及返回聚合根的鏈接。但它也包括兩個條件鏈接OrderController.cancel(id)以及OrderController.complete(id)(尚未定義)。這些鏈接僅在訂單狀態(tài)為 時顯示Status.IN_PROGRESS。

如果客戶可以采用 HAL 和讀取鏈接的能力,而不是簡單地讀取普通的舊 JSON 數(shù)據(jù),他們可以交換對訂單系統(tǒng)領(lǐng)域知識的需求。這自然減少了客戶端和服務(wù)器之間的耦合。它打開了調(diào)整訂單履行流程的大門,而不會在流程中破壞客戶。

要完成訂單履行,請將以下內(nèi)容添加到OrderController操作中cancel

在 OrderController 中創(chuàng)建“取消”操作

@DeleteMapping("/orders/{id}/cancel")ResponseEntity cancel(@PathVariable Long id) {  Order order = orderRepository.findById(id) //      .orElseThrow(() -> new OrderNotFoundException(id));  if (order.getStatus() == Status.IN_PROGRESS) {    order.setStatus(Status.CANCELLED);    return ResponseEntity.ok(assembler.toModel(orderRepository.save(order)));  }  return ResponseEntity //      .status(HttpStatus.METHOD_NOT_ALLOWED) //      .header(HttpHeaders.CONTENT_TYPE, MediaTypes.HTTP_PROBLEM_DETAILS_JSON_VALUE) //      .body(Problem.create() //          .withTitle("Method not allowed") //          .withDetail("You can't cancel an order that is in the " + order.getStatus() + " status"));}復(fù)制

Order它在允許取消之前檢查狀態(tài)。如果它不是一個有效的狀態(tài),它會返回一個RFC-7807 Problem,一個支持超媒體的錯誤容器。如果轉(zhuǎn)換確實(shí)有效,則將 轉(zhuǎn)換OrderCANCELLED。

并將其添加到OrderController訂單完成中:

在 OrderController 中創(chuàng)建“完整”操作

@PutMapping("/orders/{id}/complete")ResponseEntity complete(@PathVariable Long id) {  Order order = orderRepository.findById(id) //      .orElseThrow(() -> new OrderNotFoundException(id));  if (order.getStatus() == Status.IN_PROGRESS) {    order.setStatus(Status.COMPLETED);    return ResponseEntity.ok(assembler.toModel(orderRepository.save(order)));  }  return ResponseEntity //      .status(HttpStatus.METHOD_NOT_ALLOWED) //      .header(HttpHeaders.CONTENT_TYPE, MediaTypes.HTTP_PROBLEM_DETAILS_JSON_VALUE) //      .body(Problem.create() //          .withTitle("Method not allowed") //          .withDetail("You can't complete an order that is in the " + order.getStatus() + " status"));}復(fù)制

這實(shí)現(xiàn)了類似的邏輯以防止Order狀態(tài)完成,除非處于正確的狀態(tài)。

讓我們更新LoadDatabase以預(yù)加載一些Orders 以及Employee它之前加載的 s。

更新數(shù)據(jù)庫預(yù)加載器

package payroll;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.boot.CommandLineRunner;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationclass LoadDatabase {  private static final Logger log = LoggerFactory.getLogger(LoadDatabase.class);  @Bean  CommandLineRunner initDatabase(EmployeeRepository employeeRepository, OrderRepository orderRepository) {    return args -> {      employeeRepository.save(new Employee("Bilbo", "Baggins", "burglar"));      employeeRepository.save(new Employee("Frodo", "Baggins", "thief"));      employeeRepository.findAll().forEach(employee -> log.info("Preloaded " + employee));            orderRepository.save(new Order("MacBook Pro", Status.COMPLETED));      orderRepository.save(new Order("iPhone", Status.IN_PROGRESS));      orderRepository.findAll().forEach(order -> {        log.info("Preloaded " + order);      });          };  }}復(fù)制

現(xiàn)在你可以測試了!

要使用新生成的訂單服務(wù),只需執(zhí)行一些操作:

$ curl -v http://localhost:8080/orders{  “_嵌入”:{    “訂單”: [      {        “身份證”:3,        “描述”:“MacBook Pro”,        “狀態(tài)”:“已完成”,        “_鏈接”:{          “自己”: {            "href": "http://localhost:8080/orders/3"          },          “訂單”: {            "href": "http://localhost:8080/orders"          }        }      },      {        “身份證”:4,        “描述”:“iPhone”,        “狀態(tài)”:“IN_PROGRESS”,        “_鏈接”:{          “自己”: {            "href": "http://localhost:8080/orders/4"          },          “訂單”: {            "href": "http://localhost:8080/orders"          },          “取消”: {            "href": "http://localhost:8080/orders/4/cancel"          },          “完全的”: {            "href": "http://localhost:8080/orders/4/complete"          }        }      }    ]  },  “_鏈接”:{    “自己”: {      "href": "http://localhost:8080/orders"    }  }}

此 HAL 文檔會根據(jù)其當(dāng)前狀態(tài)立即顯示每個訂單的不同鏈接。

  • 第一個訂單,即COMPLETED只有導(dǎo)航鏈接。未顯示狀態(tài)轉(zhuǎn)換鏈接。
  • 第二個訂單,即 IN_PROGRESS還具有取消鏈接和完整鏈接。

嘗試取消訂單:

$ curl -v -X 刪除 http://localhost:8080/orders/4/cancel> 刪除 /orders/4/cancel HTTP/1.1> 主機(jī):本地主機(jī):8080> 用戶代理:curl/7.54.0> 接受:*/*>< HTTP/1.1 200< 內(nèi)容類型:application/hal+json;charset=UTF-8< 傳輸編碼:分塊< 日期:2018 年 8 月 27 日星期一 15:02:10 GMT<{  “身份證”:4,  “描述”:“iPhone”,  “狀態(tài)”:“取消”,  “_鏈接”:{    “自己”: {      "href": "http://localhost:8080/orders/4"    },    “訂單”: {      "href": "http://localhost:8080/orders"    }  }}

此響應(yīng)顯示一個HTTP 200狀態(tài)代碼,表明它是成功的。響應(yīng) HAL 文檔顯示該訂單處于新狀態(tài) ( CANCELLED)。改變狀態(tài)的鏈接消失了。

如果再次嘗試相同的操作……

$ curl -v -X 刪除 http://localhost:8080/orders/4/cancel* TCP_NODELAY 設(shè)置* 連接到 localhost (::1) 端口 8080 (#0)> 刪除 /orders/4/cancel HTTP/1.1> 主機(jī):本地主機(jī):8080> 用戶代理:curl/7.54.0> 接受:*/*>< HTTP/1.1 405< 內(nèi)容類型:應(yīng)用程序/問題+json< 傳輸編碼:分塊< 日期:2018 年 8 月 27 日星期一 15:03:24 GMT<{  "title": "方法不允許",  "detail": "您不能取消處于 CANCELED 狀態(tài)的訂單"}

…?您會看到HTTP 405 Method Not Allowed響應(yīng)。DELETE已成為無效操作。Problem響應(yīng)對象清楚地表明您不能“取消”已經(jīng)處于“CANCELLED”狀態(tài)的訂單。

此外,嘗試完成相同的訂單也會失?。?/span>

$ curl -v -X PUT localhost:8080/orders/4/complete* TCP_NODELAY 設(shè)置* 連接到 localhost (::1) 端口 8080 (#0)> PUT /orders/4/完成 HTTP/1.1> 主機(jī):本地主機(jī):8080> 用戶代理:curl/7.54.0> 接受:*/*>< HTTP/1.1 405< 內(nèi)容類型:應(yīng)用程序/問題+json< 傳輸編碼:分塊< 日期:2018 年 8 月 27 日星期一 15:05:40 GMT<{  "title": "方法不允許",  "detail": "您無法完成處于 CANCELED 狀態(tài)的訂單"}

有了這一切,您的訂單履行服務(wù)就能夠有條件地顯示可用的操作。它還可以防止無效操作。

通過利用超媒體和鏈接協(xié)議,客戶端可以構(gòu)建得更堅(jiān)固,并且不太可能僅僅因?yàn)閿?shù)據(jù)的變化而崩潰。Spring HATEOAS 可以輕松構(gòu)建您需要為客戶提供服務(wù)的超媒體。

概括

在本教程中,您使用了各種策略來構(gòu)建 REST API。事實(shí)證明,REST 不僅僅是漂亮的 URI 和返回 JSON 而不是 XML。

相反,以下策略有助于降低您的服務(wù)破壞您可能控制或可能無法控制的現(xiàn)有客戶的可能性:

  • 不要刪除舊字段。相反,支持他們。
  • 使用基于 rel 的鏈接,這樣客戶端就不必?fù)?dān)心 URI 進(jìn)行硬編碼。
  • 盡可能長時間地保留舊鏈接。即使您必須更改 URI,也要保留 rels,以便舊客戶端可以使用新功能。
  • 當(dāng)各種狀態(tài)驅(qū)動操作可用時,使用鏈接而不是有效負(fù)載數(shù)據(jù)來指示客戶端。


RepresentationModelAssembler為每種資源類型構(gòu)建實(shí)現(xiàn)并在所有控制器中使用這些組件似乎需要一些努力。但是這種額外的服務(wù)器端設(shè)置(感謝 Spring HATEOAS 使之變得容易)可以確保您控制的客戶端(更重要的是,您不控制的客戶端)可以隨著您的 API 隨著發(fā)展而輕松升級。

我們關(guān)于如何使用 Spring 構(gòu)建 RESTful 服務(wù)員的教程到此結(jié)束。本教程的每個部分都在單個 github 存儲庫中作為單獨(dú)的子項(xiàng)目進(jìn)行管理:

  • nonrest — 沒有自媒體的簡單 Spring MVC 應(yīng)用程序
  • rest — Spring MVC + Spring HATEOAS 應(yīng)用程序,每個資源的 HAL 表示
  • 進(jìn)化- REST 應(yīng)用程序,其中一個字段已進(jìn)化但保留舊數(shù)據(jù)以實(shí)現(xiàn)向后兼容性
  • 鏈接- REST 應(yīng)用程序,其中條件鏈接用于向客戶端發(fā)出有效狀態(tài)更改信號

要查看使用 Spring HATEOAS 的更多示例,請參閱Spring中國教育管理中心

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    335

    瀏覽量

    14259
  • REST
    +關(guān)注

    關(guān)注

    0

    文章

    32

    瀏覽量

    9387
收藏 人收藏

    評論

    相關(guān)推薦

    如何用ACM簡化你的Spring Cloud微服務(wù)環(huán)境配置管理

    摘要: 本文我們就如何使用阿里云ACM這樣的配置管理產(chǎn)品在Spring Cloud中替代Spring Cloud Config幫助簡化環(huán)境配置管理做一個簡單的示例,幫助你理解基于ACM來簡化微服務(wù)
    發(fā)表于 02-02 14:18

    使用阿里云ACM簡化你的Spring Cloud微服務(wù)環(huán)境配置管理

    摘要: 本文我們就如何使用阿里云ACM這樣的配置管理產(chǎn)品在Spring Cloud中替代Spring Cloud Config幫助簡化環(huán)境配置管理做一個簡單的示例,幫助你理解基于ACM來簡化微服務(wù)
    發(fā)表于 07-04 17:16

    Spring Boot嵌入式Web容器原理是什么

    Spring Boot嵌入式Web容器原理Spring Boot的目標(biāo)是構(gòu)建“非常容易創(chuàng)建、獨(dú)立、產(chǎn)品級別的基于Spring的應(yīng)用”。這些應(yīng)用是“立即可運(yùn)行的”。在這個過程中,完全沒有
    發(fā)表于 12-16 07:57

    REST端口支持構(gòu)建動態(tài)REST請求來使用RESTful API網(wǎng)絡(luò)

    REST端口支持構(gòu)建動態(tài)REST請求來使用RESTful API網(wǎng)絡(luò)服務(wù)。 概覽 REST端口暴露了一個簡單的接口來為
    的頭像 發(fā)表于 01-17 09:11 ?4670次閱讀

    REST API是什么,如何使用REST端口

    /服務(wù)器) 模型對資源進(jìn)行增刪改查操作。而其中客戶端和服務(wù)器是分離的,而知行之橋中的REST端口就是作為REST API中的客戶端,對服務(wù)
    的頭像 發(fā)表于 02-17 18:00 ?9010次閱讀
    <b class='flag-5'>REST</b> API是什么,如何使用<b class='flag-5'>REST</b>端口

    Spring REST Docs RESTful服務(wù)文檔

    ./oschina_soft/spring-restdocs.zip
    發(fā)表于 05-24 09:31 ?1次下載
    <b class='flag-5'>Spring</b> <b class='flag-5'>REST</b> Docs RESTful<b class='flag-5'>服務(wù)</b>文檔

    Spring認(rèn)證是什么?

    ,例如:配置、組件掃描、AOP、數(shù)據(jù)訪問和事務(wù)、REST、安全、自動配置、執(zhí)行器、 Spring boot測試等。
    的頭像 發(fā)表于 07-04 10:19 ?1207次閱讀
    <b class='flag-5'>Spring</b>認(rèn)證是什么?

    如何獲得Spring認(rèn)證?學(xué)習(xí)JAVA如何獲得Spring Professional認(rèn)證?

    、組件掃描、AOP、數(shù)據(jù)訪問和事務(wù)、REST、安全、自動配置、執(zhí)行器、 Spring boot測試等。 1)參加Spring中國教育管理中心授權(quán)合作伙伴Spring培訓(xùn)課程 2)報名考
    的頭像 發(fā)表于 07-04 10:20 ?1634次閱讀
    如何獲得<b class='flag-5'>Spring</b>認(rèn)證?學(xué)習(xí)JAVA如何獲得<b class='flag-5'>Spring</b> Professional認(rèn)證?

    spring認(rèn)證證書有用嗎?

    :配置、組件掃描、AOP、數(shù)據(jù)訪問和事務(wù)、REST、安全、自動配置、執(zhí)行器、 Spring boot測試等。 目前Spring認(rèn)證的版本:Spring v5.0(VMware EDU-
    的頭像 發(fā)表于 07-12 15:59 ?2119次閱讀

    如何使用Spring構(gòu)建REST服務(wù)(一)

    關(guān)于 REST 如何適應(yīng)微服務(wù)世界還有一個更大的討論,但是——對于本教程——讓我們看看構(gòu)建 RESTful 服務(wù)。
    的頭像 發(fā)表于 07-28 15:59 ?831次閱讀

    如何使用Spring構(gòu)建REST服務(wù)(二)

    要使用 Web 層次包裝您的存儲庫,您必須使用 Spring MVC。多虧了 Spring Boot,代碼基礎(chǔ)設(shè)施很少。相反,我們可以專注于行動。
    的頭像 發(fā)表于 07-28 16:00 ?659次閱讀

    如何使用Spring構(gòu)建REST服務(wù)(三)

    到目前為止,您擁有一個基于 Web 服務(wù)來處理涉及員工數(shù)據(jù)的核心操作。但這還不足以讓事情變得“RESTful”。
    的頭像 發(fā)表于 07-28 16:01 ?717次閱讀

    如何使用Spring構(gòu)建REST服務(wù)(四)

    通過一個額外的庫和幾行額外的代碼,您已將超媒體添加到您的應(yīng)用程序中。但這并不是使您的服務(wù)成為 RESTful 所需的唯一事情。REST 的一個重要方面是它既不是技術(shù)堆棧也不是單一標(biāo)準(zhǔn)。
    的頭像 發(fā)表于 07-28 16:02 ?634次閱讀

    REST的6大指導(dǎo)原則

    systems )架構(gòu)風(fēng)格。由Roy Fielding 提出。 REST API 也稱RESTful API, 其遵循REST架構(gòu)規(guī)范的應(yīng)用編程接口, 支持與RESTful WEB服務(wù)進(jìn)行交互。簡單來講就是
    的頭像 發(fā)表于 10-09 14:27 ?1279次閱讀

    Spring Cloud :打造可擴(kuò)展的微服務(wù)網(wǎng)關(guān)

    Spring Cloud Gateway是一個基于Spring Framework 5和Project Reactor的反應(yīng)式編程模型的微服務(wù)網(wǎng)關(guān)。它提供了豐富的功能,包括動態(tài)路由、請求限流、集成安全性等,使其成為
    的頭像 發(fā)表于 10-22 10:03 ?428次閱讀
    <b class='flag-5'>Spring</b> Cloud :打造可擴(kuò)展的微<b class='flag-5'>服務(wù)</b>網(wǎng)關(guān)