2021-01-07

[TOC]


注意一下咯:更多關(guān)于Java集合、JVM耀态、多線程并發(fā)轮傍、spring原理、微服務(wù)首装、Netty 與RPC 创夜、Kafka、日記仙逻、設(shè)計(jì)模式驰吓、Java算法、數(shù)據(jù)庫桨醋、Zookeeper棚瘟、分布式緩存、數(shù)據(jù)結(jié)構(gòu)等等

1喜最、為什么要用Dubbo偎蘸?

隨著服務(wù)化的進(jìn)一步發(fā)展,服務(wù)越來越多瞬内,服務(wù)之間的調(diào)用和依賴關(guān)系也越來越復(fù)雜迷雪,誕生了面向服務(wù)的架構(gòu)體系(SOA),

也因此衍生出了一系列相應(yīng)的技術(shù)虫蝶,如對服務(wù)提供章咧、服務(wù)調(diào)用、連接處理能真、通信協(xié)議赁严、序列化方式、服務(wù)發(fā)現(xiàn)粉铐、服務(wù)路由疼约、日志輸出等行為進(jìn)行封裝的服務(wù)框架。

就這樣為分布式系統(tǒng)的服務(wù)治理框架就出現(xiàn)了蝙泼,Dubbo也就這樣產(chǎn)生了程剥。

2、Dubbo 的整體架構(gòu)設(shè)計(jì)有哪些分層?

接口服務(wù)層(Service):該層與業(yè)務(wù)邏輯相關(guān)汤踏,根據(jù) provider 和 consumer 的業(yè)務(wù)設(shè)計(jì)對應(yīng)的接口和實(shí)現(xiàn)

配置層(Config):對外配置接口织鲸,以 ServiceConfig 和 ReferenceConfig 為中心

服務(wù)代理層(Proxy):服務(wù)接口透明代理舔腾,生成服務(wù)的客戶端 Stub 和 服務(wù)端的 Skeleton,以 ServiceProxy 為中心搂擦,擴(kuò)展接口為 ProxyFactory

服務(wù)注冊層(Registry):封裝服務(wù)地址的注冊和發(fā)現(xiàn)稳诚,以服務(wù) URL 為中心,擴(kuò)展接口為 RegistryFactory盾饮、Registry采桃、RegistryService

路由層(Cluster):封裝多個(gè)提供者的路由和負(fù)載均衡,并橋接注冊中心丘损,以Invoker 為中心,擴(kuò)展接口為 Cluster工扎、Directory徘钥、Router和LoadBlancce

監(jiān)控層(Monitor):RPC調(diào)用次數(shù)和調(diào)用時(shí)間監(jiān)控,以 Statistics 為中心肢娘,擴(kuò)展接口為 MonitorFactory呈础、Monitor和MonitorService

遠(yuǎn)程調(diào)用層(Protocal):封裝 RPC 調(diào)用,以 Invocation 和 Result 為中心橱健,擴(kuò)展接口為 Protocal而钞、Invoker和Exporter

信息交換層(Exchange):封裝請求響應(yīng)模式,同步轉(zhuǎn)異步拘荡。以 Request 和 Response 為中心臼节,擴(kuò)展接口為 Exchanger、ExchangeChannel珊皿、ExchangeClient和ExchangeServer

網(wǎng)絡(luò)傳輸層(Transport):抽象 mina 和 netty 為統(tǒng)一接口网缝,以 Message 為中心,擴(kuò)展接口為Channel蟋定、Transporter粉臊、Client、Server和Codec

數(shù)據(jù)序列化層(Serialize):可復(fù)用的一些工具驶兜,擴(kuò)展接口為Serialization扼仲、 ObjectInput、ObjectOutput和ThreadPool

3抄淑、默認(rèn)使用的是什么通信框架屠凶,還有別的選擇嗎?

默認(rèn)也推薦使用netty框架,還有mina蝇狼。

4阅畴、服務(wù)調(diào)用是阻塞的嗎?

默認(rèn)是阻塞的迅耘,可以異步調(diào)用贱枣,沒有返回值的可以這么做监署。

Dubbo 是基于 NIO 的非阻塞實(shí)現(xiàn)并行調(diào)用,客戶端不需要啟動(dòng)多線程即可完成并行調(diào)用多個(gè)遠(yuǎn)程服務(wù)纽哥,相對多線程開銷較小钠乏,異步調(diào)用會(huì)返回一個(gè) Future 對象。

5春塌、一般使用什么注冊中心晓避?還有別的選擇嗎?

