Java集群優(yōu)化——dubbo+zookeeper構(gòu)建高可用分布式集群

不久前腕侄,我們討論過Nginx+tomcat組成的集群殊校,這已經(jīng)是非常靈活的集群技術(shù),但是當(dāng)我們的系統(tǒng)遇到更大的瓶頸晶默,全部應(yīng)用的單點(diǎn)服務(wù)器已經(jīng)不能滿足我們的需求谨娜,這時(shí),我們要考慮另外一種磺陡,我們熟悉的內(nèi)容趴梢,就是分布式,而當(dāng)下流行的Dubbo框架币他,不容我們忽視坞靶,這里,咱們一起來探討一下這個(gè)框架的使用蝴悉。

一彰阴,背景

以前我們需要遠(yuǎn)程調(diào)用他人的接口,我們是這么做的:

我們遇到的問題:

(1) 當(dāng)服務(wù)越來越多時(shí)拍冠,服務(wù)URL配置管理變得非常困難尿这,F(xiàn)5硬件負(fù)載均衡器的單點(diǎn)壓力也越來越大。

此時(shí)需要一個(gè)服務(wù)注冊中心庆杜,動(dòng)態(tài)的注冊和發(fā)現(xiàn)服務(wù)射众,使服務(wù)的位置透明。

并通過在消費(fèi)方獲取服務(wù)提供方地址列表晃财,實(shí)現(xiàn)軟負(fù)載均衡和Failover叨橱,降低對F5硬件負(fù)載均衡器的依賴,也能減少部分成本断盛。

(2) 當(dāng)進(jìn)一步發(fā)展罗洗,服務(wù)間依賴關(guān)系變得錯(cuò)蹤復(fù)雜,甚至分不清哪個(gè)應(yīng)用要在哪個(gè)應(yīng)用之前啟動(dòng)钢猛,架構(gòu)師都不能完整的描述應(yīng)用的架構(gòu)關(guān)系伙菜。

這時(shí),需要自動(dòng)畫出應(yīng)用間的依賴關(guān)系圖厢洞,以幫助架構(gòu)師理清理關(guān)系仇让。

(3) 接著,服務(wù)的調(diào)用量越來越大躺翻,服務(wù)的容量問題就暴露出來丧叽,這個(gè)服務(wù)需要多少機(jī)器支撐?什么時(shí)候該加機(jī)器公你?

為了解決這些問題踊淳,第一步,要將服務(wù)現(xiàn)在每天的調(diào)用量陕靠,響應(yīng)時(shí)間迂尝,都統(tǒng)計(jì)出來,作為容量規(guī)劃的參考指標(biāo)剪芥。

其次垄开,要可以動(dòng)態(tài)調(diào)整權(quán)重,在線上税肪,將某臺機(jī)器的權(quán)重一直加大溉躲,并在加大的過程中記錄響應(yīng)時(shí)間的變化,直到響應(yīng)時(shí)間到達(dá)閥值益兄,記錄此時(shí)的訪問量锻梳,再以此訪問量乘以機(jī)器數(shù)反推總?cè)萘俊?/p>

為解決這些問題,Dubbo為我們做了什么呢:

負(fù)載均衡:

這就是所謂的軟負(fù)載均衡净捅!

現(xiàn)在讓我們一起來接觸下這個(gè)優(yōu)秀的框架:

簡介

架構(gòu)如圖:

節(jié)點(diǎn)角色說明:

Provider:暴露服務(wù)的服務(wù)提供方疑枯。

Consumer:調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方。

Registry:服務(wù)注冊與發(fā)現(xiàn)的注冊中心蛔六。

Monitor:統(tǒng)計(jì)服務(wù)的調(diào)用次調(diào)和調(diào)用時(shí)間的監(jiān)控中心荆永。

Container:服務(wù)運(yùn)行容器。

調(diào)用關(guān)系說明:

0.服務(wù)容器負(fù)責(zé)啟動(dòng)国章,加載屁魏,運(yùn)行服務(wù)提供者。

1.服務(wù)提供者在啟動(dòng)時(shí)捉腥,向注冊中心注冊自己提供的服務(wù)氓拼。

2.服務(wù)消費(fèi)者在啟動(dòng)時(shí),向注冊中心訂閱自己所需的服務(wù)抵碟。

