GTS來(lái)了蔚润!阿里微服務(wù)架構(gòu)下的分布式事務(wù)解決方案

導(dǎo)讀:分布式事務(wù)已經(jīng)成為微服務(wù)落地最大的阻礙,也是非常具有挑戰(zhàn)性的一個(gè)技術(shù)難題尺栖。 為此抽碌,今天我們邀請(qǐng)阿里高級(jí)技術(shù)專家于皋,和大家深入探討微服務(wù)架構(gòu)下决瞳,分布式事務(wù)的各種解決方案货徙,并重點(diǎn)為大家解讀阿里巴巴提出的分布式事務(wù)解決方案----GTS(Global Transaction Service)。

1 微服務(wù)的發(fā)展

微服務(wù)倡導(dǎo)將復(fù)雜的單體應(yīng)用拆分為若干個(gè)功能簡(jiǎn)單皮胡、松耦合的服務(wù)痴颊,這樣可以降低開(kāi)發(fā)難度、增強(qiáng)擴(kuò)展性屡贺、便于敏捷開(kāi)發(fā)蠢棱。當(dāng)前被越來(lái)越多的開(kāi)發(fā)者推崇,很多互聯(lián)網(wǎng)行業(yè)巨頭甩栈、開(kāi)源社區(qū)等都開(kāi)始了微服務(wù)的討論和實(shí)踐泻仙。Hailo有160個(gè)不同服務(wù)構(gòu)成,NetFlix有大約600個(gè)服務(wù)量没。國(guó)內(nèi)方面玉转,阿里巴巴、騰訊殴蹄、360究抓、京東、58同城等很多互聯(lián)網(wǎng)公司都進(jìn)行了微服務(wù)化實(shí)踐袭灯。當(dāng)前微服務(wù)的開(kāi)發(fā)框架也非常多刺下,比較著名的有Dubbo、SpringCloud稽荧、thrift?橘茉、grpc等。

2 微服務(wù)落地存在的問(wèn)題

雖然微服務(wù)現(xiàn)在如火如荼姨丈,但對(duì)其實(shí)踐其實(shí)仍處于探索階段畅卓。很多中小型互聯(lián)網(wǎng)公司,鑒于經(jīng)驗(yàn)构挤、技術(shù)實(shí)力等問(wèn)題髓介,微服務(wù)落地比較困難。如著名架構(gòu)師Chris Richardson所言筋现,目前存在的主要困難有如下幾方面:

1)單體應(yīng)用拆分為分布式系統(tǒng)后唐础,進(jìn)程間的通訊機(jī)制和故障處理措施變的更加復(fù)雜。

2)系統(tǒng)微服務(wù)化后矾飞,一個(gè)看似簡(jiǎn)單的功能一膨,內(nèi)部可能需要調(diào)用多個(gè)服務(wù)并操作多個(gè)數(shù)據(jù)庫(kù)實(shí)現(xiàn),服務(wù)調(diào)用的分布式事務(wù)問(wèn)題變的非常突出洒沦。

3)微服務(wù)數(shù)量眾多豹绪,其測(cè)試、部署申眼、監(jiān)控等都變的更加困難瞒津。

隨著RPC框架的成熟蝉衣,第一個(gè)問(wèn)題已經(jīng)逐漸得到解決。例如dubbo可以支持多種通訊協(xié)議巷蚪,springcloud可以非常好的支持restful調(diào)用病毡。對(duì)于第三個(gè)問(wèn)題,隨著docker屁柏、devops技術(shù)的發(fā)展以及各公有云paas平臺(tái)自動(dòng)化運(yùn)維工具的推出啦膜,微服務(wù)的測(cè)試、部署與運(yùn)維會(huì)變得越來(lái)越容易淌喻。

