Spring Boot(2.1.2.RELEASE) + Spring Cloud (Finchley.RELEASE)搭建服務(wù)注冊和發(fā)現(xiàn)組件Eureka

前言:由于版本原因棘利,部分關(guān)于Spring Cloud的書中使用的是Spring Boot 1.x 版本广料,很多配置或名稱在新版本中已經(jīng)發(fā)生了改變喇潘。此篇文章記錄的是使用較新的Spring Boot 2.x和Spring Cloud Finchley.RELEASE搭建服務(wù)注冊和發(fā)現(xiàn)組件Eureka的步驟(部分代碼以截圖形式展現(xiàn))嫩痰。

一铲掐、搭建Eureka

1. 編寫 Eureka Server

使用IDEA創(chuàng)建一個新的項目。

搭建Eureka服務(wù)注冊和發(fā)現(xiàn)組件1.png

選擇maven->Next(無需選擇maven模板)讯檐。

搭建Eureka服務(wù)注冊和發(fā)現(xiàn)組件2.png

填寫項目的GroupId(公司域名倒寫)和ArtifactId(項目名)

搭建Eureka服務(wù)注冊和發(fā)現(xiàn)組件3.png

檢查無誤后點擊Finish即可羡疗。

搭建Eureka服務(wù)注冊和發(fā)現(xiàn)組件4.png

刪除自動創(chuàng)建的src目錄。

編寫pom.xml文件别洪,添加Spring Boot(2.1.2.RELEASE)父項目和Spring Cloud(Finchley.RELEASE)的依賴叨恨。

注意:在添加Spring Cloud依賴時,必須指定type屬性為pom挖垛,否則maven會報錯痒钝。默認(rèn)情況下,type屬性為jar,但當(dāng)依賴的jar包特別多時蝎亚,會導(dǎo)致pom.xml文件過大剑令,這時我們可以將所有的jar包打成一個pom,然后去依賴這一個pom栋荸,就可以依賴所有的jar包。

搭建Eureka服務(wù)注冊和發(fā)現(xiàn)組件5.png

創(chuàng)建一個maven子模塊凭舶。鼠標(biāo)移到項目名上點擊鼠標(biāo)右鍵->New->Module晌块。

搭建Eureka服務(wù)注冊和發(fā)現(xiàn)組件6.png

仍然不用做任何選擇直接Next。

搭建Eureka服務(wù)注冊和發(fā)現(xiàn)組件7.png

填寫子模塊的ArtifactId為eureka-server帅霜,點擊Next匆背。

搭建Eureka服務(wù)注冊和發(fā)現(xiàn)組件8.png

填寫Module name檢查無誤后點擊Finish即可。

搭建Eureka服務(wù)注冊和發(fā)現(xiàn)組件9.png
搭建Eureka服務(wù)注冊和發(fā)現(xiàn)組件10.png

編寫子項目eureka-server的pom.xml文件身冀,添加spring-cloud-starter-netflix-eureka-server的依賴靠汁,當(dāng)前Spring Cloud版本為Finchley.RELEASE蜂大,其它版本如有不同可去mvnrepository查找對應(yīng)ArtifactId。

搭建Eureka服務(wù)注冊和發(fā)現(xiàn)組件11.png

在子模塊中創(chuàng)建Spring Boot啟動類EurekaServerApplication.java和配置文件application.yml(properties文件也可)蝶怔。

注意:啟動類應(yīng)放置在源碼包下奶浦。

搭建Eureka服務(wù)注冊和發(fā)現(xiàn)組件12.png

編寫啟動類。添加@SpringBootApplication和@EnableEurekaServer注解踢星。聲明這是一個Spring Boot啟動類同時也是一個Eureka Server澳叉。

編寫main方法。

搭建Eureka服務(wù)注冊和發(fā)現(xiàn)組件13.png

編寫配置文件application.yml沐悦。

搭建Eureka服務(wù)注冊和發(fā)現(xiàn)組件14.png

至此成洗,一個Eureka Server就編寫完成。

如果遇到了一些“意料之外”的錯誤藏否,可點擊IDEA右側(cè)的maven工具瓶殃,查看項目依賴是否有誤「鼻可嘗試刷新或重新打開項目遥椿。

搭建Eureka服務(wù)注冊和發(fā)現(xiàn)組件15.png

