Spring Boot初探(0)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?整理匯編者:文思

SpringBoot是伴隨著Spring4.0誕生的。

Spring?Boot主要特性:

(1)遵循“習(xí)慣優(yōu)于配置”的原則,使用Spring Boot只需要很少的配置,大部分的時(shí)候我們直接使用默認(rèn)的配置即可础拨。

(2)項(xiàng)目快速搭建闸与,可以無需配置的自動整合第三方的框架列牺。

(3)可以完全不使用XML配置文件涉兽,只需要自動配置和Java Config。

(4)內(nèi)嵌Servlet容器腹鹉,降低了對環(huán)境的要求,可以使用命令直接執(zhí)行項(xiàng)目敷硅,應(yīng)用可用jar包執(zhí)行:java -jar功咒。

(5)提供了starter POM,能夠非常方便的進(jìn)行包管理,很大程度上減少了jar hell或者dependencyhell愉阎。

(6)運(yùn)行中應(yīng)用狀態(tài)的監(jiān)控。

(7)對主流開發(fā)框架的無配置集成力奋。

(8)與云計(jì)算的天然繼承榜旦。

Spring?Boot核心功能:

(1)獨(dú)立運(yùn)行的Spring項(xiàng)目。

(2)內(nèi)嵌的Servlet容器景殷,內(nèi)嵌容器溅呢,使得我們可以執(zhí)行運(yùn)行項(xiàng)目的主程序main函數(shù),使項(xiàng)目的快速運(yùn)行猿挚。

(3)提供starter簡化Manen配置咐旧,Spring?Boot提供了一系列的starter pom用來簡化我們的Maven依賴,下邊是創(chuàng)建一個(gè)web項(xiàng)目中自動包含的依賴,使用的starter pom為:spring-boot-starter-web绩蜻,代替?zhèn)鹘y(tǒng)方式下的若干pom依賴铣墨。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

框架展開:

從字面理解,Boot是引導(dǎo)的意思办绝,因此SpringBoot幫助開發(fā)者快速搭建Spring框架:

Spring Boot更多的是采用Java?Config的方式伊约,對Spring進(jìn)行配置:

部署簡單:


監(jiān)控簡單:采用了spring-boot-start-actuator之后,直接以REST的方式孕蝉,獲取進(jìn)程的運(yùn)行期性能參數(shù)

不足之處:

常用EUREKA做服務(wù)注冊中心彌補(bǔ)

在實(shí)踐Spring Boot時(shí)學(xué)習(xí)重點(diǎn)碱妆,或者說思維方式改變的重點(diǎn)在于:

1)對于REST的理解,這一點(diǎn)尤為重要昔驱,需要從設(shè)計(jì)疹尾、開發(fā)多個(gè)角色達(dá)成共識,很多時(shí)候都是對于HTTP 1.1協(xié)議以及REST的精髓不理解骤肛,導(dǎo)致REST被「盲用」而產(chǎn)生一些不好的效果纳本。

2)對于YAML的理解和對于JavaConfig的理解,這兩點(diǎn)相對較為簡單腋颠,本質(zhì)上是簡化了xml文件繁成,并提供等價(jià)的配置表述能力。

總結(jié):

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

框架概述:

從最根本上來講淑玫,Spring?Boot就是一些庫的集合,為了簡化依賴圖巾腕,Boot的功能是模塊化的,通過導(dǎo)入Boot所謂的“starter”模塊絮蒿,可以將許多的依賴添加到工程之中,為了更容易地管理依賴版本和使用默認(rèn)配置尊搬,框架提供了一個(gè)parent POM,工程可以繼承它土涝。


其中:

在Maven依賴中引入了spring-boot-starter-web佛寿,它包含了Spring Boot預(yù)定義的一些Web開發(fā)的常用依賴:

spring-web,spring-webmvcSpring WebMvc框架

tomcat-embed-*內(nèi)嵌Tomcat容器

jackson處理json數(shù)據(jù)

spring-*Spring框架

spring-boot-autoconfigure:Spring Boot提供的自動配置功能


為了快速地搭建和運(yùn)行Boot工程,Pivotal提供了稱之為“Spring?Initializr”的web界面但壮,用于下載預(yù)先定義好的Maven或Gradle構(gòu)建配置,訪問http://start.spring.io/即可.我們也可以使用Lazybones模板實(shí)現(xiàn)快速起步(略)冀泻。