而對(duì)于第二個(gè)問(wèn)題僧家,現(xiàn)在還沒(méi)有通用方案很好的解決微服務(wù)產(chǎn)生的事務(wù)問(wèn)題。分布式事務(wù)已經(jīng)成為微服務(wù)落地最大的阻礙裸删,也是最具挑戰(zhàn)性的一個(gè)技術(shù)難題八拱。 為此,本文將深入和大家探討微服務(wù)架構(gòu)下烁落,分布式事務(wù)的各種解決方案乘粒,并重點(diǎn)為大家解讀阿里巴巴提出的分布式事務(wù)解決方案----GTS。該方案中提到的GTS是全新一代解決微服務(wù)問(wèn)題的分布式事務(wù)互聯(lián)網(wǎng)中間件伤塌。

3 傳統(tǒng)分布式事務(wù)解決方案

3.1 基于XA協(xié)議的兩階段提交方案

交易中間件與數(shù)據(jù)庫(kù)通過(guò) XA 接口規(guī)范灯萍,使用兩階段提交來(lái)完成一個(gè)全局事務(wù), XA 規(guī)范的基礎(chǔ)是兩階段提交協(xié)議每聪。 第一階段是表決階段旦棉,所有參與者都將本事務(wù)能否成功的信息反饋發(fā)給協(xié)調(diào)者;第二階段是執(zhí)行階段药薯,協(xié)調(diào)者根據(jù)所有參與者的反饋绑洛,通知所有參與者,步調(diào)一致地在所有分支上提交或者回滾童本。

兩階段提交方案應(yīng)用非常廣泛真屯,幾乎所有商業(yè)OLTP數(shù)據(jù)庫(kù)都支持XA協(xié)議。但是兩階段提交方案鎖定資源時(shí)間長(zhǎng)穷娱,對(duì)性能影響很大绑蔫,基本不適合解決微服務(wù)事務(wù)問(wèn)題。

3.2 TCC方案

TCC方案在電商泵额、金融領(lǐng)域落地較多配深。TCC方案其實(shí)是兩階段提交的一種改進(jìn)。其將整個(gè)業(yè)務(wù)邏輯的每個(gè)分支顯式的分成了Try嫁盲、Confirm篓叶、Cancel三個(gè)操作。Try部分完成業(yè)務(wù)的準(zhǔn)備工作,confirm部分完成業(yè)務(wù)的提交缸托,cancel部分完成事務(wù)的回滾左敌。基本原理如下圖所示嗦董。?

事務(wù)開(kāi)始時(shí)母谎,業(yè)務(wù)應(yīng)用會(huì)向事務(wù)協(xié)調(diào)器注冊(cè)啟動(dòng)事務(wù)。之后業(yè)務(wù)應(yīng)用會(huì)調(diào)用所有服務(wù)的try接口京革,完成一階段準(zhǔn)備。之后事務(wù)協(xié)調(diào)器會(huì)根據(jù)try接口返回情況幸斥,決定調(diào)用confirm接口或者cancel接口匹摇。如果接口調(diào)用失敗,會(huì)進(jìn)行重試甲葬。

TCC方案讓應(yīng)用自己定義數(shù)據(jù)庫(kù)操作的粒度廊勃,使得降低鎖沖突、提高吞吐量成為可能经窖。 當(dāng)然TCC方案也有不足之處坡垫,集中表現(xiàn)在以下兩個(gè)方面:

對(duì)應(yīng)用的侵入性強(qiáng)。業(yè)務(wù)邏輯的每個(gè)分支都需要實(shí)現(xiàn)try画侣、confirm冰悠、cancel三個(gè)操作,應(yīng)用侵入性較強(qiáng)配乱,改造成本高溉卓。

實(shí)現(xiàn)難度較大。需要按照網(wǎng)絡(luò)狀態(tài)搬泥、系統(tǒng)故障等不同的失敗原因?qū)崿F(xiàn)不同的回滾策略桑寨。為了滿足一致性的要求,confirm和cancel接口必須實(shí)現(xiàn)冪等忿檩。

上述原因?qū)е耇CC方案大多被研發(fā)實(shí)力較強(qiáng)尉尾、有迫切需求的大公司所采用妓肢。微服務(wù)倡導(dǎo)服務(wù)的輕量化叼旋、易部署舔亭,而TCC方案中很多事務(wù)的處理邏輯需要應(yīng)用自己編碼實(shí)現(xiàn)轻庆,復(fù)雜且開(kāi)發(fā)量大工闺。

