無標(biāo)題文章

# 背景

# 關(guān)鍵設(shè)計點

## 模塊化

## 資源隔離

## 權(quán)限控制

### RPC框架的需求分析和概要設(shè)計

#### 發(fā)展與現(xiàn)狀

- RPC框架指的是能夠完成RPC調(diào)用的解決方案,除了點對點的RPC協(xié)議的具體實現(xiàn)之外张症,還可以包含服務(wù)的發(fā)現(xiàn)與注銷,提供服務(wù)的多臺Server的負(fù)載均衡、服務(wù)的高可用等更多的功能遂庄,目前的RPC框架大致有兩種不同的側(cè)重方向,一種偏重于服務(wù)治理锈麸,另一種偏重于跨語言調(diào)用讼育。

- 開源的RPC框架介紹:Dubbo、DubboX啥供、Thrift悯恍、Motan。其中Dubbo,Dubbox,motan是java生態(tài)下的偏向服務(wù)治理的RPC框架伙狐,Thrift是偏重于跨語言的調(diào)用的RPC涮毫。

#### RPC框架提供的主要功能

- 服務(wù)發(fā)現(xiàn):服務(wù)發(fā)布、訂閱贷屎、通知

- 負(fù)載均衡:支持一致性Hash罢防、隨機請求、輪詢唉侄、最少連接數(shù)優(yōu)先咒吐、低并發(fā)優(yōu)先等分發(fā)原則

- 高可用策略:失敗重試(FailOver)、快速失敗(FailFast)属划、異常隔離(Server連續(xù)失敗超過指定次數(shù)置為不可用恬叹,然后定期進行心跳探測)

- 其他: 調(diào)用統(tǒng)計、權(quán)限控制同眯、安全绽昼、調(diào)用鏈追蹤、日志

#### DY RPC框架交互流程1

DY RPC框架中有服務(wù)提供方 RPC Server须蜗,服務(wù)調(diào)用方RPC Client硅确,服務(wù)注冊中心MessageServer三個角色目溉。該框架的RPCServer主要現(xiàn)在用c++寫的服務(wù),RPC Client包括php或者RPCServer疏魏。

1. RPC Server向MessageServer集群的某個節(jié)點B注冊服務(wù),并保持長連接停做。該MessageServe r B節(jié)點會通知集群的所有節(jié)點。

同時MessageServer B節(jié)點也會定時把注冊到該節(jié)點的RPCServer的服務(wù)配置信息同步到 MessageServer集群大莫。

2. RPCClient會連接到MessageServer集群的某個節(jié)點A蛉腌,發(fā)起RPC調(diào)用。MessageServer A節(jié)點會根據(jù)RPC調(diào)用的參數(shù)(服務(wù)提供方的ID只厘,GroupID烙丛、負(fù)載均衡策略等)選擇一條合適的

RPC調(diào)用鏈路,比如RPCClient->MessageServerA->MessageServerB->RPCServer羔味,最終到達某個RPCServer,進行函數(shù)調(diào)用河咽。其中一個RPC調(diào)用最多會經(jīng)過2個MessageServer節(jié)點,最少會經(jīng)過1個MessageServer節(jié)點赋元。

3. 當(dāng)某個RPC Server發(fā)生變更時忘蟹,通過廣播的方式,MessageServer集群的所有節(jié)點也能比較實時的感知到某個RPCServer發(fā)生變更搁凸。

TODO RPC流程交互圖

#### DY RPC功能模塊劃分

1. MessageServer在RPC框架這個功能上應(yīng)該提供的功能媚值,包括服務(wù)的注冊和發(fā)現(xiàn)模塊、協(xié)議序列化模塊护糖、心跳檢測模塊褥芒、負(fù)載均衡算法模塊,RPC路由模塊嫡良、失敗重試策略模塊锰扶、超時丟棄策略模塊、消息持久化模塊寝受。

2. RPCServer要包含RPC治理的組件坷牛,主要功能包括RPC的統(tǒng)計、RPC的頻率控制羡蛾、RPC的安全性控制漓帅。

##### RPCServer可用性檢測模塊