3.注冊中心返回服務(wù)提供者地址列表給消費(fèi)者桃漾,如果有變更,注冊中心將基于長連接推送變更數(shù)據(jù)給消費(fèi)者拟逮。

4.服務(wù)消費(fèi)者撬统,從提供者地址列表中,基于軟負(fù)載均衡算法敦迄,選一臺提供者進(jìn)行調(diào)用恋追,如果調(diào)用失敗凭迹,再選另一臺調(diào)用。

5.服務(wù)消費(fèi)者和提供者苦囱,在內(nèi)存中累計(jì)調(diào)用次數(shù)和調(diào)用時(shí)間嗅绸,定時(shí)每分鐘發(fā)送一次統(tǒng)計(jì)數(shù)據(jù)到監(jiān)控中心。

Dubbo提供了很多協(xié)議撕彤,Dubbo協(xié)議鱼鸠、RMI協(xié)議、Hessian協(xié)議羹铅,我們查看Dubbo源代碼蚀狰,有各種協(xié)議的實(shí)現(xiàn),如圖所示:

我們之前沒用Dubbo之前時(shí)职员,大部分都使用Hessian來使用我們服務(wù)的暴露和調(diào)用麻蹋,利用HessianProxyFactory調(diào)用遠(yuǎn)程接口。

上面是參考了Dubbo官方網(wǎng)介紹焊切,接下來我們來介紹SpringMVC哥蔚、Dubbo、Zookeeper整合使用蛛蒙。

第三:Dubbo與Zookeeper糙箍、SpringMVC整合使用

第一步:在Linux上安裝Zookeeper

Zookeeper作為Dubbo服務(wù)的注冊中心,Dubbo原先基于數(shù)據(jù)庫的注冊中心牵祟,沒采用Zookeeper深夯,Zookeeper一個(gè)分布式的服務(wù)框架,是樹型的目錄服務(wù)的數(shù)據(jù)存儲诺苹,能做到集群管理數(shù)據(jù)?咕晋,這里能很好的作為Dubbo服務(wù)的注冊中心,Dubbo能與Zookeeper做到集群部署收奔,當(dāng)提供者出現(xiàn)斷電等異常停機(jī)時(shí)掌呜,Zookeeper注冊中心能自動(dòng)刪除提供者信息,當(dāng)提供者重啟時(shí)坪哄,能自動(dòng)恢復(fù)注冊數(shù)據(jù)质蕉,以及訂閱請求。我們先在linux上安裝Zookeeper翩肌,我們安裝最簡單的單點(diǎn)模暗,集群比較麻煩。

先需要安裝JdK念祭,從Oracle的Java網(wǎng)站下載兑宇,安裝很簡單,就不再詳述粱坤。

單機(jī)模式

單機(jī)安裝非常簡單隶糕,只要獲取到 Zookeeper 的壓縮包并解壓到某個(gè)目錄如:C:\zookeeper-3.4.5\下瓷产,Zookeeper 的啟動(dòng)腳本在 bin 目錄下,Windows 下的啟動(dòng)腳本是 zkServer.cmd枚驻。

在你執(zhí)行啟動(dòng)腳本之前濒旦,還有幾個(gè)基本的配置項(xiàng)需要配置一下,Zookeeper 的配置文件在 conf 目錄下测秸,這個(gè)目錄下有 zoo_sample.cfg 和 log4j.properties,你需要做的就是將 zoo_sample.cfg 改名為 zoo.cfg灾常,因?yàn)?Zookeeper 在啟動(dòng)時(shí)會找這個(gè)文件作為默認(rèn)配置文件霎冯。下面詳細(xì)介紹一下,這個(gè)配置文件中各個(gè)配置項(xiàng)的意義钞瀑。

需要了解源碼的朋友加我QQ:2137028325

框架簡介:

本系統(tǒng)一款通用的SOA中間件平臺沈撞,用來開發(fā)各類J2EE企業(yè)級應(yīng)用,節(jié)省時(shí)間和人力成本雕什。本系統(tǒng)采用MVC模式缠俺、AOP引擎、任務(wù)調(diào)度器贷岸、Ajax壹士、攔截器、過濾器偿警、緩存躏救、日志監(jiān)控、數(shù)據(jù)訪問螟蒸、表達(dá)式盒使、國際化等技術(shù)使碾。

框架/平臺構(gòu)成:

Maven+Springmvc + Mybatis + Shiro(權(quán)限)+ Tiles(模板) +ActiveMQ(消息隊(duì)列) + Rest(服務(wù)) + WebService(服務(wù))+ EHcache(緩存) + Quartz(定時(shí)調(diào)度)+ Html5(支持PC咖驮、IOS封豪、Android)

用戶權(quán)限系統(tǒng):

組織結(jié)構(gòu):角色徽惋、用戶隔躲、用戶組掉盅、組織機(jī)構(gòu)云头;權(quán)限點(diǎn):頁面酒请、方法绍赛、按鈕鞋拟、數(shù)據(jù)權(quán)限、分級授權(quán)

項(xiàng)目管理新體驗(yàn):

快速出原型系統(tǒng)惹资、組件樹贺纲、版本控制、模塊移植褪测、協(xié)同開發(fā)猴誊、實(shí)時(shí)監(jiān)控潦刃、發(fā)布管理

可持續(xù)集成:

所有組件可移植、可定制懈叹、可擴(kuò)充乖杠,開發(fā)成果不斷積累,形成可持續(xù)發(fā)展的良性循環(huán)

支持平臺平臺:

Windows XP澄成、Windows 7 胧洒、Windows 10 、 Linux 墨状、 Unix

服務(wù)器容器:

Tomcat 5/6/7 卫漫、Jetty、JBoss肾砂、WebSphere 8.5

需要了解源碼的朋友加我QQ:2137028325

[html]view plaincopy

#?The?number?of?milliseconds?of?each?tick

tickTime=2000

#?The?number?of?ticks?that?the?initial

#?synchronization?phase?can?take

initLimit=10

#?The?number?of?ticks?that?can?pass?between

#?sending?a?request?and?getting?an?acknowledgement

syncLimit=5

#?the?directory?where?the?snapshot?is?stored.

#?do?not?use?/tmp?for?storage,?/tmp?here?is?just

#?example?sakes.

dataDir=C:\\zookeeper-3.4.5\\data

dataLogDir=C:\\zookeeper-3.4.5\\log

#?the?port?at?which?the?clients?will?connect

clientPort=2181

#

#?Be?sure?to?read?the?maintenance?section?of?the

#?administrator?guide?before?turning?on?autopurge.

#

#?http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance

#

#?The?number?of?snapshots?to?retain?in?dataDir

#autopurge.snapRetainCount=3

#?Purge?task?interval?in?hours

#?Set?to?"0"?to?disable?auto?purge?feature

#autopurge.purgeInterval=1

tickTime:這個(gè)時(shí)間是作為 Zookeeper 服務(wù)器之間或客戶端與服務(wù)器之間維持心跳的時(shí)間間隔列赎,也就是每個(gè) tickTime 時(shí)間就會發(fā)送一個(gè)心跳。

dataDir:顧名思義就是 Zookeeper 保存數(shù)據(jù)的目錄镐确,默認(rèn)情況下包吝,Zookeeper 將寫數(shù)據(jù)的日志文件也保存在這個(gè)目錄里。

dataLogDir:顧名思義就是 Zookeeper 保存日志文件的目錄

clientPort:這個(gè)端口就是客戶端連接 Zookeeper 服務(wù)器的端口源葫,Zookeeper 會監(jiān)聽這個(gè)端口诗越,接受客戶端的訪問請求。

當(dāng)這些配置項(xiàng)配置好后息堂,你現(xiàn)在就可以啟動(dòng) Zookeeper 了掺喻,啟動(dòng)后要檢查 Zookeeper 是否已經(jīng)在服務(wù),可以通過 netstat – ano 命令查看是否有你配置的 clientPort 端口號在監(jiān)聽服務(wù)储矩。

第二步:配置dubbo-admin的管理頁面感耙,方便我們管理頁面

(1)下載dubbo-admin-2.4.1.war包,在windows的tomcat部署持隧,先把dubbo-admin-2.4.1放在tomcat的webapps/ROOT下即硼,然后進(jìn)行解壓

(2)然后到webapps/ROOT/WEB-INF下,有一個(gè)dubbo.properties文件屡拨,里面指向Zookeeper?只酥,使用的是Zookeeper?的注冊中心,如圖所示:

[html]view plaincopy

dubbo.registry.address=zookeeper://127.0.0.1:2181