3.3 基于消息的最終一致性方案

消息一致性方案是通過(guò)消息中間件保證上么翰、下游應(yīng)用數(shù)據(jù)操作的一致性董瞻∧缶常基本思路是將本地操作和發(fā)送消息放在一個(gè)事務(wù)中孽尽,保證本地操作和消息發(fā)送要么兩者都成功或者都失敗窖壕。下游應(yīng)用向消息系統(tǒng)訂閱該消息,收到消息后執(zhí)行相應(yīng)操作。

消息方案從本質(zhì)上講是將分布式事務(wù)轉(zhuǎn)換為兩個(gè)本地事務(wù)瞻讽,然后依靠下游業(yè)務(wù)的重試機(jī)制達(dá)到最終一致性鸳吸。基于消息的最終一致性方案對(duì)應(yīng)用侵入性也很高速勇,應(yīng)用需要進(jìn)行大量業(yè)務(wù)改造晌砾,成本較高。

4 GTS-阿里分布式事務(wù)解決方案

GTS是一款分布式事務(wù)中間件烦磁,由阿里巴巴中間件部門研發(fā)养匈,可以為微服務(wù)架構(gòu)中的分布式事務(wù)提供一站式解決方案。

4.1 GTS的核心優(yōu)勢(shì)

a. 性能超強(qiáng)

GTS通過(guò)大量創(chuàng)新都伪,解決了事務(wù)ACID特性與高性能呕乎、高可用、低侵入不可兼得的問(wèn)題陨晶。單事務(wù)分支的平均響應(yīng)時(shí)間在2ms左右猬仁,3臺(tái)服務(wù)器組成的集群可以支撐3萬(wàn)TPS以上的分布式事務(wù)請(qǐng)求。

b. 應(yīng)用侵入性極低

GTS對(duì)業(yè)務(wù)低侵入先誉,業(yè)務(wù)代碼最少只需要添加一行注解(@TxcTransaction)聲明事務(wù)即可湿刽。業(yè)務(wù)與事務(wù)分離,將微服務(wù)從事務(wù)中解放出來(lái)褐耳,微服務(wù)關(guān)注于業(yè)務(wù)本身诈闺,不再需要考慮反向接口、冪等漱病、回滾策略等復(fù)雜問(wèn)題买雾,極大降低了微服務(wù)開(kāi)發(fā)的難度與工作量。

c. 完整解決方案

GTS支持多種主流的服務(wù)框架杨帽,包括EDAS漓穿,Dubbo,Spring Cloud等注盈。 有些情況下晃危,應(yīng)用需要調(diào)用第三方系統(tǒng)的接口,而第三方系統(tǒng)沒(méi)有接入GTS老客。此時(shí)需要用到GTS的MT模式僚饭。GTS的MT模式可以等價(jià)于TCC模式,用戶可以根據(jù)自身業(yè)務(wù)需求自定義每個(gè)事務(wù)階段的具體行為胧砰。MT模式提供了更多的靈活性鳍鸵,可能性,以達(dá)到特殊場(chǎng)景下的自定義優(yōu)化及特殊功能的實(shí)現(xiàn)尉间。

d. 容錯(cuò)能力強(qiáng)

GTS解決了XA事務(wù)協(xié)調(diào)器單點(diǎn)問(wèn)題偿乖,實(shí)現(xiàn)真正的高可用击罪,可以保證各種異常情況下的嚴(yán)格數(shù)據(jù)一致。

4.2 GTS的應(yīng)用場(chǎng)景

GTS可應(yīng)用在涉及服務(wù)調(diào)用的多個(gè)領(lǐng)域贪薪,包括但不限于金融支付媳禁、電信、電子商務(wù)画切、快遞物流竣稽、廣告營(yíng)銷、社交霍弹、即時(shí)通信毫别、手游、視頻庞萍、物聯(lián)網(wǎng)拧烦、車聯(lián)網(wǎng)等。