每個服務(wù)默認(rèn)都要實現(xiàn)一個類似Ping Pong的 Request和Response,用來給直連RPCServer的MessageServer探測RPCServer是否可用提供依據(jù)痴怨。不能簡單的依賴心跳消息來探測RPCServer是否可用忙干。

##### 負(fù)載均衡模塊

MessageServer把RPC請求轉(zhuǎn)發(fā)給RPCServer Group時,需要支持的負(fù)載均衡算法:

1. 隨機法(已實現(xiàn))

2. 輪詢法(已實現(xiàn))目前在生產(chǎn)環(huán)境用的這種算法浪藻,負(fù)載較不均衡捐迫。

3. 組內(nèi)Hash法(已實現(xiàn))

4. TODO 最少連接法 (最靠譜的負(fù)載均衡做法)

看服務(wù)器響應(yīng)自己請求的速度就可以判斷應(yīng)該把下一個請求發(fā)到哪個服務(wù)器端。

具體說是選擇活動請求(已經(jīng)發(fā)出去的請求收到響應(yīng))數(shù)目最少的那個服務(wù)端爱葵。 只要根據(jù)自己以往的調(diào)用情況就能做出判斷施戴。

5. TODO: 目前的消息系統(tǒng)只支持點到點反浓、點到組。目前還暫不支持點到組內(nèi)的某個節(jié)點的負(fù)載均衡算法赞哗。

##### 失敗重試策略模塊

在RPCClient直連的MessageServer上實現(xiàn)RPC失敗重試的策略雷则。

- 只有冪等的RPC調(diào)用才能重試。

##### 超時丟棄策略模塊

在RPCServer的業(yè)務(wù)層實現(xiàn)超時丟棄的策略肪笋,應(yīng)用場景:發(fā)送火箭超時時月劈,客戶端提示發(fā)送失敗,其實是在魚翅交易服務(wù)器出現(xiàn)性能抖動導(dǎo)致藤乙。最后的結(jié)果就是魚翅服務(wù)器扣除了魚翅猜揪,但是客戶端提示發(fā)送火箭失敗,比較嚴(yán)重的情況是坛梁,用戶以為提示失敗時不會消耗魚翅而姐,所以不斷重新發(fā)送火箭。

針對這種類型的RPC划咐,RPCServer的業(yè)務(wù)層可以根據(jù)RPC的配置規(guī)則+RPC發(fā)起時間來決定是否直接丟棄該RPC拴念。

##### 消息持久化模塊

- 在調(diào)用RPC時如果指定可達時,才觸發(fā)消息持久化的機制褐缠。

- 因為RPC的調(diào)用鏈最多需要經(jīng)過4個節(jié)點(RPCClient->MessageServerA->MessageServerB->RPCServer),導(dǎo)致RPC不可達到的情況較為復(fù)雜丈莺,如果采用自研的方案做消息持久化的話,我們可以假設(shè)MessageServer的集群比較穩(wěn)定送丰,RPCServer較不穩(wěn)定,所以我們持久化的方案是在和RPCServer直連的MessageServer上實現(xiàn)弛秋。

- MessageServer上做持久化具體設(shè)計要點:

- 正常流程:

- MessageServer將RPC請求轉(zhuǎn)化為消息器躏,以RPCServer的模塊id為Key,將消息存入Redis的隊列蟹略,我們將這個消息稱為MessageData登失;

- 將RPC請求的MessageID作為Key,Value作為保留字段設(shè)計挖炬,存入Redis的String揽浙,我們將這個數(shù)據(jù)稱為MetaData,同時設(shè)置這個Key的過期時間為10分鐘(暫定),這個操作和上面的操作作為Redis的一個事務(wù)來執(zhí)行意敛;

- 執(zhí)行完上面的事務(wù)后馅巷,直接調(diào)用RPC的Response,返回給RPCClient草姻;

- RPCServer集群的某個節(jié)點從Redis隊列取出MessageData钓猬,執(zhí)行RPCHandler。

- 異常流程1:

- 如果在執(zhí)行RPCHandler的過程中撩独,RPCServer異常敞曹,就只會影響一條MessageData账月。可以通過一些輔助腳本來做補單澳迫,考慮一種策略來實現(xiàn)自動化的補單局齿。