推薦使用 Zookeeper 作為注冊中心只壳,還有 Redis俏拱、Multicast、Simple 注冊中心吼句,但不推薦锅必。

6、默認(rèn)使用什么序列化框架惕艳,你知道的還有哪些搞隐?

推薦使用Hessian序列化,還有Duddo远搪、FastJson劣纲、Java自帶序列化。

7谁鳍、服務(wù)提供者能實(shí)現(xiàn)失效踢出是什么原理癞季?

服務(wù)失效踢出基于zookeeper的臨時(shí)節(jié)點(diǎn)原理。

8棠耕、服務(wù)上線怎么不影響舊版本余佛?

采用多版本開發(fā),不影響舊版本窍荧。

9辉巡、如何解決服務(wù)調(diào)用鏈過長的問題?

可以結(jié)合zipkin實(shí)現(xiàn)分布式服務(wù)追蹤蕊退。

10郊楣、說說核心的配置有哪些?

| 配置 | 配置說明 |

| --- | --- |

| dubbo:service | 服務(wù)配置 |

| dubbo:reference | 引用配置 |

| dubbo:protocol | 協(xié)議配置 |

| dubbo:application | 應(yīng)用配置 |

| dubbo:module | 模塊配置 |

| dubbo:registry | 注冊中心配置 |

| dubbo:monitor | 監(jiān)控中心配置 |

| dubbo:provider | 提供方配置 |

| dubbo:consumer | 消費(fèi)方配置 |

| dubbo:method | 方法配置 |

| dubbo:argument | 參數(shù)配置 |

11瓤荔、Dubbo 推薦用什么協(xié)議净蚤?

· dubbo://(推薦)

· rmi://

· hessian://

· http://

· webservice://

· thrift://

· memcached://

· redis://

· rest://

12、同一個(gè)服務(wù)多個(gè)注冊的情況下可以直連某一個(gè)服務(wù)嗎输硝?

可以點(diǎn)對點(diǎn)直連今瀑,修改配置即可,也可以通過telnet直接某個(gè)服務(wù)。

13橘荠、畫一畫服務(wù)注冊與發(fā)現(xiàn)的流程圖屿附?

image.png

14、Dubbo 集群容錯(cuò)有幾種方案哥童?

| 集群容錯(cuò)方案 | 說明 |

| --- | --- |

| Failover Cluster | 失敗自動(dòng)切換挺份,自動(dòng)重試其它服務(wù)器(默認(rèn)) |

| Failfast Cluster | 快速失敗,立即報(bào)錯(cuò)贮懈,只發(fā)起一次調(diào)用 |

| Failsafe Cluster | 失敗安全匀泊,出現(xiàn)異常時(shí),直接忽略 |

| Failback Cluster | 失敗自動(dòng)恢復(fù)朵你,記錄失敗請求各聘,定時(shí)重發(fā) |

| Forking Cluster | 并行調(diào)用多個(gè)服務(wù)器,只要一個(gè)成功即返回 |

| Broadcast Cluster | 廣播逐個(gè)調(diào)用所有提供者撬呢,任意一個(gè)報(bào)錯(cuò)則報(bào)錯(cuò) |

15伦吠、Dubbo 服務(wù)降級,失敗重試怎么做魂拦?

可以通過dubbo:reference 中設(shè)置 mock="return null"。mock 的值也可以修改為 true搁嗓,然后再跟接口同一個(gè)路徑下實(shí)現(xiàn)一個(gè) Mock 類芯勘,命名規(guī)則是 “接口名稱+Mock” 后綴。然后在 Mock 類里實(shí)現(xiàn)自己的降級邏輯

16腺逛、Dubbo 使用過程中都遇到了些什么問題荷愕?

在注冊中心找不到對應(yīng)的服務(wù),檢查service實(shí)現(xiàn)類是否添加了@service注解 無法連接到注冊中心,檢查配置文件中的對應(yīng)的測試ip是否正確

17、Dubbo Monitor 實(shí)現(xiàn)原理棍矛?

Consumer端在發(fā)起調(diào)用之前會(huì)先走filter鏈安疗;provider端在接收到請求時(shí)也是先走filter鏈,然后才進(jìn)行真正的業(yè)務(wù)邏輯處理够委。

默認(rèn)情況下荐类,在consumer和provider的filter鏈中都會(huì)有Monitorfilter。