4.3 GTS與微服務(wù)的集成

GTS包括客戶端(GTS Client)钝计、資源管理器(GTS RM)和事務(wù)協(xié)調(diào)器(GTS Server)三個(gè)部分。GTS Client主要用來(lái)界定事務(wù)邊界齐佳,完成事務(wù)的發(fā)起與結(jié)束私恬。GTS RM完成事務(wù)分支的創(chuàng)建、提交炼吴、回滾等操作本鸣。GTS Server主要負(fù)責(zé)分布式事務(wù)的整體推進(jìn),事務(wù)生命周期的管理硅蹦。GTS和微服務(wù)集成的結(jié)構(gòu)圖如下所示荣德,GTS Client需要和業(yè)務(wù)應(yīng)用集成部署,RM與微服務(wù)集成部署童芹。?

4.4 GTS的輸出形式

GTS目前有三種輸出形式:公有云輸出涮瞻、公網(wǎng)輸出、專有云輸出假褪。

4.4.1 公有云輸出

這種輸出形式面向阿里云用戶署咽。如果用戶的業(yè)務(wù)系統(tǒng)已經(jīng)部署到阿里云上,可以申請(qǐng)開(kāi)通公有云GTS生音。開(kāi)通后業(yè)務(wù)應(yīng)用即可通過(guò)GTS保證服務(wù)調(diào)用的一致性宁否。這種使用場(chǎng)景下,業(yè)務(wù)系統(tǒng)和GTS間的網(wǎng)絡(luò)環(huán)境比較理想缀遍,達(dá)到很好性能慕匠。?

4.4.2 公網(wǎng)輸出

這種輸出形式面向于非阿里云的用戶,使用更加方便域醇、靈活台谊,業(yè)務(wù)系統(tǒng)只要能連接互聯(lián)網(wǎng)即可享受GTS提供的云服務(wù)(與公有云輸出的差別在于客戶端部署于用戶本地蓉媳,而不在云上)。

在正常網(wǎng)絡(luò)環(huán)境下青伤,以包含兩個(gè)本地事務(wù)的全局事務(wù)為例督怜,事務(wù)完成時(shí)間在20ms左右,50個(gè)并發(fā)就可以輕松實(shí)現(xiàn)1000TPS以上分布式事務(wù)狠角,對(duì)絕大多數(shù)業(yè)務(wù)來(lái)說(shuō)性能是足夠的号杠。在公網(wǎng)環(huán)境,網(wǎng)絡(luò)閃斷很難完全避免丰歌,這種情況下GTS仍能保證服務(wù)調(diào)用的數(shù)據(jù)一致性姨蟋。?

具體使用樣例使用參見(jiàn)4.7節(jié)GTS的工程樣例。

4.4.3 專有云輸出

這種形式主要面向于已建設(shè)了自己專有云平臺(tái)的大用戶立帖,GTS可以直接部署到用戶的專有云上眼溶,為專有云提供分布式事務(wù)服務(wù)。目前已經(jīng)有10多個(gè)特大型企業(yè)的專有云使用GTS解決分布式事務(wù)難題晓勇,性能與穩(wěn)定性經(jīng)過(guò)了用戶的嚴(yán)格檢測(cè)堂飞。

4.5?GTS的使用方式

GTS對(duì)應(yīng)用的侵入性非常低,使用也很簡(jiǎn)單绑咱。下面以訂單存儲(chǔ)應(yīng)用為例說(shuō)明绰筛。訂單業(yè)務(wù)應(yīng)用通過(guò)調(diào)用訂單服務(wù)和庫(kù)存服務(wù)完成訂單業(yè)務(wù),服務(wù)開(kāi)發(fā)框架為Dubbo描融。

4.5.1 訂單業(yè)務(wù)應(yīng)用

在業(yè)務(wù)函數(shù)外圍使用@TxcTransaction注解即可開(kāi)啟分布式事務(wù)铝噩。Dubbo應(yīng)用通過(guò)隱藏參數(shù)將GTS的事務(wù)xid傳播到服務(wù)端。