- 異常流程2:

- MessageServerA->MessageServerB網(wǎng)絡(luò)抖動 或者 MessageServerB->Redis的網(wǎng)絡(luò)抖動都會導(dǎo)致MessageData不能進入隊列;

- 在和RPCClient直連的MessageServerA一段時間(先暫定10s)沒有收到RPCResponse橄登,就會觸發(fā)重試機制抓歼,重試的上限次數(shù)暫定20次,確保整體重試的時間小于MetaData過期的時間就可以示绊,重試流程進入到MessageServerB節(jié)點時锭部,如果是重試RPC,查找Redis隊列是否有這個MessageData面褐,如果不存在拌禾,則執(zhí)行正常流程。如果存在展哭,則丟棄本次重試湃窍,說明上一次重試已經(jīng)成功了。

##### 增加RPC追蹤鏈日志

- 在RPCClient直連的個MessageServer上給RPC請求賦予一個Global的RPCID;

- RPCID可以從IDMakerServer集群獲得匪傍,通過一次獲得一批ID來獲得良好的性能;

- 在RPC經(jīng)過的每個節(jié)點您市,都需要有規(guī)劃統(tǒng)一的格式,并上報給大數(shù)據(jù)平臺;

- 在大數(shù)據(jù)后臺役衡,可以根據(jù)RPCID查找整個RPC調(diào)用鏈上的信息茵休。

##### RPC治理組件

- RPC調(diào)用統(tǒng)計:每個RPC入口增加統(tǒng)計信息,當(dāng)rpc進入內(nèi)部業(yè)務(wù)函數(shù)后也有一次統(tǒng)計,統(tǒng)計信息匯入大數(shù)據(jù)實時統(tǒng)一日志

- RPC頻率控制:某個時間單位內(nèi)手蝎,RPC調(diào)用不得超過某個數(shù)量;如果有超過,則報警榕莺。在頻率控制粒度方面,采取如下控制策略和監(jiān)控策略棵介。

- 每個服務(wù)的所有RPC在單位時間內(nèi)的調(diào)用頻率控制钉鸯,超出則報警;

- 某個RPC在單位時間內(nèi)的調(diào)用頻率控制邮辽,超出則報警唠雕;

- 定時統(tǒng)計每個Client來源在每個RPC的調(diào)用次數(shù),并按照統(tǒng)一格式上傳給大數(shù)據(jù)平臺吨述,大數(shù)據(jù)平臺提供按照Client來源岩睁、時間查找RPC調(diào)用次數(shù)的Top 10的類似功能;

- 大數(shù)據(jù)平臺定時對比RPC的歷史調(diào)用次數(shù)和當(dāng)前調(diào)用次數(shù)锐极,超過一定的比例就報警笙僚。

- RPC安全策略:

- 可以隨時關(guān)閉某個RPC、某個服務(wù)的所有RPC的安全策略灵再;

- ip驗證:給一個ip白名單肋层,這個白名單才能發(fā)起RPC調(diào)用亿笤,不建議按照每個RPC調(diào)用單獨設(shè)置ip白名單

- 口令驗證:針對某個RPC、某個服務(wù)單獨設(shè)置密碼栋猖,對大都數(shù)服務(wù)都設(shè)置成統(tǒng)一的密碼净薛,不建議針對每個RPC或者每個服務(wù)都單獨設(shè)置密碼。因為除了密碼蒲拉,還有一個摘要認(rèn)證加密算法才能破解RPC的協(xié)議∷喟荩現(xiàn)在密碼是運維維護的,摘要認(rèn)證加密算法是開發(fā)維護的雌团。所以不建議對密碼的粒度控制得過細(xì)

- RPC手動降級:可以隨時關(guān)閉某個RPC燃领;也可以根據(jù)Client來源關(guān)閉某個RPC,但對其他Client來源是開啟的锦援。

- RPC自動降級: TODO

- 配置文件格式:參考詳細(xì)設(shè)計文檔 by 李明

#### 關(guān)鍵數(shù)據(jù)結(jié)構(gòu)

1. 服務(wù)注冊協(xié)議