1茁帽、MonitorFilter向DubboMonitor發(fā)送數(shù)據(jù) 2玉罐、DubboMonitor將數(shù)據(jù)進(jìn)行聚合后(默認(rèn)聚合1min中的統(tǒng)計(jì)數(shù)據(jù))暫存到ConcurrentMap<Statistics, AtomicReference> statisticsMap,然后使用一個(gè)含有3個(gè)線程(線程名字:DubboMonitorSendTimer)的線程池每隔1min鐘潘拨,調(diào)用SimpleMonitorService遍歷發(fā)送statisticsMap中的統(tǒng)計(jì)數(shù)據(jù)吊输,每發(fā)送完畢一個(gè),就重置當(dāng)前的Statistics的AtomicReference 3铁追、SimpleMonitorService將這些聚合數(shù)據(jù)塞入BlockingQueue queue中(隊(duì)列大寫為100000) 4季蚂、SimpleMonitorService使用一個(gè)后臺(tái)線程(線程名為:DubboMonitorAsyncWriteLogThread)將queue中的數(shù)據(jù)寫入文件(該線程以死循環(huán)的形式來寫) 5、SimpleMonitorService還會(huì)使用一個(gè)含有1個(gè)線程(線程名字:DubboMonitorTimer)的線程池每隔5min鐘,將文件中的統(tǒng)計(jì)數(shù)據(jù)畫成圖表

18扭屁、Dubbo 用到哪些設(shè)計(jì)模式算谈?

Dubbo框架在初始化和通信過程中使用了多種設(shè)計(jì)模式,可靈活控制類加載疯搅、權(quán)限控制等功能濒生。

工廠模式 Provider在export服務(wù)時(shí),會(huì)調(diào)用ServiceConfig的export方法幔欧。ServiceConfig中有個(gè)字段:

private static final Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();

Dubbo里有很多這種代碼罪治。這也是一種工廠模式,只是實(shí)現(xiàn)類的獲取采用了JDK SPI的機(jī)制礁蔗。這么實(shí)現(xiàn)的優(yōu)點(diǎn)是可擴(kuò)展性強(qiáng)觉义,想要擴(kuò)展實(shí)現(xiàn),只需要在classpath下增加個(gè)文件就可以了浴井,代碼零侵入晒骇。另外,像上面的Adaptive實(shí)現(xiàn)磺浙,可以做到調(diào)用時(shí)動(dòng)態(tài)決定調(diào)用哪個(gè)實(shí)現(xiàn)洪囤,但是由于這種實(shí)現(xiàn)采用了動(dòng)態(tài)代理,會(huì)造成代碼調(diào)試比較麻煩撕氧,需要分析出實(shí)際調(diào)用的實(shí)現(xiàn)類瘤缩。

裝飾器模式 Dubbo在啟動(dòng)和調(diào)用階段都大量使用了裝飾器模式。以Provider提供的調(diào)用鏈為例伦泥,具體的調(diào)用鏈代碼是在ProtocolFilterWrapper的buildInvokerChain完成的剥啤,具體是將注解中含有g(shù)roup=provider的Filter實(shí)現(xiàn),按照order排序不脯,最后的調(diào)用順序是:

EchoFilter -> ClassLoaderFilter -> GenericFilter -> ContextFilter -> ExecuteLimitFilter -> TraceFilter -> TimeoutFilter -> MonitorFilter -> ExceptionFilter

更確切地說府怯,這里是裝飾器和責(zé)任鏈模式的混合使用。例如防楷,EchoFilter的作用是判斷是否是回聲測試請求牺丙,是的話直接返回內(nèi)容,這是一種責(zé)任鏈的體現(xiàn)域帐。而像ClassLoaderFilter則只是在主功能上添加了功能赘被,更改當(dāng)前線程的ClassLoader,這是典型的裝飾器模式肖揣。

觀察者模式 Dubbo的Provider啟動(dòng)時(shí)民假,需要與注冊中心交互,先注冊自己的服務(wù)龙优,再訂閱自己的服務(wù)羊异,訂閱時(shí)事秀,采用了觀察者模式,開啟一個(gè)listener野舶。注冊中心會(huì)每5秒定時(shí)檢查是否有服務(wù)更新易迹,如果有更新,向該服務(wù)的提供者發(fā)送一個(gè)notify消息平道,provider接受到notify消息后睹欲,即運(yùn)行NotifyListener的notify方法,執(zhí)行監(jiān)聽器方法一屋。