運(yùn)行啟動類的main方法,在瀏覽器中輸入application.yml中配置的地址(http://localhost:8761)即可查看此Eureka Server的相關(guān)信息淆储。

搭建Eureka服務(wù)注冊和發(fā)現(xiàn)組件16.png

可以看得該Instance currently registered with Eureka這一項還沒有任何內(nèi)容冠场,因為還沒有Eureka Client向該注冊中心注冊服務(wù)。下面就來編寫一個Eureka Client本砰。

2. 編寫 Eureka Client

與創(chuàng)建eureka-server模塊步驟相同碴裙。

創(chuàng)建一個maven子模塊。鼠標(biāo)移到項目名上點擊鼠標(biāo)右鍵->New->Module点额。仍然不用做任何選擇直接Next舔株。填寫子模塊的ArtifactId為eureka-client,點擊Next还棱。填寫Module name檢查無誤后點擊Finish即可载慈。

編寫子項目eureka-client的pom.xml文件。

添加spring-cloud-starter-netflix-eureka-client的依賴诱贿,當(dāng)前Spring Cloud版本為Finchley.RELEASE娃肿,其它版本如有不同可去mvnrepository查找對應(yīng)ArtifactId咕缎。

添加spring-boot-starter-web的依賴珠十,client必須添加該依賴,無需指定版本凭豪。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>eureka</artifactId>
        <groupId>cn.org.lilu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>eureka-client</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>2.1.2.RELEASE</version>
        </dependency>
    </dependencies>
</project>

創(chuàng)建Spring Boot啟動類EurekaClientApplication.java和配置文件application.yml(properties文件也可)焙蹭。

注意:啟動類應(yīng)放置在源碼包下。

編寫配置文件application.yml嫂伞。應(yīng)用服務(wù)名為eureka-client孔厉,端口號1234拯钻,服務(wù)注冊地址為http://localhost:8761/eureka/

server:
  port: 1234
spring:
  application:
    name: eureka-client
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

編寫啟動類撰豺。添加@EnableEurekaClient注解聲明這是一個Eureka Client粪般。

package cn.org.lilu;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * @Auther: lilu
 * @Date: 2019/6/28
 * @Description:
 */
@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class,args);
    }
}

至此,一個Eureka Client就編寫完成污桦。運(yùn)行EurekaClientApplication類的main方法亩歹。成功后控制臺會打印:

INFO 70912 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_EUREKA-CLIENT/localhost:eureka-client:1234 - registration status: 204

而Eureka Server端的控制臺會打臃渤鳌:

INFO 73316 --- [nio-8761-exec-5] c.n.e.registry.AbstractInstanceRegistry  : Registered instance EUREKA-CLIENT/localhost:eureka-client:1234 with status UP (replication=false)

此時Eureka Client已向Eureka Server注冊了小作,訪問http://localhost:8761,可看到Instance currently registered with Eureka這項下已有一個實例注冊稼钩。

搭建Eureka服務(wù)注冊和發(fā)現(xiàn)組件17

二顾稀、搭建高可用Eureka Server集群

1. 編寫雙節(jié)點Eureka Server集群

實際線上生產(chǎn)環(huán)境中,前文編寫的單節(jié)點Eureka Server可靠性不足坝撑。

Eureka Client會定時連接Eureka Server静秆,獲取服務(wù)注冊表中的信息并緩存到本地。微服務(wù)在消費(fèi)遠(yuǎn)程API時總是使用本地緩存中的數(shù)據(jù)绍载,因此一般情況下诡宗,即使單節(jié)點的Eureka Server發(fā)生宕機(jī),也不會影響到各微服務(wù)之間的調(diào)用击儡,但如果當(dāng)Eureka Server發(fā)生宕機(jī)時塔沃,某些微服務(wù)恰好也出現(xiàn)了不可用的情況,此時Eureka Client中的緩存并未進(jìn)行更新阳谍,仍然認(rèn)為服務(wù)可用蛀柴,就會影響到微服務(wù)之間的調(diào)用,甚至影響整個應(yīng)用系統(tǒng)的高可用性矫夯。因此鸽疾,生產(chǎn)環(huán)境中需要部署一個高可用Eureka Server集群。

Eureka Server可通過運(yùn)行多個實例并相互注冊的方式實現(xiàn)高可用训貌。集群中的多個實例會彼此增量的同步數(shù)據(jù)制肮,保證所有節(jié)點數(shù)據(jù)一致性。節(jié)點之間相互注冊是Eureka Server的默認(rèn)行為递沪,無需做任何配置豺鼻。

下面構(gòu)建一個雙節(jié)點Eureka Server集群。

創(chuàng)建一個maven子模塊款慨。鼠標(biāo)移到項目名上點擊鼠標(biāo)右鍵->New->Module儒飒。不做任何選擇直接Next。填寫子模塊的ArtifactId為eureka-server-cluster檩奠,點擊Next桩了。填寫Module name檢查無誤后點擊Finish即可附帽。

編寫子模塊eureka-server-cluster的pom.xml文件。

添加spring-cloud-starter-netflix-eureka-server的依賴井誉,當(dāng)前Spring Cloud版本為Finchley.RELEASE蕉扮,其它版本如有不同可去mvnrepository查找對應(yīng)ArtifactId。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>eureka</artifactId>
        <groupId>cn.org.lilu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>eureka-server-cluster</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            <version>2.1.2.RELEASE</version>
        </dependency>
    </dependencies>