```

struct MC_MsgLoginReqNew : public MessageRoot

{

uint8_t? _version;

DWORD? ? _uid;

char? ? ? _user_name[33];

char? ? ? _password[33];? ? ? //之前的口令字段依舊不使用

int? ? ? _module_id? ? ? ? ? //模塊id

};

```

2.RPCClient Request基本結(jié)構(gòu)猛蔽,同樣包括GroupRPCReq(組內(nèi)隨機調(diào)用),GroupRPCReq2(組內(nèi)hash調(diào)用)的

```

struct MC_RPC_Req_New : public MessageRoot< MCT_RPC_Req_New, MC_RPC_Req_New >

{

uint8_t _version;? ? ? ? // 版本號

int64 _rpc_global_id;? ? // 每次調(diào)用需要從idMakderServer獲得唯一id,RPC追蹤鏈需要依賴該id來識別

int _rpc_option;? ? ? ? ? // 包括RPC可達,重試,超時丟失等標(biāo)志,不可疊加

int32 _user_data;? ? ? ? ? // 自定義用戶數(shù)據(jù)

int _rpc_retry_count;? ? ? // 0表示第一次請求,每重試一次+1

int _invoker_id;? ? ? ? ? // 調(diào)用者的ID

int _invoker_moudule_id;? // 調(diào)用者的模塊id

uint32_t _invoker_ip;? ? ? // 調(diào)用者的ip

int _call_token;? ? ? ? //調(diào)用標(biāo)識灵寺,由調(diào)用者設(shè)置曼库,返回結(jié)果時必須攜帶此token,否則調(diào)用者無法區(qū)分是哪一次調(diào)用

int _recvier_id;? ? ? // 接收者的serverID

uint32_t _req_time? ? // 請求時間戳

int64_t _random_num;? // 隨機數(shù) 沒有口令配置此項可以不填

uchar _password[32];? // 口令略板,由 隨機數(shù)+ 模塊id+ 函數(shù)名+ 配置文件的口令+ 時間戳 的字符串 一次md5獲得毁枯,服務(wù)器使用同字段md5對比校驗,沒有口令配置此項留空即可

char _func_name[128]; //函數(shù)名

char _text_data[1];? //SttEncoding存儲函數(shù)體,包括函數(shù)名叮称、參數(shù)名/參數(shù)值

};

```

> _rpc_global_id,_invoker_moudule_id,_invoker_ip這個由調(diào)用方直連的第一個MessageServer直接賦值

> _version,_req_time,_random_num,_password种玛,由RPCClient生成危融,RPCServer校驗

> _rpc_retry_count配喳,表示重試的次數(shù),這個由調(diào)用方直連的第一個MessageServer發(fā)起重試策略時+1

> _rpc_option,包括RPC可達篡悟,重試距帅,超時丟棄等標(biāo)志,現(xiàn)在不可疊加括堤,以后可支持疊加碌秸,常見的場景是:

1. RPCClient不太關(guān)注返回結(jié)果的、關(guān)鍵數(shù)據(jù)更新類的RPC悄窃,建議指定RPC可達讥电。

2. RPCClient非常關(guān)注返回結(jié)果提示,但又不支持重試的(非冪等RPC)轧抗,建議指定超時丟棄標(biāo)志

3. RPCClient非常關(guān)注返回結(jié)果提示恩敌,該RPC又支持冪等,建議指定重試標(biāo)志

4. _user_data:根據(jù)不同的RPC標(biāo)志横媚,可以指定特定的含義.比如指定最大重試次數(shù)或者超時丟棄的時間

> GroupRPCReq(組內(nèi)隨機調(diào)用),GroupRPCReq2(組內(nèi)hash調(diào)用)的數(shù)據(jù)結(jié)構(gòu)也需要同時更新纠炮。

3. RPCServer Response基本結(jié)構(gòu)

```

struct RPC_RespNew

{

uint8_t _version;? ? ? // 版本號

int64 _rpc_global_id;? // RPC全局唯一id

int recvier_id;? ? ? ? // 接收者的ID月趟;如果是按組接收,此值由MessageServer修改為具體的接收者ID

int invoker_id;? ? ? ? // 調(diào)用者的ID

int call_token;? ? ? ? //調(diào)用標(biāo)識恢口,由調(diào)用者設(shè)置孝宗,返回結(jié)果時必須攜帶此token,否則調(diào)用者無法區(qū)分是哪一次調(diào)用

char text_data[1];? ? ? //SttEncoding存儲調(diào)用結(jié)果

}

```

