您好,登錄后才能下訂單哦!
這篇“WebFlux服務編排怎么使用”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“WebFlux服務編排怎么使用”文章吧。
WebFlux 服務編排是指使用 WebFlux 框架來編排多個異步服務的執行順序和數據流動,從而構建出一個完整的、基于事件驅動的響應式應用程序。
WebFlux服務編排的優勢如下:
高性能:WebFlux基于響應式編程模型,可以使用少量的線程處理大量的請求,從而提高系統的并發能力和吞吐量。
異步處理:WebFlux可以異步處理請求和響應,避免線程的阻塞和等待,提高系統的并發能力和性能。
高可靠性:WebFlux基于事件驅動的編程模型,可以更好地處理錯誤和異常,從而提高系統的可靠性和穩定性。
簡潔清晰:WebFlux的代碼簡潔清晰,可以使用函數式編程風格來編寫業務邏輯,提高代碼的可讀性和可維護性。
可擴展性:WebFlux可以輕松地集成其他的響應式組件和服務,例如Reactive Streams、Spring Cloud、RSocket等,從而提高系統的可擴展性和靈活性。
綜上所述,WebFlux服務編排可以幫助我們構建高性能、高可靠性、可擴展性強的響應式應用程序,提高系統的并發能力和性能,從而更好地滿足現代應用程序的需求。
一個示例
public Mono> getOrderDetails(String orderId) { return Mono.fromCallable(() -> { // 查詢訂單基本信息 return "order info"; }) .flatMap(orderInfo -> { // 查詢訂單商品信息 return Mono.fromCallable(() -> { return "order item info"; }); }) .flatMap(orderItemInfo -> { // 查詢訂單配送信息 return Mono.fromCallable(() -> { return "order delivery info"; }); }) .flatMap(orderDeliveryInfo -> { // 查詢訂單支付信息 return Mono.fromCallable(() -> { return "order payment info"; }); }); }
為什么使用 fromCallable,就是上面說的,WebFlux 編排的是異步服務,而不是同步服務。
但是實際線上不要使用 fromCallable,會導致創建很多個線程,高并發場景下會導致資源競爭激烈,從而服務性能急劇下降。
long start = System.currentTimeMillis(); Mono<String> invoke1 = Invoker1.invoke1(); Mono<String> result = invoke1.flatMap(p -> Invoker2.invoke2()) .map(s -> { return s.toString(); }); // result: invoker2, 耗時:3592(串行) System.out.println("result: " + result.block() + ", 耗時:" + (System.currentTimeMillis() - start));
long start = System.currentTimeMillis(); Mono<String> invoke1 = Invoker1.invoke1(); Mono<String> result = invoke1.flatMap(p -> { return Invoker2.invoke2().map(s -> { return p + s; }); }); // result: invoker1invoker2, 耗時:3554(串行) System.out.println("result: " + result.block() + ", 耗時:" + (System.currentTimeMillis() - start));
zip() 方法可以一次組裝任意個Mono,適用于有多個Mono的情況
long start = System.currentTimeMillis(); Mono<String> invoke1 = Invoker1.invoke1(); Mono<String> invoker2 = Invoker2.invoke2(); Mono<String> result = Mono.zip(invoke1, invoker2) .map(s-> { String t1 = s.getT1(); String t2 = s.getT2(); return String.format("invoke1:%s, invoke2: %s", t1, t2); }); // invoker1invoker2耗時:2650 (并行) System.out.println("result: " + result.block() + ",耗時:" + (System.currentTimeMillis() - start));
zipWith() 每次組裝一個Mono對象,使用于組裝Mono個數比較少的情況。
long start = System.currentTimeMillis(); Mono<String> invoke1 = Invoker1.invoke1(); Mono<String> invoker2 = Invoker2.invoke2(); Mono<String> result = invoke1.zipWith(invoker2) .map(s -> { return String.format("invoke1:%s, invoke2: %s", s.getT1(), s.getT2()); }); // invoker1invoker2耗時:2469 (并行) System.out.println(result.block() + ",耗時:" + (System.currentTimeMillis() - start));
這里的 invoker 就是第三方系統調用。
保證 invoker 是在獨立的線程中執行,這樣 invoker 不會影響業務處理。
public class Invoker1 { public static Mono<String> invoke1() { return Mono. fromSupplier(() -> { try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } return "invoker1"; }) .subscribeOn(Schedulers.parallel()) .doOnError(e -> { System.out.println("error invoker1"); }); } }
public class Invoker2 { public static Mono<String> invoke2() { return Mono.fromSupplier(() -> { try { Thread.sleep(2000); } catch (InterruptedException e) { throw new RuntimeException(e); } return "invoker2"; }) .subscribeOn(Schedulers.parallel()) .doOnError(e -> { System.out.println("error invoker2"); }); } }
以上就是關于“WebFlux服務編排怎么使用”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。