4.5.2 服務(wù)提供者

更新庫(kù)存方法

4.6 GTS的應(yīng)用情況

GTS目前已經(jīng)在淘寶窿克、天貓骏庸、阿里影業(yè)、淘票票年叮、阿里媽媽具被、1688等阿里各業(yè)務(wù)系統(tǒng)廣泛使用,經(jīng)受了16年和17年兩年雙十一海量請(qǐng)求的考驗(yàn)谋右。某線上業(yè)務(wù)系統(tǒng)最高流量已達(dá)十萬(wàn)TPS(每秒鐘10萬(wàn)筆事務(wù))硬猫。

GTS在公有云和專有云輸出后,已經(jīng)有了100多個(gè)線上用戶改执,很多用戶通過(guò)GTS解決SpringCloud啸蜜、Dubbo、Edas等服務(wù)框架的分布式事務(wù)問(wèn)題辈挂。業(yè)務(wù)領(lǐng)域涉及電力衬横、物流、ETC终蒂、煙草蜂林、金融遥诉、零售、電商噪叙、共享出行等十幾個(gè)行業(yè)矮锈,得到用戶的一致認(rèn)可。?


上圖是GTS與SpringCloud集成睁蕾,應(yīng)用于某共享出行系統(tǒng)苞笨。業(yè)務(wù)共享出行場(chǎng)景下,通過(guò)GTS支撐物聯(lián)網(wǎng)系統(tǒng)子眶、訂單系統(tǒng)瀑凝、支付系統(tǒng)、運(yùn)維系統(tǒng)臭杰、分析系統(tǒng)等系各統(tǒng)應(yīng)用的數(shù)據(jù)一致性粤咪,保證海量訂單和數(shù)千萬(wàn)流水的交易。

4.7 GTS的工程樣例

GTS的公有云樣例可參考阿里云網(wǎng)站渴杆。在公網(wǎng)環(huán)境下提供sample-txc-simple和sample-txc-dubbo兩個(gè)樣例工程寥枝。

4.7.1.1 樣例業(yè)務(wù)邏輯

該樣例是GTS的入門sample,案例的業(yè)務(wù)邏輯是從A賬戶轉(zhuǎn)賬給B賬戶磁奖,其中A和B分別位于兩個(gè)MySQL數(shù)據(jù)庫(kù)中脉顿,使用GTS事務(wù)保證A和B賬戶錢的總數(shù)始終不變。

4.7.1.2 樣例搭建方法

1) 準(zhǔn)備數(shù)據(jù)庫(kù)環(huán)境

安裝MySQL点寥,創(chuàng)建兩個(gè)數(shù)據(jù)庫(kù)db1和db2。在db1和db2中分別創(chuàng)建txc_undo_log表(SQL腳本見(jiàn)4.7.3)来吩。在db1庫(kù)中創(chuàng)建user_money_a表敢辩,在db2庫(kù)中創(chuàng)建user_money_b表。

2) 下載樣例

將sample-txc-simple文件下載到本地弟疆,樣例中已經(jīng)包含了GTS的SDK戚长。

3) 修改配置

打開(kāi)sample-txc-simple/src/main/resources目錄下的txc-client-context.xml,將數(shù)據(jù)源的url怠苔、username同廉、password修改為實(shí)際值。

4) 運(yùn)行樣例

在sample-txc-simple目錄下執(zhí)行build.sh編譯本工程柑司。編譯完成后執(zhí)行run.sh迫肖。

4.7.2 sample-txc-dubbo 樣例

4.7.2.1 樣例業(yè)務(wù)邏輯

本案例模擬了用戶下訂單、減庫(kù)存的業(yè)務(wù)邏輯攒驰◇『客戶端(Client)通過(guò)調(diào)用訂單服務(wù)(OrderService)創(chuàng)建訂單,之后通過(guò)調(diào)用庫(kù)存服務(wù)(StockService)扣庫(kù)存玻粪。其中訂單服務(wù)讀寫訂單數(shù)據(jù)庫(kù)隅津,庫(kù)存服務(wù)讀寫庫(kù)存數(shù)據(jù)庫(kù)诬垂。由 GTS 保證跨服務(wù)事務(wù)的一致性。