</project>

創(chuàng)建Spring Boot啟動類EurekaServerClusterApplication.java和配置文件application.yml(properties文件也可)颗圣。

注意:啟動類應(yīng)放置在源碼包下慢显。

我們要在本地搭建Eureka Server集群環(huán)境,需要運(yùn)行多個Eureka Server實例欠啤,可采用多配置文件格式荚藻,在啟動時指定具體的配置文件。也可利用開發(fā)工具IDEA洁段,在啟動一個實例后应狱,修改配置文件再啟動另一個實例。這樣可以很方便地在本地環(huán)境進(jìn)行測試祠丝。

下面介紹利用開發(fā)工具IDEA啟動多個實例的方法疾呻。

首先需要修改設(shè)置Run/Debug Configurations,點擊Edit Configurations...写半,找到EurekaServerClusterApplication啟動配置岸蜗,勾選Allow parallel run選項。我的IDEA版本為2018.3.3叠蝇。網(wǎng)上看到很多人寫的是去掉Single instance only選項璃岳,應(yīng)該是版本原因。

搭建Eureka服務(wù)注冊和發(fā)現(xiàn)組件18
搭建Eureka服務(wù)注冊和發(fā)現(xiàn)組件19

為了在本地模擬2個Server服務(wù)節(jié)點悔捶,需要修改本地host文件铃慷,Windows系統(tǒng)在C:\Windows\System32\drivers\etc\hosts中修改,其它系統(tǒng)自行百度文件位置蜕该。使用Notpad++或其它記事本軟件以管理員身份打開該文件犁柜,在文件末尾添加如下內(nèi)容后保存(注意文件屬性是否設(shè)置了只讀,否則無法保存)堂淡。

127.0.0.1 peer1
127.0.0.1 peer2

編寫啟動類馋缅。添加@EnableEurekaServer注解聲明這是一個Eureka Server。

package cn.org.lilu;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
 * @Auther: lilu
 * @Date: 2019/6/27
 * @Description:
 */
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerClusterApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerClusterApplication.class,args);
    }
}

編寫配置文件application.yml绢淀。由于在一臺電腦上部署萤悴,Server節(jié)點的端口不能相同。為了讓兩個節(jié)點進(jìn)行相互注冊更啄,在節(jié)點配置1中設(shè)置另一個Eureka Server的地址稚疹,同樣在節(jié)點配置2中也設(shè)置另一個Eureka Server的地址居灯,這樣就實現(xiàn)了相互注冊祭务。

spring:
  application:
    name: peer-cluster

# 節(jié)點配置1
#server:
#  port: 8761
#eureka:
#  instance:
#    hostname: peer1
#  client:
#    # 設(shè)置Eureka Server地址
#    service-url:
#      defaultZone: http://peer2:8762/eureka/


# 節(jié)點配置2
server:
  port: 8762
eureka:
  instance:
    hostname: peer2
  client:
    # 設(shè)置Eureka Server地址
    service-url:
      defaultZone: http://peer1:8761/eureka/

打開節(jié)點配置1的注釋内狗,將節(jié)點配置2注釋起來,運(yùn)行啟動類中的main方法义锥,此時控制臺會出現(xiàn)報錯信息柳沙,原因是另一個Server節(jié)點還未啟動。修改配置文件application.yml拌倍,將節(jié)點配置1注釋起來赂鲤,打開節(jié)點配置2的注釋,再次運(yùn)行啟動類中的main方法柱恤,運(yùn)行成功后数初,可以看得之前出現(xiàn)報錯信息的控制臺中打印了如下內(nèi)容。

INFO 38848 --- [nio-8762-exec-2] c.n.e.registry.AbstractInstanceRegistry  : Registered instance PEER-CLUSTER/localhost:peer-cluster:8761 with status UP (replication=false)

此時兩個Server節(jié)點之間已經(jīng)完成了相互注冊梗顺。訪問http://peer1:8761http://peer2:8762可查看相關(guān)信息泡孩。

搭建Eureka服務(wù)注冊和發(fā)現(xiàn)組件20.png
搭建Eureka服務(wù)注冊和發(fā)現(xiàn)組件21.png

至此,一個雙節(jié)點的Eureka Server就搭建完成寺谤。

下面介紹使用多配置文件的方式啟動多個Eureka Server實例的方法(部分書中使用了該方法)仑鸥。

仍然需要修改本地host文件,上文中已說明相關(guān)步驟变屁。另外創(chuàng)建兩個配置文件application-peer1.yml和application-peer2.yml眼俊。與application.yml在同一目錄。將剛才的節(jié)點配置1的內(nèi)容復(fù)制到application-peer1.yml中粟关,將節(jié)點配置2的內(nèi)容復(fù)制到application-peer2.yml中疮胖,修改application.yml中的配置。三個配置文件代碼如下闷板。

