最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

WebFlux 服務(wù)編排使用優(yōu)勢(shì)詳解

 更新時(shí)間:2023年05月05日 09:16:23   作者:六七十三  
這篇文章主要為大家介紹了WebFlux 服務(wù)編排使用優(yōu)勢(shì)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

WebFlux服務(wù)編排

WebFlux 服務(wù)編排是指使用 WebFlux 框架來(lái)編排多個(gè)異步服務(wù)的執(zhí)行順序和數(shù)據(jù)流動(dòng),從而構(gòu)建出一個(gè)完整的、基于事件驅(qū)動(dòng)的響應(yīng)式應(yīng)用程序。

WebFlux服務(wù)編排的優(yōu)勢(shì)如下:

  • 高性能:WebFlux基于響應(yīng)式編程模型,可以使用少量的線程處理大量的請(qǐng)求,從而提高系統(tǒng)的并發(fā)能力和吞吐量。

  • 異步處理:WebFlux可以異步處理請(qǐng)求和響應(yīng),避免線程的阻塞和等待,提高系統(tǒng)的并發(fā)能力和性能。

  • 高可靠性:WebFlux基于事件驅(qū)動(dòng)的編程模型,可以更好地處理錯(cuò)誤和異常,從而提高系統(tǒng)的可靠性和穩(wěn)定性。

  • 簡(jiǎn)潔清晰:WebFlux的代碼簡(jiǎn)潔清晰,可以使用函數(shù)式編程風(fēng)格來(lái)編寫(xiě)業(yè)務(wù)邏輯,提高代碼的可讀性和可維護(hù)性。

  • 可擴(kuò)展性:WebFlux可以輕松地集成其他的響應(yīng)式組件和服務(wù),例如Reactive Streams、Spring Cloud、RSocket等,從而提高系統(tǒng)的可擴(kuò)展性和靈活性。

綜上所述,WebFlux服務(wù)編排可以幫助我們構(gòu)建高性能、高可靠性、可擴(kuò)展性強(qiáng)的響應(yīng)式應(yīng)用程序,提高系統(tǒng)的并發(fā)能力和性能,從而更好地滿(mǎn)足現(xiàn)代應(yīng)用程序的需求。

一個(gè)示例

public Mono> getOrderDetails(String orderId) {
    return Mono.fromCallable(() -> {
        // 查詢(xún)訂單基本信息
        return "order info";
    })
    .flatMap(orderInfo -> {
        // 查詢(xún)訂單商品信息
        return Mono.fromCallable(() -> {
            return "order item info";
        });
    })
    .flatMap(orderItemInfo -> {
        // 查詢(xún)訂單配送信息
        return Mono.fromCallable(() -> {
            return "order delivery info";
        });
    })
    .flatMap(orderDeliveryInfo -> {
        // 查詢(xún)訂單支付信息
        return Mono.fromCallable(() -> {
            return "order payment info";
        });
    });
}

為什么使用 fromCallable,就是上面說(shuō)的,WebFlux 編排的是異步服務(wù),而不是同步服務(wù)。

但是實(shí)際線上不要使用 fromCallable,會(huì)導(dǎo)致創(chuàng)建很多個(gè)線程,高并發(fā)場(chǎng)景下會(huì)導(dǎo)致資源競(jìng)爭(zhēng)激烈,從而服務(wù)性能急劇下降。

1 串行

1.1 不需要 invoker1 的結(jié)果

long start = System.currentTimeMillis();
Mono<String> invoke1 = Invoker1.invoke1();
Mono<String> result = invoke1.flatMap(p -> Invoker2.invoke2())
      .map(s -> {
         return s.toString();
      });
// result: invoker2, 耗時(shí):3592(串行)
System.out.println("result: " + result.block() + ", 耗時(shí):" + (System.currentTimeMillis() - start));

1.2 需要返回 invoker1 的結(jié)果

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, 耗時(shí):3554(串行)
System.out.println("result: " + result.block() + ", 耗時(shí):" + (System.currentTimeMillis() - start));

2 并行

2.1 zip 方法

zip() 方法可以一次組裝任意個(gè)Mono,適用于有多個(gè)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耗時(shí):2650 (并行)
System.out.println("result: " + result.block() + ",耗時(shí):" + (System.currentTimeMillis() - start));