動(dòng)態(tài)代理模式 Dubbo擴(kuò)展JDK SPI的類ExtensionLoader的Adaptive實(shí)現(xiàn)是典型的動(dòng)態(tài)代理實(shí)現(xiàn)窘疮。Dubbo需要靈活地控制實(shí)現(xiàn)類,即在調(diào)用階段動(dòng)態(tài)地根據(jù)參數(shù)決定調(diào)用哪個(gè)實(shí)現(xiàn)類冀墨,所以采用先生成代理類的方法闸衫,能夠做到靈活的調(diào)用。生成代理類的代碼是ExtensionLoader的createAdaptiveExtensionClassCode方法诽嘉。代理類的主要邏輯是蔚出,獲取URL參數(shù)中指定參數(shù)的值作為獲取實(shí)現(xiàn)類的key。

19虫腋、Dubbo 配置文件是如何加載到Spring中的骄酗?

Spring容器在啟動(dòng)的時(shí)候,會(huì)讀取到Spring默認(rèn)的一些schema以及Dubbo自定義的schema悦冀,每個(gè)schema都會(huì)對應(yīng)一個(gè)自己的NamespaceHandler酥筝,NamespaceHandler里面通過BeanDefinitionParser來解析配置信息并轉(zhuǎn)化為需要加載的bean對象!

20雏门、Dubbo SPI 和 Java SPI 區(qū)別?

JDK SPI JDK 標(biāo)準(zhǔn)的 SPI 會(huì)一次性加載所有的擴(kuò)展實(shí)現(xiàn)掸掏,如果有的擴(kuò)展吃實(shí)話很耗時(shí)茁影,但也沒用上,很浪費(fèi)資源丧凤。

所以只希望加載某個(gè)的實(shí)現(xiàn)募闲,就不現(xiàn)實(shí)了

DUBBO SPI 1,對Dubbo進(jìn)行擴(kuò)展愿待,不需要改動(dòng)Dubbo的源碼 2浩螺,延遲加載,可以一次只加載自己想要加載的擴(kuò)展實(shí)現(xiàn)仍侥。 3要出,增加了對擴(kuò)展點(diǎn) IOC 和 AOP 的支持,一個(gè)擴(kuò)展點(diǎn)可以直接 setter 注入其它擴(kuò)展點(diǎn)农渊。 3患蹂,Dubbo的擴(kuò)展機(jī)制能很好的支持第三方IoC容器,默認(rèn)支持Spring Bean。

21传于、Dubbo 支持分布式事務(wù)嗎囱挑?

目前暫時(shí)不支持,可與通過 tcc-transaction框架實(shí)現(xiàn)

介紹:tcc-transaction是開源的TCC補(bǔ)償性分布式事務(wù)框架

TCC-Transaction 通過 Dubbo 隱式傳參的功能沼溜,避免自己對業(yè)務(wù)代碼的入侵平挑。

22、Dubbo 可以對結(jié)果進(jìn)行緩存嗎系草?

為了提高數(shù)據(jù)訪問的速度通熄。Dubbo提供了聲明式緩存,以減少用戶加緩存的工作量

<dubbo:reference cache="true" />

其實(shí)比普通的配置文件就多了一個(gè)標(biāo)簽 cache="true"

23悄但、服務(wù)上線怎么兼容舊版本棠隐?

可以用版本號(version)過渡,多個(gè)不同版本的服務(wù)注冊到注冊中心檐嚣,版本號不同的服務(wù)相互間不引用助泽。這個(gè)和服務(wù)分組的概念有一點(diǎn)類似。

24嚎京、Dubbo必須依賴的包有哪些嗡贺?

Dubbo 必須依賴 JDK,其他為可選鞍帝。

25诫睬、Dubbo telnet 命令能做什么?

dubbo服務(wù)發(fā)布之后帕涌,我們可以利用telnet命令進(jìn)行調(diào)試摄凡、管理。 Dubbo2.0.5以上版本服務(wù)提供端口支持telnet命令

連接服務(wù) telnet localhost 20880 //鍵入回車進(jìn)入Dubbo命令模式蚓曼。

查看服務(wù)列表

dubbo>lscom.test.TestServicedubbo>ls com.test.TestServicecreatedeletequery

· ls (list services and methods)

· ls : 顯示服務(wù)列表亲澡。

· ls -l : 顯示服務(wù)詳細(xì)信息列表。

· ls XxxService:顯示服務(wù)的方法列表纫版。

· ls -l XxxService:顯示服務(wù)的方法詳細(xì)信息列表床绪。

26、Dubbo 支持服務(wù)降級嗎其弊?

