AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

利用Nacos實現(xiàn)Seata事務(wù)模式(XA與AT)的快速配置與靈活切換

來源: 責編: 時間:2024-02-01 12:51:49 229觀看
導讀前言接之前一篇《Seata如何實現(xiàn)兩階段提交(2PC)分布式事務(wù)》,實際開發(fā)中seata基本不會用file存儲和管理服務(wù)節(jié)點信息,下面小編將結(jié)合nacos來整合seata,實現(xiàn)XA和AT模式的靈活轉(zhuǎn)換。實現(xiàn)相關(guān)安裝包可以自行前往官網(wǎng)下載:nacos

前言

接之前一篇《Seata如何實現(xiàn)兩階段提交(2PC)分布式事務(wù)》,實際開發(fā)中seata基本不會用file存儲和管理服務(wù)節(jié)點信息,下面小編將結(jié)合nacos來整合seata,實現(xiàn)XA和AT模式的靈活轉(zhuǎn)換。YbU28資訊網(wǎng)——每日最新資訊28at.com

實現(xiàn)

相關(guān)安裝包可以自行前往官網(wǎng)下載:YbU28資訊網(wǎng)——每日最新資訊28at.com

  • nacos:https://github.com/alibaba/nacos/releases 版本2.1.0
  • seata:https://github.com/seata/seata/releases  版本1.4.2

部署及配置seata

registry.conf:YbU28資訊網(wǎng)——每日最新資訊28at.com