4.7.2.2 樣例搭建方法

1) 準(zhǔn)備數(shù)據(jù)庫(kù)環(huán)境

安裝MySQL伦仍,創(chuàng)建兩個(gè)數(shù)據(jù)庫(kù)db1和db2结窘。在db1和db2中分別創(chuàng)建txc_undo_log表。在db1庫(kù)中創(chuàng)建orders表充蓝,在db2庫(kù)中創(chuàng)建stock表隧枫。

2) 下載樣例

將樣例文件sample-txc-dubbo下載到本地機(jī)器,樣例中已經(jīng)包含了GTS的SDK棺克。

3) 修改配置

打開(kāi)sample-txc-dubbo/src/main/resources目錄悠垛,將dubbo-order-service.xml、dubbo-stock-service.xml兩個(gè)文件中數(shù)據(jù)源的url娜谊、username确买、password修改為實(shí)際值。

4) 運(yùn)行樣例

a. 編譯程序

在工程根目錄執(zhí)行 build.sh 命令纱皆,編譯工程湾趾。編譯后會(huì)在 sample-txc-dubbo/client/bin 目錄下生成 order_run.sh、stock_run.sh派草、client_run.sh 三個(gè)運(yùn)行腳本對(duì)應(yīng)訂單服務(wù)搀缠、庫(kù)存服務(wù)以及客戶端。

b. 運(yùn)行程序

在根目錄執(zhí)行run.sh近迁,該腳本會(huì)依次啟動(dòng)order_run.sh(訂單服務(wù))艺普、stock_run.sh(庫(kù)存服務(wù))和client_run.sh(客戶端程序)。

4.7.2.3 其他說(shuō)明

樣例使用Multicast注冊(cè)中心的聲明方式鉴竭。如果本機(jī)使用無(wú)線網(wǎng)絡(luò)歧譬,dubbo服務(wù)在綁定地址時(shí)有可能獲取ipv6地址,可以通過(guò)jvm啟動(dòng)參數(shù)禁用搏存。 方法是配置jvm啟動(dòng)參數(shù)?-Djava.net.preferIPv4Stack=true瑰步。

4.7.3 SQL

4.7.3.1 建表 txc_undo_log

CREATE TABLE?txc_undo_log?(

id?bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵',

gmt_create?datetime NOT NULL COMMENT '創(chuàng)建時(shí)間',

gmt_modified?datetime NOT NULL COMMENT '修改時(shí)間',

xid?varchar(100) NOT NULL COMMENT '全局事務(wù)ID',

branch_id?bigint(20) NOT NULL COMMENT '分支事務(wù)ID',

rollback_info?longblob NOT NULL COMMENT 'LOG',

status?int(11) NOT NULL COMMENT '狀態(tài)',

server?varchar(32) NOT NULL COMMENT '分支所在DB IP',

PRIMARY KEY (id),

KEY?unionkey?(xid,branch_id)

) ENGINE=InnoDB AUTO_INCREMENT=211225994 DEFAULT CHARSET=utf8 COMMENT='事務(wù)日志表';

4.7.3.2 建表 user_money_a