2.2 zipWith 方法

zipWith() 每次組裝一個(gè)Mono對(duì)象,使用于組裝Mono個(gè)數(shù)比較少的情況。

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耗時(shí):2469 (并行)
System.out.println(result.block() + ",耗時(shí):" + (System.currentTimeMillis() - start));

3 前提

這里的 invoker 就是第三方系統(tǒng)調(diào)用。

保證 invoker 是在獨(dú)立的線程中執(zhí)行,這樣 invoker 不會(huì)影響業(yè)務(wù)處理。

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 服務(wù)編排使用優(yōu)勢(shì)詳解的詳細(xì)內(nèi)容,更多關(guān)于WebFlux 服務(wù)編排優(yōu)勢(shì)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java操作Zookeeper原理及過(guò)程詳解

    Java操作Zookeeper原理及過(guò)程詳解

    這篇文章主要介紹了Java操作Zookeeper原理及過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Spring Bean基本管理實(shí)例詳解

    Spring Bean基本管理實(shí)例詳解

    這篇文章主要介紹了Spring Bean基本管理,以實(shí)例形式較為詳細(xì)的分析了Spring Bean的相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • Java中equals()方法重寫(xiě)實(shí)現(xiàn)代碼

    Java中equals()方法重寫(xiě)實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java中equals()方法重寫(xiě)實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 詳解JAVA里面獲取map的key和value的方法

    詳解JAVA里面獲取map的key和value的方法

    這篇文章主要介紹了詳解JAVA里面獲取map的key和value的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 玩轉(zhuǎn)spring boot 結(jié)合AngularJs和JDBC(4)

    玩轉(zhuǎn)spring boot 結(jié)合AngularJs和JDBC(4)

    玩轉(zhuǎn)spring boot,這篇文章主要介紹了結(jié)合AngularJs和JDBC,玩轉(zhuǎn)spring boot,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • SpringBoot中application.yml基本配置解讀

    SpringBoot中application.yml基本配置解讀

    文章主要介紹了Spring Boot項(xiàng)目中`application.properties`和`application.yml`配置文件的使用方法和區(qū)別,包括優(yōu)先級(jí)、配置文件所在目錄、端口服務(wù)配置、數(shù)據(jù)庫(kù)配置、多profile配置以及靜態(tài)資源路徑的指定
    2024-12-12
  • Java編程異常處理最佳實(shí)踐【推薦】

    Java編程異常處理最佳實(shí)踐【推薦】

    這篇文章主要介紹了Java編程異常處理最佳實(shí)踐【推薦】,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • java實(shí)現(xiàn)簡(jiǎn)易連連看小游戲

    java實(shí)現(xiàn)簡(jiǎn)易連連看小游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)易連連看小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Java線程間通訊的幾種方法小結(jié)

    Java線程間通訊的幾種方法小結(jié)

    線程通信可以用于控制并發(fā)線程的數(shù)量,本文主要介紹了Java線程間通訊的幾種方法小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • 解析Java Class 文件過(guò)程

    解析Java Class 文件過(guò)程

    class文件全名稱(chēng)為Java class文件,主要在平臺(tái)無(wú)關(guān)性和網(wǎng)絡(luò)移動(dòng)性方面使Java更適合網(wǎng)絡(luò)。它在平臺(tái)無(wú)關(guān)性方面的任務(wù)是:為Java程序提供獨(dú)立于底層主機(jī)平臺(tái)的二進(jìn)制形式的服務(wù)。下面我們來(lái)詳細(xì)解讀下它吧
    2019-05-05

最新評(píng)論

沅江市| 谷城县| 玉树县| 华容县| 丽江市| 云阳县| 保德县| 林西县| 北安市| 赞皇县| 咸阳市| 上高县| 富川| 卢龙县| 聂拉木县| 开远市| 惠州市| 新竹市| 昂仁县| 天台县| 崇州市| 嘉峪关市| 渑池县| 岢岚县| 商水县| 青神县| 永清县| 武乡县| 怀柔区| 肇州县| 南陵县| 双牌县| 阿瓦提县| 西乌珠穆沁旗| 东宁县| 晋城| 河津市| 漾濞| 宝兴县| 龙江县| 三原县|