#### 以送火箭場景為場景描述架構(gòu)重構(gòu)的思路

1. php調(diào)用發(fā)送火箭RPC接口給魚翅交易服務(wù)器耕肩,魚翅服務(wù)器完成RPC調(diào)用因妇,并且是把這個消息發(fā)送給所有的ChatRoom。

2. 魚翅交易服務(wù)器把發(fā)送火箭這個RPC封裝成NetMessage通過ChatRoom發(fā)送給RoomMaster,RoomMaster找到人氣值前50的房間猿诸,并向人氣值前50的房間的ChatRoom發(fā)送火箭廣播的NetMessag婚被,ChatRoom再把廣播消息發(fā)送給MessageRepeater

3. ChatRoom通過NetMessage把發(fā)送火箭這個消息事件發(fā)送給排行榜服務(wù)器

4. ChatRoom通過NetMessage把發(fā)送火箭這個消息事件發(fā)送給經(jīng)驗服務(wù)器

5. ChatRoom發(fā)送創(chuàng)建紅包RPC給紅包服務(wù)器

目前的業(yè)務(wù)流程的主要弊端如下:

1. ChatRoom和大都數(shù)服務(wù)耦合非常緊密,據(jù)我了解梳虽,c++的各個小組經(jīng)常存在同時維護ChatRoom的情況址芯。

2. 同樣,新增一個和送火箭相關(guān)的服務(wù)怖辆,ChatRoom也需要增加相關(guān)接口是复。

3. ChatRoom通過RPC、NetMessage和其他業(yè)務(wù)交互時竖螃,如果網(wǎng)絡(luò)出現(xiàn)抖動或者其他業(yè)務(wù)在維護或者不穩(wěn)定時淑廊,都會導(dǎo)致數(shù)據(jù)的丟失,比較影響用戶的體驗特咆。

針對送火箭這個業(yè)務(wù)流程季惩,我個人認(rèn)為比較優(yōu)雅的架構(gòu)(新架構(gòu))如下:

1. php調(diào)用發(fā)送火箭RPC接口給魚翅交易服務(wù)器,魚翅服務(wù)器完成RPC調(diào)用

2. 魚翅交易服務(wù)器把發(fā)送火箭這個RPC封裝成消息事件腻格,發(fā)送給消息隊列服務(wù)器画拾。

3. 紅包服務(wù)器、經(jīng)驗服務(wù)器菜职、排行榜服務(wù)器青抛、RoomMaster都通過訂閱的方式訂閱到了發(fā)送火箭這個消息。這些服務(wù)器按照自己的業(yè)務(wù)規(guī)則處理該消息事件酬核!

4. RoomMaster找到人氣值前50的房間蜜另,并向人氣值前50的房間的ChatRoom發(fā)送火箭廣播的NetMessag,ChatRoom再把廣播消息發(fā)送給MessageRepeater嫡意。

新架構(gòu)的優(yōu)點如下:

1. ChatRoom和其他服務(wù)已經(jīng)完全解耦举瑰。

2. 如果新增一個和送火箭相關(guān)的服務(wù),魚翅服務(wù)器的邏輯也不用調(diào)整蔬螟。新增的服務(wù)只需要訂閱送火箭的消息隊列就可以了此迅。

3. 消息隊列服務(wù)器是一個穩(wěn)定的第三方服務(wù),基本是不用維護的。其他比如紅包服務(wù)器耸序、經(jīng)驗服務(wù)器忍些、排行榜服務(wù)器的不穩(wěn)定,都不會導(dǎo)致數(shù)據(jù)的丟失佑吝。

老框架遷移到新框架下的推進計劃:

1. 先挑選送火箭這個業(yè)務(wù)進行重構(gòu)坐昙,其他業(yè)務(wù)流程仍然兼容老的RPC的通信方式;