CREATE TABLE?user_money_a?(

id?int(11) NOT NULL AUTO_INCREMENT,

money?int(11) DEFAULT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

4.7.3.3 建表 user_money_b

CREATE TABLE?user_money_b?(

id?int(11) NOT NULL AUTO_INCREMENT,

money?int(11) DEFAULT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

4.7.3.4 建表 orders

CREATE TABLE?orders?(

id?bigint(20) NOT NULL AUTO_INCREMENT,

user_id?varchar(255) NOT NULL,

product_id?int(11) NOT NULL,

number?int(11) NOT NULL,

gmt_create?timestamp NOT NULL,

PRIMARY KEY (id)

) ENGINE=MyISAM AUTO_INCREMENT=351 DEFAULT CHARSET=utf8

4.7.3.5 建表 stock

CREATE TABLE?stock?(

product_id?int(11) NOT NULL,

price?float NOT NULL,

amount?int(11) NOT NULL,

PRIMARY KEY (product_id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

5 總結(jié)

GTS已經(jīng)在阿里內(nèi)部廣泛使用,經(jīng)過(guò)了雙十一流量高峰的考驗(yàn)璧眠。內(nèi)部成熟后缩焦,在專有云和公有云服務(wù)了很多用戶,很多用戶一天事務(wù)量在千萬(wàn)/億級(jí)別责静,解決了業(yè)務(wù)服務(wù)化改造后的分布式事務(wù)棘手技術(shù)難題袁滥。

我們相信,作為既滿足事務(wù)ACID特性泰演,又具備高性能呻拌、高可用、業(yè)務(wù)侵入性低的分布式事務(wù)中間件睦焕,未來(lái)GTS能幫助更多的開(kāi)發(fā)者藐握,推動(dòng)行業(yè)持續(xù)發(fā)展靴拱。


了解更多互聯(lián)網(wǎng)技術(shù)資訊,關(guān)注公眾號(hào):技術(shù)邊城猾普。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末袜炕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子初家,更是在濱河造成了極大的恐慌偎窘,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溜在,死亡現(xiàn)場(chǎng)離奇詭異陌知,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)掖肋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門仆葡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人志笼,你說(shuō)我怎么就攤上這事沿盅。” “怎么了纫溃?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵腰涧,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我紊浩,道長(zhǎng)窖铡,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任坊谁,我火速辦了婚禮万伤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘呜袁。我一直安慰自己,他們只是感情好简珠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布阶界。 她就那樣靜靜地躺著,像睡著了一般聋庵。 火紅的嫁衣襯著肌膚如雪膘融。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,274評(píng)論 1 300
  • 那天祭玉,我揣著相機(jī)與錄音氧映,去河邊找鬼。 笑死脱货,一個(gè)胖子當(dāng)著我的面吹牛岛都,可吹牛的內(nèi)容都是我干的律姨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼臼疫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼择份!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起烫堤,我...
    開(kāi)封第一講書(shū)人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤荣赶,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后鸽斟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拔创,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年富蓄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剩燥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡格粪,死狀恐怖躏吊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情帐萎,我是刑警寧澤比伏,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站疆导,受9級(jí)特大地震影響赁项,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜澈段,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一悠菜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧败富,春花似錦悔醋、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至鹦聪,卻和暖如春账阻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背泽本。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工淘太, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓蒲牧,卻偏偏與公主長(zhǎng)得像撇贺,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子造成,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 摘要:本文將深入和大家探討微服務(wù)架構(gòu)下显熏,分布式事務(wù)的各種解決方案,并重點(diǎn)為大家解讀阿里巴巴提出的分布式事務(wù)解決方案...
    貓耳呀閱讀 1,176評(píng)論 0 8
  • 隨著網(wǎng)絡(luò)的發(fā)展蕴轨,人與人之間的交流越來(lái)越方便,像幾年前的的微博骇吭,還有前兩年的微商橙弱,到最近一年的自媒體的興起,...
    緊箍咒下的人影閱讀 382評(píng)論 0 0
  • 翻開(kāi)《通鑒》燥狰,開(kāi)篇即是三家分晉棘脐,之后就是幾千字的名分論,在整部資治通鑒中龙致,這么長(zhǎng)的評(píng)論鮮見(jiàn)蛀缝,由此可見(jiàn)當(dāng)時(shí)溫公不吐不...
    讀小字閱讀 609評(píng)論 1 2
  • 一 坐在半山腰的亭子里,她抬頭往山下看去目代。上山的路蜿蜒曲折若隱若現(xiàn)屈梁,偶爾看到一階階的石梯,在那陡峭的山體上艱難攀爬...
    大漠鈴兒響閱讀 300評(píng)論 0 0