registry {  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa  type = "nacos"  nacos {    application = "seata-tc-server"    serverAddr = "127.0.0.1:8848"    group = "DEFAULT_GROUP"    namespace = ""    cluster = "BJ"    username = "nacos"    password = "nacos"  }}config {  # file、nacos 、apollo、zk、consul、etcd3  type = "nacos"  nacos {    serverAddr = "127.0.0.1:8848"    namespace = ""    group = "SEATA_GROUP"    username = "nacos"    password = "nacos"    dataId = "seataServer.properties"  }}

seataServer.properties:YbU28資訊網(wǎng)——每日最新資訊28at.com

特別注意,為了讓TC服務(wù)的集群可以共享配置,同樣選擇nacos作為統(tǒng)一配置中心。YbU28資訊網(wǎng)——每日最新資訊28at.com

# 數(shù)據(jù)存儲方式,db代表數(shù)據(jù)庫store.mode=dbstore.db.datasource=druidstore.db.dbType=mysqlstore.db.driverClassName=com.mysql.cj.jdbc.Driverstore.db.url=jdbc:mysql://localhost:3306/seata?useUnicode=true&rewriteBatchedStatements=truestore.db.user=rootstore.db.password=rootstore.db.minConn=5store.db.maxConn=30store.db.globalTable=global_tablestore.db.branchTable=branch_tablestore.db.queryLimit=100store.db.lockTable=lock_tablestore.db.maxWait=5000# 事務(wù)、日志等配置server.recovery.committingRetryPeriod=1000server.recovery.asynCommittingRetryPeriod=1000server.recovery.rollbackingRetryPeriod=1000server.recovery.timeoutRetryPeriod=1000server.maxCommitRetryTimeout=-1server.maxRollbackRetryTimeout=-1server.rollbackRetryTimeoutUnlockEnable=falseserver.undo.logSaveDays=7server.undo.logDeletePeriod=86400000# 客戶端與服務(wù)端傳輸方式transport.serialization=seatatransport.compressor=none# 關(guān)閉metrics功能,提高性能metrics.enabled=falsemetrics.registryType=compactmetrics.exporterList=prometheusmetrics.exporterPrometheusPort=9898

sql腳本:YbU28資訊網(wǎng)——每日最新資訊28at.com

CREATE TABLE `branch_table`  (  `branch_id` bigint(20) NOT NULL,  `xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,  `transaction_id` bigint(20) NULL DEFAULT NULL,  `resource_group_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `resource_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `branch_type` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `status` tinyint(4) NULL DEFAULT NULL,  `client_id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `gmt_create` datetime(6) NULL DEFAULT NULL,  `gmt_modified` datetime(6) NULL DEFAULT NULL,  PRIMARY KEY (`branch_id`) USING BTREE,  INDEX `idx_xid`(`xid`) USING BTREE) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;CREATE TABLE `global_table`  (  `xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,  `transaction_id` bigint(20) NULL DEFAULT NULL,  `status` tinyint(4) NOT NULL,  `application_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `transaction_service_group` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `transaction_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `timeout` int(11) NULL DEFAULT NULL,  `begin_time` bigint(20) NULL DEFAULT NULL,  `application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `gmt_create` datetime NULL DEFAULT NULL,  `gmt_modified` datetime NULL DEFAULT NULL,  PRIMARY KEY (`xid`) USING BTREE,  INDEX `idx_gmt_modified_status`(`gmt_modified`, `status`) USING BTREE,  INDEX `idx_transaction_id`(`transaction_id`) USING BTREE) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

以上是XA模式所需腳本,AT模式追加以下腳本:YbU28資訊網(wǎng)——每日最新資訊28at.com

CREATE TABLE `lock_table`  (  `row_key` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,  `xid` varchar(96) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `transaction_id` bigint(20) NULL DEFAULT NULL,  `branch_id` bigint(20) NOT NULL,  `resource_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `table_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `pk` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `gmt_create` datetime NULL DEFAULT NULL,  `gmt_modified` datetime NULL DEFAULT NULL,  PRIMARY KEY (`row_key`) USING BTREE,  INDEX `idx_branch_id`(`branch_id`) USING BTREE) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;CREATE TABLE `undo_log`  (  `branch_id` bigint(20) NOT NULL COMMENT 'branch transaction id',  `xid` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'global transaction id',  `context` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'undo_log context,such as serialization',  `rollback_info` longblob NOT NULL COMMENT 'rollback info',  `log_status` int(11) NOT NULL COMMENT '0:normal status,1:defense status',  `log_created` datetime(6) NOT NULL COMMENT 'create datetime',  `log_modified` datetime(6) NOT NULL COMMENT 'modify datetime',  UNIQUE INDEX `ux_undo_log`(`xid`, `branch_id`) USING BTREE) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = 'AT transaction mode undo table' ROW_FORMAT = Compact;

其中l(wèi)ock_table導入到TC服務(wù)關(guān)聯(lián)的數(shù)據(jù)庫,undo_log表導入到微服務(wù)關(guān)聯(lián)的數(shù)據(jù)庫。YbU28資訊網(wǎng)——每日最新資訊28at.com

啟動seata:YbU28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片YbU28資訊網(wǎng)——每日最新資訊28at.com

XA模式

XA 規(guī)范 是 X/Open 組織定義的分布式事務(wù)處理(DTP,Distributed Transaction Processing)標準,XA 規(guī)范描述了全局的TM與局部的RM之間的接口,幾乎所有主流的數(shù)據(jù)庫都對 XA 規(guī)范提供了支持。YbU28資訊網(wǎng)——每日最新資訊28at.com

兩階段提交

XA是規(guī)范,目前主流數(shù)據(jù)庫都實現(xiàn)了這種規(guī)范,實現(xiàn)的原理都是基于兩階段提交。YbU28資訊網(wǎng)——每日最新資訊28at.com

  • 正常情況:

圖片圖片YbU28資訊網(wǎng)——每日最新資訊28at.com

  • 異常情況:

圖片圖片YbU28資訊網(wǎng)——每日最新資訊28at.com

一階段(準備階段):YbU28資訊網(wǎng)——每日最新資訊28at.com

  1. 協(xié)調(diào)發(fā)起:

事務(wù)協(xié)調(diào)者向所有參與此次分布式事務(wù)的本地事務(wù)參與者發(fā)出指令,要求它們開始執(zhí)行本地事務(wù)操作。YbU28資訊網(wǎng)——每日最新資訊28at.com

  1. 本地執(zhí)行與狀態(tài)反饋:
  • 各個本地事務(wù)參與者接收到請求后,在各自的數(shù)據(jù)庫上啟動并執(zhí)行本地事務(wù)。
  • 在完成本地事務(wù)操作后,各參與者并不立即提交事務(wù),而是將各自的事務(wù)執(zhí)行狀態(tài)(成功或失敗)報告給事務(wù)協(xié)調(diào)者,并在此期間繼續(xù)保持對相關(guān)數(shù)據(jù)資源的鎖定以防止并發(fā)沖突。

二階段(提交/回滾階段):YbU28資訊網(wǎng)——每日最新資訊28at.com

  1. 全局提交決定:
  • 如果事務(wù)協(xié)調(diào)者收到的所有參與者的反饋均表示本地事務(wù)已成功執(zhí)行,則向所有參與者發(fā)送“全局提交”指令。
  1. 全局提交執(zhí)行:

接收到“全局提交”指令的參與者將在本地正式提交其事務(wù),釋放之前持有的數(shù)據(jù)庫鎖,并確保事務(wù)操作永久記錄于數(shù)據(jù)庫。YbU28資訊網(wǎng)——每日最新資訊28at.com

  1. 全局回滾決定與執(zhí)行:
  • 若事務(wù)協(xié)調(diào)者接收到任何一個參與者反饋表明本地事務(wù)執(zhí)行失敗,或者出現(xiàn)其他異常情況,則會做出全局回滾的決定。
  • 協(xié)調(diào)者隨即通知所有參與者進行“全局回滾”,每個參與者在收到此指令后,必須在其本地環(huán)境中撤銷已經(jīng)執(zhí)行但尚未提交的事務(wù)操作,釋放鎖定資源,并恢復至事務(wù)開始前的數(shù)據(jù)狀態(tài)。

Seata的XA模型

圖片圖片YbU28資訊網(wǎng)——每日最新資訊28at.com

在分布式事務(wù)處理中,RM和TC按照兩階段提交協(xié)議執(zhí)行各自的工作:YbU28資訊網(wǎng)——每日最新資訊28at.com

RM在一階段的工作:YbU28資訊網(wǎng)——每日最新資訊28at.com

  1. 分支事務(wù)注冊:
  • RM將參與的分支事務(wù)信息注冊到TC,為后續(xù)協(xié)調(diào)全局事務(wù)做好準備。
  1. 本地事務(wù)操作:

RM在數(shù)據(jù)庫或其他資源上執(zhí)行與分支事務(wù)相關(guān)的SQL操作,但并不提交這些變更,而是保持數(shù)據(jù)鎖定狀態(tài)以防止數(shù)據(jù)不一致。YbU28資訊網(wǎng)——每日最新資訊28at.com

  1. 狀態(tài)匯報:

完成本地操作后,RM向TC報告其分支事務(wù)的執(zhí)行狀態(tài),包括成功或失敗的信息。YbU28資訊網(wǎng)——每日最新資訊28at.com

TC在二階段的工作:YbU28資訊網(wǎng)——每日最新資訊28at.com

  • 狀態(tài)檢測與決策制定:

若所有分支事務(wù)均執(zhí)行成功,TC通知所有RM提交各自的事務(wù)。YbU28資訊網(wǎng)——每日最新資訊28at.com

若存在任何一個分支事務(wù)執(zhí)行失敗,TC則指示所有RM回滾各自的事務(wù),以保證分布式事務(wù)的一致性。YbU28資訊網(wǎng)——每日最新資訊28at.com

RM在二階段的工作:YbU28資訊網(wǎng)——每日最新資訊28at.com

  • 接收指令并執(zhí)行:

如果是提交指令,則正式提交一階段執(zhí)行的SQL操作,并釋放之前持有的鎖。YbU28資訊網(wǎng)——每日最新資訊28at.com

如果是回滾指令,則撤銷一階段未提交的SQL操作,恢復至事務(wù)開始前的數(shù)據(jù)狀態(tài)。YbU28資訊網(wǎng)——每日最新資訊28at.com

代碼樣例

依賴引入:YbU28資訊網(wǎng)——每日最新資訊28at.com

<dependencies>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-web</artifactId>    </dependency>    <dependency>        <groupId>com.alibaba.cloud</groupId>        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>        <version>2.2.3.RELEASE</version>    </dependency>    <dependency>        <groupId>org.springframework.cloud</groupId>        <artifactId>spring-cloud-starter-openfeign</artifactId>        <version>2.2.3.RELEASE</version>    </dependency>    <dependency>        <groupId>com.alibaba.cloud</groupId>        <artifactId>spring-cloud-starter-alibaba-seata</artifactId>        <version>2.2.3.RELEASE</version>        <exclusions>            <!--版本較低,1.3.0,因此排除-->            <exclusion>                <artifactId>seata-spring-boot-starter</artifactId>                <groupId>io.seata</groupId>            </exclusion>        </exclusions>    </dependency>    <dependency>        <groupId>io.seata</groupId>        <artifactId>seata-spring-boot-starter</artifactId>        <version>1.4.2</version>    </dependency>    <dependency>        <groupId>com.baomidou</groupId>        <artifactId>mybatis-plus-boot-starter</artifactId>        <version>3.4.1</version>    </dependency>    <!--mysql-->    <dependency>        <groupId>mysql</groupId>        <artifactId>mysql-connector-java</artifactId>        <version>5.1.47</version>    </dependency>    <dependency>        <groupId>org.projectlombok</groupId>        <artifactId>lombok</artifactId>    </dependency></dependencies>

配置引入:YbU28資訊網(wǎng)——每日最新資訊28at.com

server:  port: 8011spring:  application:    name: bank-11  datasource:    url: jdbc:mysql://localhost:3306/bank1?characterEncoding=utf8&useSSL=false    driver-class-name: com.mysql.jdbc.Driver    username: root    password: root  cloud:    nacos:      server-addr: 127.0.0.1:8848seata:  registry:    type: nacos    nacos:      server-addr: 127.0.0.1:8848      namespace: ""      group: DEFAULT_GROUP      application: seata-tc-server # tc服務(wù)在nacos中的服務(wù)名稱      username: nacos      password: nacos  tx-service-group: order_tx_group #自定義事務(wù)組名稱需要與seata-server中的對應  data-source-proxy-mode: XA  service:    vgroup-mapping:      order_tx_group: BJ # TC 集群(必須與seata-server保持一致)

bank22服務(wù)參考bank11配置即可,bank11調(diào)用bank22服務(wù)YbU28資訊網(wǎng)——每日最新資訊28at.com

@GlobalTransactional@Overridepublic void updateAccountBalance(String accountNo, Double amount) {    log.info("******** Bank1 Service Begin ... xid: {}" , RootContext.getXID());    //張三扣減金額    baseMapper.updateAccountBalance(accountNo,amount);    //向李四轉(zhuǎn)賬    String transfer = bank2Client.transfer(amount);    if("fallback".equals(transfer)){        //調(diào)用李四微服務(wù)異常        throw new RuntimeException("調(diào)用李四微服務(wù)異常");    }    //人為制造錯誤    if(amount > 100){        throw new RuntimeException("bank1 make exception amount > 100");    }}

XA模式的優(yōu)點:YbU28資訊網(wǎng)——每日最新資訊28at.com

  • 事務(wù)的強一致性,滿足ACID原則。
  • 常用數(shù)據(jù)庫都支持,實現(xiàn)簡單,并且沒有代碼侵入

XA模式的缺點:YbU28資訊網(wǎng)——每日最新資訊28at.com

  • 因為一階段需要鎖定數(shù)據(jù)庫資源,等待二階段結(jié)束才釋放,性能較差
  • 依賴關(guān)系型數(shù)據(jù)庫實現(xiàn)事務(wù)

AT模式

AT模式同樣是分階段提交的事務(wù)模型,不過卻彌補了XA模型中資源鎖定周期過長的缺陷。YbU28資訊網(wǎng)——每日最新資訊28at.com

Seata的AT模型

階段一(準備階段)RM的工作:YbU28資訊網(wǎng)——每日最新資訊28at.com

  1. 注冊分支事務(wù):

當全局事務(wù)開始后,RM會為該事務(wù)涉及的本地事務(wù)創(chuàng)建并注冊一個分支事務(wù),將其納入到全局事務(wù)的管理范圍。YbU28資訊網(wǎng)——每日最新資訊28at.com

  1. 記錄undo-log(數(shù)據(jù)快照):

在執(zhí)行業(yè)務(wù)SQL之前,RM會對當前事務(wù)要修改的數(shù)據(jù)進行前鏡像的記錄,即生成undo-log。這樣在事務(wù)回滾時可以根據(jù)undo-log恢復到事務(wù)開始前的狀態(tài)。YbU28資訊網(wǎng)——每日最新資訊28at.com

  1. 執(zhí)行業(yè)務(wù)sql并提交:

RM按照業(yè)務(wù)需求執(zhí)行相應的SQL操作,并在本地將事務(wù)置為“預提交”狀態(tài),但不真正完成提交。YbU28資訊網(wǎng)——每日最新資訊28at.com

  1. 報告事務(wù)狀態(tài):

將分支事務(wù)的執(zhí)行結(jié)果(成功或失敗)匯報給協(xié)調(diào)者,等待協(xié)調(diào)者的下一步指令。YbU28資訊網(wǎng)——每日最新資訊28at.com

階段二(提交階段/回滾階段)RM的工作:YbU28資訊網(wǎng)——每日最新資訊28at.com

  1. 提交階段:

如果協(xié)調(diào)者收到所有RM的反饋均為“準備成功”,則指示RM正式提交事務(wù)。此時,RM刪除對應的undo-log,因為事務(wù)已成功提交,不再需要回滾信息。YbU28資訊網(wǎng)——每日最新資訊28at.com

  1. 回滾階段:

若協(xié)調(diào)者決定全局事務(wù)需要回滾,RM會根據(jù)先前記錄的undo-log恢復數(shù)據(jù)到事務(wù)開始前的狀態(tài),撤銷在事務(wù)過程中對數(shù)據(jù)的所有更改,確保數(shù)據(jù)一致性。YbU28資訊網(wǎng)——每日最新資訊28at.com

代碼樣例

修改配置:YbU28資訊網(wǎng)——每日最新資訊28at.com

seata:  data-source-proxy-mode: AT # 默認就是AT

AT模式的優(yōu)點:YbU28資訊網(wǎng)——每日最新資訊28at.com

  • 一階段完成直接提交事務(wù),釋放數(shù)據(jù)庫資源,性能比較好
  • 利用全局鎖實現(xiàn)讀寫隔離
  • 沒有代碼侵入,框架自動完成回滾和提交

AT模式的缺點:YbU28資訊網(wǎng)——每日最新資訊28at.com

  • 兩階段之間屬于軟狀態(tài),屬于最終一致
  • 框架的快照功能會影響性能,但比XA模式要好很多

本文鏈接:http://www.tebozhan.com/showinfo-26-70466-0.html利用Nacos實現(xiàn)Seata事務(wù)模式(XA與AT)的快速配置與靈活切換

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 在 Create React App 中使用 TypeScript,你學會了嗎?

下一篇: Spring Boot項目集成RabbitMQ實戰(zhàn)以及坑點講解

標簽:
  • 熱門焦點
  • 盧偉冰長文解析K60至尊版 對Redmi有著里程碑式的意義

    在今天的Redmi后性能時代戰(zhàn)略發(fā)布會結(jié)束之后,Redmi總經(jīng)理盧偉冰又帶來了一篇長文,詳解了為什么 Redmi 要開啟后性能時代?為什么選擇和 MediaTek、Pixelworks 深度合作?以及后性
  • 7月安卓手機好評榜:三星S23Ultra好評率第一

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數(shù)據(jù)來源安兔兔評測,收集時間2023年7月1日至7月31日,僅限國內(nèi)市場。第一名:三星Galaxy S23 Ultra好評率:95.71%在即將迎來新
  • 5月iOS設(shè)備性能榜:M1 M2依舊是榜單前五

    和上個月一樣,沒有新品發(fā)布的iOS設(shè)備性能榜的上榜設(shè)備并沒有什么更替,僅僅只有跑分變化而產(chǎn)生的排名變動,剛剛開始的蘋果WWDC2023,推出的產(chǎn)品也依舊是新款Mac Pro、新款Mac Stu
  • 線程通訊的三種方法!通俗易懂

    線程通信是指多個線程之間通過某種機制進行協(xié)調(diào)和交互,例如,線程等待和通知機制就是線程通訊的主要手段之一。 在 Java 中,線程等待和通知的實現(xiàn)手段有以下幾種方式:Object 類下
  • 每天一道面試題-CPU偽共享

    前言:了不起:又到了每天一到面試題的時候了!學弟,最近學習的怎么樣啊 了不起學弟:最近學習的還不錯,每天都在學習,每天都在進步! 了不起:那你最近學習的什么呢? 了不起學弟:最近在學習C
  • 大廠卷向扁平化

    來源:新熵作者丨南枝 編輯丨月見大廠職級不香了。俗話說,兵無常勢,水無常形,互聯(lián)網(wǎng)企業(yè)調(diào)整職級體系并不稀奇。7月13日,淘寶天貓集團啟動了近年來最大的人力制度改革,目前已形成一
  • 阿里大調(diào)整

    來源:產(chǎn)品劉有媒體報道稱,近期淘寶天貓集團啟動了近年來最大的人力制度改革,涉及員工績效、層級體系等多個核心事項,目前已形成一個初步的&ldquo;征求意見版&rdquo;:1、取消P序列
  • 華為Mate 60系列用上可變靈動島:正式版體驗將會更出色

    這段時間以來,關(guān)于華為新旗艦的爆料日漸密集。據(jù)此前多方爆料,今年華為將開始恢復一年雙旗艦戰(zhàn)略,除上半年推出的P60系列外,往年下半年的Mate系列也將
  • 2022爆款:ROG魔霸6 冰川散熱系統(tǒng)持續(xù)護航

    喜逢開學季,各大商家開始推出自己的新產(chǎn)品,進行打折促銷活動。對于忠實的端游愛好者來說,能夠擁有一款夢寐以求的筆記本電腦是一件十分開心的事。但是現(xiàn)在的
Top