應(yīng)用可以通過spring run App.groovy命令在Spring Boot CLI中運(yùn)行常侣。Boot會分析文件并根據(jù)各種“編譯器自動配置(compiler auto-configuration)”標(biāo)示符來確定其意圖是生成Web應(yīng)用命贴。然后但两,它會在一個(gè)嵌入式的Tomcat中啟動Spring應(yīng)用上下文,并且使用默認(rèn)的8080端口羽嫡。打開瀏覽器并導(dǎo)航到給定的URL肢专,隨后將會加載一個(gè)頁面并展現(xiàn)簡單的文本響應(yīng):“hello”巾乳。提供默認(rèn)應(yīng)用上下文以及嵌入式容器的這些過程,能夠讓開發(fā)人員更加關(guān)注于開發(fā)應(yīng)用以及業(yè)務(wù)邏輯鸟召,從而不用再關(guān)心繁瑣的樣板式配置胆绊。日常開發(fā)中一般使用:run as -->java application或者spring boot app


直接運(yùn)行MainApplication和在BootDashboard中運(yùn)行是一樣的

@SpringBootApplication

@EnableAutoConfiguration

@EnableDiscoveryClient

@EnableFeignClients

@RestController

public class MainApplication {

? ? ? ?public staticvoid main(String[] args) {

? ? ? ? ? ? ?SpringApplication.run(MainApplication.class,args);

? ? ? ?}

? ? ? @RequestMapping("/")

? ? ? ? ?public Stringindex(){

? ? ? ? ? ? ? ?return "hello world!";

? ? ? ? ? }

? ? @RequestMapping("/test")

? ? ?public Stringtest(){

? ? ? ? ?return "test MainApplication!";

? ? ?}

在Application類上的@EnableAutoConfiguration注解會告知Boot要采用一種特定的方式來對應(yīng)用進(jìn)行配置。這種方法會將其他樣板式的配置均假設(shè)為框架默認(rèn)的約定欧募,因此能夠聚焦于如何盡快地使應(yīng)用準(zhǔn)備就緒以便運(yùn)行起來压状。Application類是可運(yùn)行的,因此跟继,當(dāng)我們以Java Application的方式運(yùn)行這個(gè)類時(shí)种冬,就能啟動該應(yīng)用及其嵌入式的容器,這樣也能實(shí)現(xiàn)即時(shí)地開發(fā)舔糖。

Java代碼中沒有任何配置娱两,和傳統(tǒng)的Spring應(yīng)用相比,多了兩個(gè)我們不認(rèn)識的符號:

@EnableAutoConfiguration和@SpringApplication

它們都是由Spring?Boot框架提供金吗。在SpringApplication.run()方法執(zhí)行后十兢,Spring Boot的autoconfigure發(fā)現(xiàn)這是一個(gè)Web應(yīng)用(根據(jù)類路徑上的依賴確定),Spring?Context中根據(jù)默認(rèn)的約定配置了Spring WebMvc:

Servlet容器默認(rèn)的Context路徑是/

DispatherServlet匹配的路徑(servlet-mapping中的url-patterns)是/*

@ComponentScan路徑被默認(rèn)設(shè)置為SampleController的同名package摇庙,也就是該package下的所有@Controller旱物,@Service,@Component,@Repository都會被實(shí)例化后并加入Spring Context中

沒有一行配置代碼、也沒有web.xml卫袒∠海基于Spring Boot的應(yīng)用在大多數(shù)情況下都不需要我們?nèi)ワ@式地聲明各類配置,而是將最常用的默認(rèn)配置作為約定夕凝,在不聲明的情況下也能適應(yīng)大多數(shù)的開發(fā)場景宝穗。

開發(fā)微服務(wù)

Boot對Spring應(yīng)用的開發(fā)進(jìn)行了簡化,提供了模塊化方式導(dǎo)入依賴的能力码秉,強(qiáng)調(diào)了開發(fā)RESTful Web服務(wù)的功能并提供了生成可運(yùn)行jar的能力逮矛,這一切都清晰地表明在開發(fā)可部署的微服務(wù)方面Boot框架是一個(gè)強(qiáng)大的工具。

在開發(fā)微服務(wù)應(yīng)用時(shí)泡徙,需要特別注意的一點(diǎn)是使用了@RequestMapping注解橱鹏。這不是Boot特定的注解。不過堪藐,因?yàn)锽oot安裝了自己的端點(diǎn)以監(jiān)控應(yīng)用的性能莉兰、健康情況以及配置,所以需要確保應(yīng)用的代碼不要與這些內(nèi)置的提供詳情的路徑解析相沖突礁竞。

@RequestMapping("/configprops/test") //這是十分錯誤的糖荒,與http get/configprops查看配置屬性路徑?jīng)_突

public String testApplicationProperties(){

? ? ? ? ? ? ? ?return applicationProper.mapperidentity;

}

可看到,采用了spring-boot-start-actuator之后模捂,直接以REST的方式捶朵,獲取進(jìn)程的運(yùn)行期性能參數(shù)。所以要避免在RequestMapping中路徑?jīng)_突.

加入actuator依賴后狂男,應(yīng)用啟動后會創(chuàng)建一些基于Web的Endpoint:

/autoconfig综看,用來查看Spring Boot的框架自動配置信息,哪些被自動配置岖食,哪些沒有红碑,原因是什么。

/beans泡垃,顯示應(yīng)用上下文的Bean列表

/dump析珊,顯示線程dump信息

/health,應(yīng)用健康狀況檢查

/metrics

/shutdown,默認(rèn)沒有打開

/trace

數(shù)據(jù)訪問

在傳統(tǒng)的Spring應(yīng)用中蔑穴,訪問數(shù)據(jù)庫我們需要配置:

類路徑上添加數(shù)據(jù)庫訪問驅(qū)動

實(shí)例化DataSource對象忠寻,指定數(shù)據(jù)庫url,username,password等信息

注入JdbcTemplate對象,如果使用Hibernate存和,Mybatis等框架奕剃,還需要進(jìn)一步配置框架信息

在Spring?Boot中,上述過程會被簡化捐腿。首先在Maven項(xiàng)目依賴中定義:

spring-boot-starter-jdbc引入了spring-jdbc依賴祭饭,h2是一個(gè)內(nèi)存關(guān)系型數(shù)據(jù)庫。在引入了這些依賴并啟動Spring Boot應(yīng)用程序后叙量,autoconfigure發(fā)現(xiàn)spring-jdbc位于類路徑中倡蝙,于是根據(jù)類路徑上的JDBC驅(qū)動類型(這里是h2,預(yù)定義了derby,sqlite, mysql, oracle, sqlserver等等)绞佩,創(chuàng)建一個(gè)DataSource連接池對象寺鸥,本例中的h2是內(nèi)存數(shù)據(jù)庫,無需任何配置品山,如果是mysql, oracle等類型的數(shù)據(jù)庫需要開發(fā)者配置相關(guān)信息胆建。

在SpringContext中創(chuàng)建一個(gè)JdbcTemplate對象(使用DataSource初始化)接下來開發(fā)者的工作就非常簡單了,在業(yè)務(wù)邏輯中直接引入JdbcTemplate即可:

除了spring-jdbc肘交,Spring Boot還能夠支持JPA笆载,以及各種NoSQL數(shù)據(jù)庫——包括MongoDB。

spring-boot-starter-data-jpa包含進(jìn)來,Boot的自動配置引擎就能探測到你的工程需要數(shù)據(jù)訪問功能,凉驻,并且會在Spring應(yīng)用上下文中創(chuàng)建必要的Bean腻要,這樣你就可以使用Repository和服務(wù)了。

CrudRepository提供了一些通用的接口方法來創(chuàng)建涝登、查詢雄家、更新以及刪除對象和對象集合。應(yīng)用所需的其他特定功能可以按照Spring Data的Repository開發(fā)約定進(jìn)行定義胀滚。一旦UserRepository接口創(chuàng)建成功趟济,Boot的spring-data-jpa層會在工程中探測到它,并將其添加到Spring應(yīng)用上下文之中咽笼,這樣對于controller和sevice對象來說顷编,它就成為可以進(jìn)行自動注入的可選對象。這種自動化的配置只有在Boot應(yīng)用要求按照這種方式初始化的時(shí)候才生效剑刑,這是通過存在@EnableAutoConfiguration注解來標(biāo)識的媳纬。

微服務(wù)所提供的數(shù)據(jù)并不一定全部適合關(guān)系型結(jié)構(gòu),針對這一點(diǎn)Spring Boot也暴露了一些模塊叛甫,從而讓開發(fā)人員可以使用Spring Data的MongoDB和Redis項(xiàng)目层宫,不過依然采取特定的方式來進(jìn)行配置。Spring Data用來定義數(shù)據(jù)訪問對象(Data Access Object)的高層框架其监,這樣快速切換JPA與非JPA數(shù)據(jù)源會變得非常容易萌腿。

public interface UserRepository extendsMongoRepository {

}

MongoRepository接口也擴(kuò)展了CrudRepository,因此微服務(wù)的Controller代碼抖苦,也就是程序清單1.8所示并不需要修改毁菱。為了實(shí)現(xiàn)與MongoDB的集成,工程唯一要做的就是在應(yīng)用的classpath中包含spring-boot-starter-data-mongodb

配置

默認(rèn)情況下Spring Boot加載類路徑上的application.properties或application.yml文件锌历,我們也可以很快地重寫Spring Boot的默認(rèn)配置贮庞。默認(rèn)情況下,應(yīng)用的配置可以使用Java屬性文件來進(jìn)行定義究西,這個(gè)文件名為application.properties并且位于應(yīng)用的classpath根目錄下窗慎。不過,一種更好的方式是使用YAML配置卤材,它提供了結(jié)構(gòu)化以及嵌套的配置遮斥。在應(yīng)用的運(yùn)行時(shí)類路徑之中包含snakeyaml之后,你的工程就可以在application.yml文件中直接定義配置了扇丛。但我個(gè)人仍然喜歡用application.properties.

spring.datasource.url=jdbc:mysql://localhost/test

spring.datasource.username=dbuser

spring.datasource.password=dbpass

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

微服務(wù)必須要支持的很重要的一點(diǎn)就是外部化配置术吗。這種配置可以包含任何的內(nèi)容. Boot一個(gè)很棒的特性在于它能管理外部化的配置并將其轉(zhuǎn)換為對象結(jié)構(gòu),這個(gè)對象可以在整個(gè)應(yīng)用上下文中使用帆精。創(chuàng)建一個(gè)簡單老式的Java/Groovy對象(Plain Old Java/Groovy Object)较屿,并使用@ConfigurationProperties注解隧魄,那么這個(gè)對象就能使用Boot配置結(jié)構(gòu)中預(yù)先定義的name名下的配置項(xiàng)。

@PropertySource(value ="application.properties")

@Configuration

public class ApplicationProperties {

? ? ? ?@Value("${test}")

? ? ? ? public String test;

? ? ? ? ?publicString getTest() {

? ? ? ? ? ? ? returntest;

? ? ? ? ? }

? ? ? ? ?public void setTest(String test) {

? ? ? ? ? ? ? ? ?this.test= test;

? ? ? ? ? }

}

當(dāng)ApplicationProperties對象在Spring上下文中創(chuàng)建完成之后隘蝎,Boot將會識別出它是一個(gè)配置對象购啄,并且會按照運(yùn)行時(shí)classpath之中application.properties或application.yml文件中的配置指令填充它的屬性。因此末贾,如果我們在微服務(wù)的application.yml文件中添加application內(nèi)容區(qū)的話闸溃,如程序清單1.16所示整吆,那么我們就可以在應(yīng)用的其他部分以編程的方式訪問這些配置指令

public class MainApplication {

? ? ? @Autowired

? ? ? ?private ApplicationPropertiesapplicationProper;

? ? ? ?publicstatic void main(String[] args) {

? ? ? ? ? ? ?SpringApplication.run(MainApplication.class,args);

? ? ? ?}

? ? ? ?@RequestMapping("/testApplicationProperties")

? ? ? ? publicString testApplicationProperties(){

? ? ? ? ? ? return applicationProper.test;

? ? ? ?}

}

配置類也支持嵌套式的對象圖拱撵,這樣來自于配置中的深層數(shù)據(jù)就能更便利地進(jìn)行訪問,也有了更好的語義表蝙。例如拴测,如果我們想要得到的配置指令是application.根下的那些metrics key,那么可以在ApplicationPropertiesPOGO中添加一個(gè)嵌套對象來表示府蛇。注解必須先使用@Configuration集索,將此類聲明為配置類型。且必須有set,get方法汇跨,遵循傳統(tǒng)pojo屬性查找模式

安全

在微服務(wù)的開發(fā)中务荆,對于完備安全場景的需求會持續(xù)增長。為了滿足這種需求穷遂,Boot引入了強(qiáng)大完整的Spring Security函匕,并且提供了自動配置的功能,以快速簡便地啟用安全層蚪黑。只需在應(yīng)用的classpath中包含spring-boot-starter-security模塊就能使Boot引入一些安全特性盅惜,如跨站腳本防護(hù)(cross-site scripting

protection)并且會添加頭信息以防止點(diǎn)擊劫持(click-jacking)。除此之外忌穿,添加一條簡單的配置指令就能啟用基本認(rèn)證來保護(hù)你的應(yīng)用

使用略

消息集成

Boot并沒有提供明確的Spring上下文自動化配置抒寂,但是它為Spring Integration提供了一個(gè)starter模塊,它會負(fù)責(zé)引入Spring Integration項(xiàng)目的一系列依賴掠剑。這些依賴包括Spring

Integration的核心庫(Core library)屈芜、HTTP模塊(用來進(jìn)行面向HTTP的企業(yè)集成)、IP模塊(用來進(jìn)行基于Socket的集成操作)朴译、File模塊(用于進(jìn)行文件系統(tǒng)集成)以及Stream模塊(用于支持使用Stream的操作井佑,如stdin和stdout)。這個(gè)starter模塊為開發(fā)人員提供了健壯的消息功能的工具集动分,可以使已有的基礎(chǔ)設(shè)施適應(yīng)微服務(wù)APIs

使用略

提供度量指標(biāo)

使用略

@EnableAutoCongiguration

從Spring 3.0開始毅糟,為了替代繁瑣的XML配置,引入了@Enable...注解對@Configuration類進(jìn)行修飾以達(dá)到和XML配置相同的效果澜公。想必不少開發(fā)者已經(jīng)使用過類似注解:

@EnableTransactionManagement開啟Spring事務(wù)管理姆另,相當(dāng)于XMl中的

@EnableWebMvc使用Spring MVC框架的一些默認(rèn)配置

@EnableScheduling會初始化一個(gè)Scheduler用于執(zhí)行定時(shí)任務(wù)和異步任務(wù)

Spring Boot提供的@EnableAutoCongiguration似乎功能更加強(qiáng)大喇肋,一旦加上,上述所有的配置似乎都被包含進(jìn)來而無需開發(fā)者顯式聲明迹辐。

它究竟是如何做到的呢蝶防,先看看它的定義:

為了添加生產(chǎn)環(huán)境特性支持,需要在Maven依賴中引入:

加入actuator依賴后明吩,應(yīng)用啟動后會創(chuàng)建一些基于Web的Endpoint:

/autoconfig间学,用來查看Spring Boot的框架自動配置信息,哪些被自動配置印荔,哪些沒有低葫,原因是什么。

/beans仍律,顯示應(yīng)用上下文的Bean列表

/dump嘿悬,顯示線程dump信息

/health,應(yīng)用健康狀況檢查

/metrics

/shutdown,默認(rèn)沒有打開

/trace

下一節(jié)將進(jìn)入Spring Boot正式學(xué)習(xí)講解階段.如果您覺得這篇文章對您有幫助水泉,就請贊賞支持善涨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市草则,隨后出現(xiàn)的幾起案子钢拧,更是在濱河造成了極大的恐慌,老刑警劉巖炕横,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件源内,死亡現(xiàn)場離奇詭異,居然都是意外死亡看锉,警方通過查閱死者的電腦和手機(jī)姿锭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伯铣,“玉大人呻此,你說我怎么就攤上這事∏还眩” “怎么了焚鲜?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長放前。 經(jīng)常有香客問我忿磅,道長,這世上最難降的妖魔是什么凭语? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任葱她,我火速辦了婚禮,結(jié)果婚禮上似扔,老公的妹妹穿的比我還像新娘吨些。我一直安慰自己搓谆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布豪墅。 她就那樣靜靜地躺著泉手,像睡著了一般。 火紅的嫁衣襯著肌膚如雪偶器。 梳的紋絲不亂的頭發(fā)上斩萌,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機(jī)與錄音屏轰,去河邊找鬼颊郎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛亭枷,可吹牛的內(nèi)容都是我干的袭艺。 我是一名探鬼主播搀崭,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼叨粘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瘤睹?” 一聲冷哼從身側(cè)響起升敲,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎轰传,沒想到半個(gè)月后驴党,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡获茬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年港庄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恕曲。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鹏氧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出佩谣,到底是詐尸還是另有隱情把还,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布茸俭,位于F島的核電站吊履,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏调鬓。R本人自食惡果不足惜艇炎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腾窝。 院中可真熱鬧缀踪,春花似錦腺晾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至托慨,卻和暖如春鼻由,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背厚棵。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工蕉世, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人婆硬。 一個(gè)月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓狠轻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親彬犯。 傳聞我的和親對象是個(gè)殘疾皇子向楼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

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