Spring Boot的微服務分散聚集模式教程與原始碼 - vinsguru
本教程演示分散聚集模式( Scatter Gather Pattern),它是分散式系統體系結構的企業整合模式之一。
讓我們考慮一個需要完成一組任務以完成業務工作流程的應用程式。如果這些任務彼此不依賴,那麼按順序執行它們就沒有意義。我們可以並行執行這些任務。
分散收集模式可幫助我們分發這些任務,以實現任務/訊息/事件的並行處理,然後最終將響應彙總為單個響應,如上所示。
案例說明
一個使用者預訂機票的機票預訂應用程式。該應用程式將資訊傳送給所有航空公司,找到他們的票價,然後進行回覆。
由於我們的應用程式依賴於第三方API,並且我們需要為使用者提供最佳的使用者體驗,因此我們將向所有航空公司釋出使用者請求,無論在特定的超時時間內做出回應,我們都會收集所有結果並向我們顯示前5名交易使用者。
主應用程式甚至不知道有多少航空公司正在監聽請求。即使某些航空公司的服務無法正常執行,也不會影響我們的飛行應用程式。
案例SpringBoot實現
我們的專案依賴於超快速的NATS訊息伺服器。因此,要新增此依賴項:
<dependency> <groupId>io.nats</groupId> <artifactId>jnats</artifactId> <version>2.6.8</version> </dependency> |
釋出聚集模式的實現服務類ScatterGatherService:
@Service public class ScatterGatherService { @Autowired private Connection nats; public Mono<FlightSearchResponse> broadcast(FlightSearchRequest flightSearchRequest){ // create inbox String inbox = nats.createInbox(); Subscription subscription = nats.subscribe(inbox); return Flux.generate((SynchronousSink<FlightSchedule[]> fluxSink) -> receiveSchedules(fluxSink, subscription)) .flatMap(Flux::fromArray) .bufferTimeout(5, Duration.ofSeconds(1)) .map(list -> { list.sort(Comparator.comparing(FlightSchedule::getPrice)); return list; }) .map(list -> FlightSearchResponse.of(flightSearchRequest, list)) .next() .doFirst(() -> nats.publish("flight.search", inbox, ObjectUtil.toBytes(flightSearchRequest))) .doOnNext(i -> subscription.unsubscribe()); } private void receiveSchedules(SynchronousSink<FlightSchedule[]> synchronousSink, Subscription subscription){ try{ Message message = subscription.nextMessage(Duration.ofSeconds(1)); ObjectUtil.toObject(message.getData(), FlightSchedule[].class).ifPresent(synchronousSink::next); }catch (Exception e){ synchronousSink.error(e); } } } |
演示
傳送一個請求:http://localhost:8080/flight/Houston/LasVegas,收到如下所示的回覆:
{ "searchRequest":{ "from":"Houston", "to":"LasVegas" }, "schedules":[ { "date":"2021-01-02", "price":72, "airline":"DELTA" }, { "date":"2020-12-28", "price":87, "airline":"UNITED_AIRLINE" }, { "date":"2021-01-02", "price":109, "airline":"FRONTIER" }, { "date":"2021-01-08", "price":229, "airline":"UNITED_AIRLINE" }, { "date":"2021-01-02", "price":408, "airline":"DELTA" } ] } |
成功證明在我們的微服務架構中使用分散收集模式可以有效地並行處理任務並最終彙總結果。
原始碼可在此處獲得。
更詳細點選標題見原文。
相關文章
- 使用Spring Boot + Kafka實現Saga分散式事務模式的原始碼 - vinsguruSpring BootKafka分散式模式原始碼
- Spring WebFlux安全配置教程和原始碼 - vinsguruSpringWebUX原始碼
- 使用Spring Boot和Kafka Streams實現基於SAGA模式的分散式事務原始碼教程 - PiotrSpring BootKafka模式分散式原始碼
- 使用Spring Boot實現Redis事務 | VinsguruSpring BootRedis
- Spring Boot的Clean架構教程與原始碼 - BaeldungSpring Boot架構原始碼
- 結合GraalVM與Spring Native的Spring Boot原始碼教程 | foojayLVMSpring Boot原始碼
- Spring Cloud Spring Boot mybatis分散式微服務雲架構CloudSpring BootMyBatis分散式微服務架構
- Spring Boot實現DDD的貨運Cargo微服務案例原始碼Spring BootCargo微服務原始碼
- spring cloud springboot mybatis 分散式 微服務 架構原始碼CloudSpring BootMyBatis分散式微服務架構原始碼
- 使用Kafka Streams和Spring Boot微服務中的分散式事務 - PiotrKafkaSpring Boot微服務分散式
- Spring Boot中使用gRPC與Protobuf驗證教程原始碼Spring BootRPC原始碼
- spring cloud + spring boot + springmvc+mybatis分散式微服務雲架構CloudSpring BootSpringMVCMyBatis分散式微服務架構
- 使用SpringBoot實現微服務超時重試模式 - VinsguruSpring Boot微服務模式
- 構建Spring Boot應用的微服務服務監控與告警Spring Boot微服務
- Spring Cloud Spring Boot mybatis分散式微服務雲架構-hystrix引數詳解CloudSpring BootMyBatis分散式微服務架構
- Spring Boot系列(四):Spring Boot原始碼解析Spring Boot原始碼
- Spring Boot中使用斷路器模式實現彈性微服務Spring Boot模式微服務
- spring cloud分散式微服務:Spring Cloud ConfigSpringCloud分散式微服務
- 分散式與微服務分散式微服務
- Spring Boot中實現規則引擎原始碼教程Spring Boot原始碼
- 分散式微服務Spring Cloud+Spring Boot電商商城技術及功能總結分散式微服務CloudSpring Boot
- 使用Spring Boot排程WebSocket推送的教程和原始碼 - BaeldungSpring BootWeb原始碼
- Spring Boot微服務是一種安全的SOASpring Boot微服務
- 利用Spring Boot實現微服務的配置中心Spring Boot微服務
- 使用SpringBoot+PostgreSQL物化檢視實現微服務設計模式 - vinsguruSpring BootSQL微服務設計模式
- 比較微服務中的分散式事務模式微服務分散式模式
- 微服務的分散式事務模式比較 | RedHat微服務分散式模式Redhat
- JAVA spring cloud boot b2b2c電子商務分散式微服務JavaSpringCloudboot分散式微服務
- Spring Boot系列(三):Spring Boot整合Mybatis原始碼解析Spring BootMyBatis原始碼
- Spring Boot + JPA DataTable原始碼Spring Boot原始碼
- spring cloud + spring boot + springmvc+mybatis微服務雲架構CloudSpring BootSpringMVCMyBatis微服務架構
- 使用Spring Boot實現分散式事務Spring Boot分散式
- Spring Boot支援Java 16和新的Java記錄原始碼教程 | foojaySpring BootJava原始碼
- Seata 分散式事務框架 TCC 模式原始碼分析分散式框架模式原始碼
- Seata分散式事務TA模式原始碼解讀分散式模式原始碼
- Spring Boot事務發件箱模式Spring Boot模式
- spring cloud微服務分散式雲架構(一)-spring cloud 服務註冊與發現SpringCloud微服務分散式架構
- 微服務開發的意義 微服務與分散式的關係微服務分散式