2. 逐步梳理c++組的業(yè)務(wù)流程芋忿,挑選業(yè)務(wù)流程逐一進行重構(gòu)炸客;

3. 第一個業(yè)務(wù)流程的重構(gòu)預(yù)估時間大概在3周左右,后面的每個業(yè)務(wù)流程重構(gòu)預(yù)估在1周左右,在3-4個月的時間內(nèi)梳理完所有流程戈钢。

## 當(dāng)前底層框架可以優(yōu)化的點

1. MessageServer集群可以優(yōu)雅的增加痹仙、刪除、修改(同時刪除殉了、增加來實現(xiàn))節(jié)點开仰,現(xiàn)在修改某個節(jié)點的ip需要重啟整個集群?

2. 把彈幕的MessageServer集群和RPC的MessageServer集群分離

3. 協(xié)議序列化框架改成ProtoBuffer薪铜,可以逐個協(xié)議升級

4. MessageServer的通信鏈路自動檢測众弓,防止出現(xiàn)某個節(jié)點異常之后很久才發(fā)現(xiàn)

## 統(tǒng)一日志

**TODO:本周5和c++組討論之后再確定**

## 近期之內(nèi)主要的工作項

WorkItem | 優(yōu)先級 | 備注

---|---|---

RPC治理組件 | P0 |

日志格式統(tǒng)一 | P0 |

NetMessage消息支持負(fù)載均衡 | P0 |

RPCServer可用性檢測模塊 | P1 |

當(dāng)前底層框架可以優(yōu)化的點 | P1 |

送火箭業(yè)務(wù)流程重構(gòu) | P2 |

RPC失敗重試策略模塊 | P2 |

#### DY RPC框架交互流程2

**TODO: 補充c++調(diào)用PHP的流程及其他**

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市隔箍,隨后出現(xiàn)的幾起案子谓娃,更是在濱河造成了極大的恐慌,老刑警劉巖蜒滩,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滨达,死亡現(xiàn)場離奇詭異,居然都是意外死亡俯艰,警方通過查閱死者的電腦和手機捡遍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來竹握,“玉大人画株,你說我怎么就攤上這事±卜” “怎么了污秆?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長昧甘。 經(jīng)常有香客問我,道長战得,這世上最難降的妖魔是什么充边? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上浇冰,老公的妹妹穿的比我還像新娘贬媒。我一直安慰自己,他們只是感情好肘习,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布际乘。 她就那樣靜靜地躺著,像睡著了一般漂佩。 火紅的嫁衣襯著肌膚如雪脖含。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天投蝉,我揣著相機與錄音养葵,去河邊找鬼。 笑死瘩缆,一個胖子當(dāng)著我的面吹牛关拒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播庸娱,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼着绊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了熟尉?” 一聲冷哼從身側(cè)響起归露,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎臣樱,沒想到半個月后靶擦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡雇毫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年玄捕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棚放。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡枚粘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出飘蚯,到底是詐尸還是另有隱情馍迄,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布局骤,位于F島的核電站攀圈,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏峦甩。R本人自食惡果不足惜赘来,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一现喳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧犬辰,春花似錦嗦篱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涵卵,卻和暖如春浴栽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缘厢。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工吃度, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贴硫。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓椿每,卻偏偏與公主長得像,于是被迫代替她去往敵國和親英遭。 傳聞我的和親對象是個殘疾皇子间护,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)挖诸,斷路器汁尺,智...
    卡卡羅2017閱讀 134,707評論 18 139
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,726評論 0 9
  • # MVC ?框架的所有代碼結(jié)構(gòu)整合都是采用MVC的基礎(chǔ)架構(gòu)多律,這也是蘋果iOS系統(tǒng)的基本架構(gòu)痴突。Controller...
    keldonwang閱讀 318評論 0 0
  • spring官方文檔:http://docs.spring.io/spring/docs/current/spri...
    牛馬風(fēng)情閱讀 1,691評論 0 3
  • 又起了個大早趕早集,漫漫旅途狼荞,聽著音樂辽装,默片般回顧這幾年的點滴,長鏡頭越拉越遠(yuǎn)相味,突然心生感慨拾积,速度記下?? 1...
    周小葵OnRoad閱讀 353評論 10 5