dubbo.admin.root.password=root

dubbo.admin.guest.password=guest

(3)然后啟動(dòng)tomcat服務(wù)呀狼,用戶名和密碼:root,并訪問服務(wù)裂允,顯示登陸頁面,說明dubbo-admin部署成功哥艇,如圖所示:

第三步:SpringMVC與Dubbo的整合绝编,這邊使用的Maven的管理項(xiàng)目

第一:我們先開發(fā)服務(wù)注冊的,就是提供服務(wù),項(xiàng)目結(jié)構(gòu)如圖所示:

(1)test-maven-api項(xiàng)目加入了一個(gè)服務(wù)接口十饥,代碼如下:

[java]view plaincopy

publicinterfaceTestRegistryService?{

publicString?hello(String?name);

}

(2)test-maven-console在pom.xml加入Dubbo和Zookeeper的jar包窟勃、引用test-maven-api的jar包,代碼如下:

[html]view plaincopy

cn.test

test-maven-api

0.0.1-SNAPSHOT

com.alibaba

dubbo

2.5.3

org.apache.zookeeper

zookeeper

3.4.6

com.github.sgroschupf

zkclient

0.1

(3)test-maven-console實(shí)現(xiàn)具體的服務(wù)逗堵,代碼如下:

[java]view plaincopy

@Service("testRegistryService")

publicclassTestRegistryServiceImplimplementsTestRegistryService?{

publicString?hello(String?name)?{

return"hello"+name;

}

}

(4)我們服務(wù)以及實(shí)現(xiàn)好了秉氧,這時(shí)要暴露服務(wù),代碼如下:

[html]view plaincopy


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:jee="http://www.springframework.org/schema/jee"

xmlns:tx="http://www.springframework.org/schema/tx"

xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans-3.1.xsd

http://www.springframework.org/schema/tx?http://www.springframework.org/schema/tx/spring-tx-3.1.xsd

http://www.springframework.org/schema/jee?http://www.springframework.org/schema/jee/spring-jee-3.1.xsd

http://code.alibabatech.com/schema/dubbo?http://code.alibabatech.com/schema/dubbo/dubbo.xsd

http://www.springframework.org/schema/context?http://www.springframework.org/schema/context/spring-context-3.1.xsd"

default-lazy-init="false">




說明:

dubbo:registry標(biāo)簽一些屬性的說明:

1)register是否向此注冊中心注冊服務(wù)蜒秤,如果設(shè)為false汁咏,將只訂閱,不注冊作媚。

2)check注冊中心不存在時(shí)攘滩,是否報(bào)錯(cuò)。

3)subscribe是否向此注冊中心訂閱服務(wù)掂骏,如果設(shè)為false轰驳,將只注冊厚掷,不訂閱弟灼。

4)timeout注冊中心請求超時(shí)時(shí)間(毫秒)。

5)address可以Zookeeper集群配置冒黑,地址可以多個(gè)以逗號隔開等田绑。

dubbo:service標(biāo)簽的一些屬性說明:

1)interface服務(wù)接口的路徑

2)ref引用對應(yīng)的實(shí)現(xiàn)類的Bean的ID

3)registry向指定注冊中心注冊,在多個(gè)注冊中心時(shí)使用抡爹,值為的id屬性掩驱,多個(gè)注冊中心ID用逗號分隔,如果不想將該服務(wù)注冊到任何registry冬竟,可將值設(shè)為N/A

4)register?默認(rèn)true?欧穴,該協(xié)議的服務(wù)是否注冊到注冊中心。

(5)啟動(dòng)項(xiàng)目泵殴,然后我們在Dubbo管理頁面上顯示涮帘,已經(jīng)暴露的服務(wù),但顯示還沒有消費(fèi)者笑诅,因?yàn)槲覀冞€沒實(shí)現(xiàn)消費(fèi)者服務(wù)调缨,如圖所示:

第二:我們在開發(fā)服務(wù)消費(fèi)者,就是調(diào)用服務(wù)吆你,我們在新建一個(gè)新的消費(fèi)者項(xiàng)目:

(1)test-maven-server-console的pom.xml引入Dubbo和Zookeeper的jar包弦叶、test-maven-api的jar包,因?yàn)橐雝est-maven-api的jar包妇多,我們在項(xiàng)目中調(diào)用像在本地調(diào)用一樣伤哺。代碼如下:

[html]view plaincopy

cn.test

test-maven-api

0.0.1-SNAPSHOT

com.alibaba

dubbo

2.5.3

org.apache.zookeeper

zookeeper

3.4.6

com.github.sgroschupf

zkclient

0.1

(2)test-maven-server-console項(xiàng)目的具體實(shí)現(xiàn),代碼如下:

[java]view plaincopy

@Controller

publicclassIndexController?{

@Autowired

privateTestRegistryService?testRegistryService;

@RequestMapping("/hello")

publicString?index(Model?model){

String?name=testRegistryService.hello("zz");

System.out.println("xx=="+name);

return"";

}

}

(3)我們要引用的地址,代碼如下:

[java]view plaincopy


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:jee="http://www.springframework.org/schema/jee"

xmlns:tx="http://www.springframework.org/schema/tx"

xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans-3.1.xsd

http://www.springframework.org/schema/tx?http://www.springframework.org/schema/tx/spring-tx-3.1.xsd

http://www.springframework.org/schema/jee?http://www.springframework.org/schema/jee/spring-jee-3.1.xsd

http://code.alibabatech.com/schema/dubbo?http://code.alibabatech.com/schema/dubbo/dubbo.xsd

http://www.springframework.org/schema/context?http://www.springframework.org/schema/context/spring-context-3.1.xsd"

default-lazy-init="false">



說明:

dubbo:reference的一些屬性的說明:

1)interface調(diào)用的服務(wù)接口

2)check?啟動(dòng)時(shí)檢查提供者是否存在默责,true報(bào)錯(cuò)贬循,false忽略

3)registry從指定注冊中心注冊獲取服務(wù)列表,在多個(gè)注冊中心時(shí)使用桃序,值為的id屬性杖虾,多個(gè)注冊中心ID用逗號分隔

4)loadbalance?負(fù)載均衡策略,可選值:random,roundrobin,leastactive媒熊,分別表示:隨機(jī)奇适,輪循,最少活躍調(diào)用

(4)項(xiàng)目啟動(dòng)芦鳍,Dubbo管理頁面嚷往,能看到消費(fèi)者,如圖所示:

(5)然后訪問消費(fèi)者項(xiàng)目柠衅,Controller層能像調(diào)用本地一樣調(diào)用服務(wù)的具體實(shí)現(xiàn)皮仁,如圖所示:

總結(jié):

經(jīng)過一系列的操作之后,我們感覺菲宴,的確很簡單贷祈,dubbo給我們封裝了很多操作,讓我們不需要過多考慮具體的實(shí)現(xiàn)細(xì)節(jié)喝峦,配置化生成咱們的應(yīng)用势誊,這樣的思想,現(xiàn)在在IT行業(yè)正在盛行谣蠢!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粟耻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子眉踱,更是在濱河造成了極大的恐慌挤忙,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谈喳,死亡現(xiàn)場離奇詭異册烈,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)叁执,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門茄厘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谈宛,你說我怎么就攤上這事次哈。” “怎么了吆录?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵窑滞,是天一觀的道長。 經(jīng)常有香客問我,道長哀卫,這世上最難降的妖魔是什么巨坊? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮此改,結(jié)果婚禮上趾撵,老公的妹妹穿的比我還像新娘。我一直安慰自己共啃,他們只是感情好占调,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著移剪,像睡著了一般究珊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纵苛,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天剿涮,我揣著相機(jī)與錄音,去河邊找鬼攻人。 笑死取试,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贝椿。 我是一名探鬼主播想括,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼陷谱,長吁一口氣:“原來是場噩夢啊……” “哼烙博!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起烟逊,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤渣窜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后宪躯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乔宿,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年访雪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了详瑞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡臣缀,死狀恐怖坝橡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情精置,我是刑警寧澤计寇,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響番宁,放射性物質(zhì)發(fā)生泄漏元莫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一蝶押、第九天 我趴在偏房一處隱蔽的房頂上張望踱蠢。 院中可真熱鬧,春花似錦棋电、人聲如沸朽基。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稼虎。三九已至,卻和暖如春招刨,著一層夾襖步出監(jiān)牢的瞬間霎俩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工沉眶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留打却,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓谎倔,卻偏偏與公主長得像柳击,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子片习,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

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