以通過dubbo:reference 中設(shè)置 mock="return null"癞己。mock 的值也可以修改為 true,然后再跟接口同一個(gè)路徑下實(shí)現(xiàn)一個(gè) Mock 類梭伐,命名規(guī)則是 “接口名稱+Mock” 后綴痹雅。然后在 Mock 類里實(shí)現(xiàn)自己的降級邏輯

27、Dubbo 如何優(yōu)雅停機(jī)籽御?

Dubbo 是通過 JDK 的 ShutdownHook 來完成優(yōu)雅停機(jī)的练慕,所以如果使用 kill -9 PID 等強(qiáng)制關(guān)閉指令惰匙,是不會(huì)執(zhí)行優(yōu)雅停機(jī)的,只有通過 kill PID 時(shí)铃将,才會(huì)執(zhí)行项鬼。

28、Dubbo 和 Dubbox 之間的區(qū)別劲阎?

Dubbox 是繼 Dubbo 停止維護(hù)后绘盟,當(dāng)當(dāng)網(wǎng)基于 Dubbo 做的一個(gè)擴(kuò)展項(xiàng)目,如加了服務(wù)可 Restful 調(diào)用悯仙,更新了開源組件等龄毡。

29、Dubbo 和 Spring Cloud 的區(qū)別锡垄?

根據(jù)微服務(wù)架構(gòu)在各方面的要素沦零,看看Spring Cloud和Dubbo都提供了哪些支持。

| | Dubbo | Spring Cloud |

| --- | --- | --- |

| 服務(wù)注冊中心 | Zookeeper | Spring Cloud Netflix Eureka |

| 服務(wù)調(diào)用方式 | RPC | REST API |

| 服務(wù)網(wǎng)關(guān) | 無 | Spring Cloud Netflix Zuul |

| 斷路器 | 不完善 | Spring Cloud Netflix Hystrix |

| 分布式配置 | 無 | Spring Cloud Config |

| 服務(wù)跟蹤 | 無 | Spring Cloud Sleuth |

| 消息總線 | 無 | Spring Cloud Bus |

| 數(shù)據(jù)流 | 無 | Spring Cloud Stream |

| 批量任務(wù) | 無 | Spring Cloud Task |

使用Dubbo構(gòu)建的微服務(wù)架構(gòu)就像組裝電腦货岭,各環(huán)節(jié)我們的選擇自由度很高路操,但是最終結(jié)果很有可能因?yàn)橐粭l內(nèi)存質(zhì)量不行就點(diǎn)不亮了,總是讓人不怎么放心千贯,但是如果你是一名高手屯仗,那這些都不是問題;而Spring Cloud就像品牌機(jī)搔谴,在Spring Source的整合下魁袜,做了大量的兼容性測試,保證了機(jī)器擁有更高的穩(wěn)定性敦第,但是如果要在使用非原裝組件外的東西峰弹,就需要對其基礎(chǔ)有足夠的了解。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芜果,一起剝皮案震驚了整個(gè)濱河市垮卓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌师幕,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诬滩,死亡現(xiàn)場離奇詭異霹粥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)疼鸟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進(jìn)店門后控,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人空镜,你說我怎么就攤上這事浩淘“破樱” “怎么了?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵张抄,是天一觀的道長砂蔽。 經(jīng)常有香客問我,道長署惯,這世上最難降的妖魔是什么左驾? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮极谊,結(jié)果婚禮上诡右,老公的妹妹穿的比我還像新娘。我一直安慰自己轻猖,他們只是感情好帆吻,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咙边,像睡著了一般猜煮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上样眠,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天友瘤,我揣著相機(jī)與錄音,去河邊找鬼檐束。 笑死辫秧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的被丧。 我是一名探鬼主播盟戏,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼甥桂!你這毒婦竟也來了柿究?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤黄选,失蹤者是張志新(化名)和其女友劉穎蝇摸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體办陷,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡貌夕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了民镜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啡专。...
    茶點(diǎn)故事閱讀 40,918評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖制圈,靈堂內(nèi)的尸體忽然破棺而出们童,到底是詐尸還是另有隱情畔况,我是刑警寧澤,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布慧库,位于F島的核電站跷跪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏完沪。R本人自食惡果不足惜域庇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望覆积。 院中可真熱鬧听皿,春花似錦、人聲如沸宽档。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吗冤。三九已至又厉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間椎瘟,已是汗流浹背覆致。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肺蔚,地道東北人煌妈。 一個(gè)月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像宣羊,于是被迫代替她去往敵國和親璧诵。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評論 2 361