application.yml

spring:
  profiles:
    active: native
  application:
    name: peer-cluster

application-peer1.yml

server:
  port: 8761
eureka:
  instance:
    hostname: peer1
  client:
    # 設(shè)置Eureka Server地址
    service-url:
      defaultZone: http://peer2:8762/eureka/

application-peer2.yml

server:
  port: 8762
eureka:
  instance:
    hostname: peer2
  client:
    # 設(shè)置Eureka Server地址
    service-url:
      defaultZone: http://peer1:8761/eureka/

由于需要打成jar包運(yùn)行获列,在pom.xml文件中添加maven插件。完整的pom.xml內(nèi)容如下蛔垢。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>eureka</artifactId>
        <groupId>cn.org.lilu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>eureka-server-cluster</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            <version>2.1.2.RELEASE</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

可直接使用IDEA提供的maven工具打包击孩。點擊IDEA右側(cè)的maven工具,找到eureka-server-cluster項目下的Lifecycle鹏漆,點擊package即可打包巩梢。

搭建Eureka服務(wù)注冊和發(fā)現(xiàn)組件22.png

生成的jar包在target目錄下。

搭建Eureka服務(wù)注冊和發(fā)現(xiàn)組件23.png

右擊target目錄艺玲,點擊Open in Terminal進(jìn)入命令行括蝠。

搭建Eureka服務(wù)注冊和發(fā)現(xiàn)組件24.png

輸入下面的命令指定配置文件為application-peer1.yml按回車鍵。

java -jar eureka-server-cluster-1.0-SNAPSHOT.jar --spring.profiles.active=peer1

運(yùn)行后控制臺會輸出報錯信息饭聚,不用管忌警。再次右擊target目錄,點擊Open in Terminal進(jìn)入第二個命令行秒梳,輸入下面的命令指定配置文件為application-peer2.yml按回車鍵法绵。

java -jar eureka-server-cluster-1.0-SNAPSHOT.jar --spring.profiles.active=peer2

啟動完成后箕速,兩個Server就完成了相互注冊,仍可訪問http://peer1:8761http://peer2:8762查看相關(guān)信息朋譬。

以上就是使用多配置文件格式搭建雙節(jié)點Eureka Server集群盐茎。

2. 將應(yīng)用注冊到Eureka Server集群上

修改模塊eureka-client的配置文件application.yml,配置多個Eureka Server地址徙赢,使用英文逗號分隔字柠。

server:
  port: 1234
spring:
  application:
    name: eureka-client
eureka:
  client:
    service-url:
      defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/

啟動eureka-client模塊,訪問http://peer1:8761http://peer2:8762可看到應(yīng)用已經(jīng)注冊到Eureka Server集群上了狡赐。

搭建Eureka服務(wù)注冊和發(fā)現(xiàn)組件25.png

當(dāng)然窑业,微服務(wù)即使只配置Eureka Server集群中的某個節(jié)點,也能正常注冊到Eureka Server集群枕屉,因為多個Eureka Server之間的數(shù)據(jù)會相互同步数冬。不過為了適應(yīng)某些極端場景,建議在客戶端配置多個Eureka Server節(jié)點搀庶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拐纱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子哥倔,更是在濱河造成了極大的恐慌秸架,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咆蒿,死亡現(xiàn)場離奇詭異东抹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)沃测,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門缭黔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蒂破,你說我怎么就攤上這事馏谨。” “怎么了附迷?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵惧互,是天一觀的道長。 經(jīng)常有香客問我喇伯,道長喊儡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任稻据,我火速辦了婚禮艾猜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己匆赃,他們只是感情好淤毛,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著炸庞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荚斯。 梳的紋絲不亂的頭發(fā)上埠居,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機(jī)與錄音事期,去河邊找鬼滥壕。 笑死,一個胖子當(dāng)著我的面吹牛兽泣,可吹牛的內(nèi)容都是我干的绎橘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼唠倦,長吁一口氣:“原來是場噩夢啊……” “哼称鳞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起稠鼻,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤冈止,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后候齿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熙暴,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年慌盯,在試婚紗的時候發(fā)現(xiàn)自己被綠了周霉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡亚皂,死狀恐怖俱箱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情灭必,我是刑警寧澤匠楚,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站厂财,受9級特大地震影響芋簿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜璃饱,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一与斤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦撩穿、人聲如沸磷支。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雾狈。三九已至,卻和暖如春抵皱,著一層夾襖步出監(jiān)牢的瞬間善榛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工呻畸, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留移盆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓伤为,卻偏偏與公主長得像咒循,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子绞愚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

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