使用 Spring Cloud 和 Docker 輕松構(gòu)建微服務(wù)架構(gòu)厨剪!

原文:https://dzone.com/articles/microservice-architecture-with-spring-cloud-and-do
作者:Alexander Lukyanchikov
譯者:Oopsguy

【編者的話】如何使用Spring Boot、Spring Cloud灵份、Docker和Netflix的一些開源工具來構(gòu)建一個(gè)微服務(wù)架構(gòu)赫舒。本文通過使用Spring Boot、Spring Cloud和Docker構(gòu)建的概念型應(yīng)用示例,提供了了解常見的微服務(wù)架構(gòu)模式的起點(diǎn)奈搜。

該代碼可以在GitHub上獲得,并且在Docker Hub上提供了鏡像盯荤。您只需要一個(gè)命令即可啟動(dòng)整個(gè)系統(tǒng)馋吗。

https://github.com/sqshq/PiggyMetrics

我選擇了一個(gè)老項(xiàng)目作為這個(gè)系統(tǒng)的基礎(chǔ),它的后端以前是單一應(yīng)用秋秤。此應(yīng)用提供了處理個(gè)人財(cái)務(wù)宏粤、整理收入開銷、管理儲(chǔ)蓄灼卢、分析統(tǒng)計(jì)和創(chuàng)建簡單預(yù)測等功能绍哎。

功能服務(wù)

整個(gè)應(yīng)用分解為三個(gè)核心微服務(wù)。它們都是可以獨(dú)立部署的應(yīng)用鞋真,圍繞著某些業(yè)務(wù)功能進(jìn)行組織崇堰。

image

賬戶服務(wù)

包含一般用戶輸入邏輯和驗(yàn)證:收入/開銷記錄、儲(chǔ)蓄和賬戶設(shè)置灿巧。

image

統(tǒng)計(jì)服務(wù)

計(jì)算主要的統(tǒng)計(jì)參數(shù),并捕獲每一個(gè)賬戶的時(shí)間序列揽涮。數(shù)據(jù)點(diǎn)包含基于貨幣和時(shí)間段正晨倥海化后的值。該數(shù)據(jù)可用于跟蹤賬戶生命周期中的現(xiàn)金流量動(dòng)態(tài)蒋困。

image

通知服務(wù)

存儲(chǔ)用戶的聯(lián)系信息和通知設(shè)置(如提醒和備份頻率)盾似。安排工作人員從其它服務(wù)收集所需的信息并向訂閱的客戶發(fā)送電子郵件。

image

注意

  • 每一個(gè)微服務(wù)擁有自己的數(shù)據(jù)庫雪标,因此沒有辦法繞過API直接訪問持久數(shù)據(jù)零院。

  • 在這個(gè)項(xiàng)目中,我使用MongoDB作為每一個(gè)服務(wù)的主數(shù)據(jù)庫村刨。擁有一個(gè)多種類持久化架構(gòu)(polyglot persistence architecture)也是很有意義的告抄。

  • 服務(wù)間(Service-to-service)通信是非常簡單的:微服務(wù)僅使用同步的REST API進(jìn)行通信。現(xiàn)實(shí)中的系統(tǒng)的常見做法是使用互動(dòng)風(fēng)格的組合嵌牺。例如打洼,執(zhí)行同步的GET請(qǐng)求檢索數(shù)據(jù),并通過消息代理(broker)使用異步方法執(zhí)行創(chuàng)建/更新操作逆粹,以便解除服務(wù)和緩沖消息之間的耦合募疮。然而,這帶給我們是最終的一致性僻弹。

基礎(chǔ)設(shè)施服務(wù)

分布式系統(tǒng)中常見的模式阿浓,可以幫助我們描述核心服務(wù)是怎樣工作的。Spring Cloud提供了強(qiáng)大的工具蹋绽,可以增強(qiáng)Spring Boot應(yīng)用的行為來實(shí)現(xiàn)這些模式芭毙。我會(huì)簡要介紹一下:

image

配置服務(wù)

Spring Cloud Config是分布式系統(tǒng)的水平擴(kuò)展集中式配置服務(wù)筋蓖。它使用了當(dāng)前支持的本地存儲(chǔ)、Git和Subversion等可拔插存儲(chǔ)庫層(repository layer)稿蹲。

在此項(xiàng)目中扭勉,我使用了native profile,它簡單地從本地classpath下加載配置文件苛聘。您可以在配置服務(wù)資源中查看shared目錄⊥垦祝現(xiàn)在,當(dāng)通知服務(wù)請(qǐng)求它的配置時(shí)设哗,配置服務(wù)將響應(yīng)回shared/notification-service.yml和shared/application.yml(所有客戶端應(yīng)用之間共享)唱捣。

客戶端使用

只需要使用sprng-cloud-starter-config依賴構(gòu)建Spring Boot應(yīng)用,自動(dòng)配置將會(huì)完成其它工作网梢。

現(xiàn)在您的應(yīng)用中不需要任何嵌入的properties震缭,只需要提供有應(yīng)用名稱和配置服務(wù)url的bootstrap.yml即可:

spring:
application:
name: notification-service
cloud:
config:
  uri: http://config:8888
  fail-fast: true

使用Spring Cloud Config,您可以動(dòng)態(tài)更改應(yīng)用配置

比如战虏,EmailService bean使用了@RefreshScope注解拣宰。這意味著您可以更改電子郵件的內(nèi)容和主題,而無需重新構(gòu)建和重啟通知服務(wù)應(yīng)用烦感。

首先巡社,在配置服務(wù)器中更改必要的屬性。然后手趣,對(duì)通知服務(wù)執(zhí)行刷新請(qǐng)求:curl -H "Authorization: Bearer #token#" -XPOST http://127.0.0.1:8000/notifications/refresh晌该。

您也可以使用webhook來自動(dòng)執(zhí)行此過程。

http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html#_push_notifications_and_spring_cloud_bus

注意

  • 動(dòng)態(tài)刷新存在一些限制绿渣。@RefreshScope不能和@Configuraion類一同工作朝群,并且不會(huì)作用于@Scheduled方法。

  • fail-fast屬性意味著如果Spring Boot應(yīng)用無法連接到配置服務(wù)中符,將會(huì)立即啟動(dòng)失敗姜胖。當(dāng)您一起啟動(dòng)所有應(yīng)用時(shí),這非常有用淀散。

  • 下面有重要的安全提示

授權(quán)服務(wù)

負(fù)責(zé)授權(quán)的部分被完全提取到單獨(dú)的服務(wù)器谭期,它為后端資源服務(wù)提供OAuth2令牌。授權(quán)服務(wù)器用于用戶授權(quán)以及在周邊內(nèi)進(jìn)行安全的機(jī)器間通信吧凉。

在此項(xiàng)目中隧出,我使用密碼憑據(jù)作為用戶授權(quán)的授權(quán)類型(因?yàn)樗鼉H由本地應(yīng)用UI使用)和客戶端憑據(jù)作為微服務(wù)授權(quán)的授權(quán)類型。

Spring Cloud Security提供了方便的注解和自動(dòng)配置阀捅,使其在服務(wù)器端或者客戶端都可以很容易地實(shí)現(xiàn)胀瞪。您可以在文檔中了解到更多信息,并在授權(quán)服務(wù)器代碼中檢查配置明細(xì)。

授權(quán)服務(wù)器代碼:https://github.com/sqshq/PiggyMetrics/tree/master/auth-service/src/main/java/com/piggymetrics/auth

從客戶端來看凄诞,一切都與傳統(tǒng)的基于會(huì)話的授權(quán)完全相同圆雁。您可以從請(qǐng)求中檢索Principal對(duì)象、檢查用戶角色和其它基于表達(dá)式訪問控制和@PreAuthorize注解的內(nèi)容帆谍。

PiggyMetrics(帳戶服務(wù)伪朽、統(tǒng)計(jì)服務(wù)、通知服務(wù)和瀏覽器)中的每一個(gè)客戶端都有一個(gè)范圍:用于后臺(tái)服務(wù)的服務(wù)器汛蝙、用于瀏覽器展示的UI烈涮。所以我們也可以保護(hù)控制器避免受到外部訪問,例如:

@PreAuthorize("#oauth2.hasScope('server')")
@RequestMapping(value = "accounts/{name}", method = RequestMethod.GET)
public List<DataPoint> getStatisticsByAccountName(@PathVariable String name) {
return statisticsService.findByAccountName(name);
} 

API網(wǎng)關(guān)

您可以看到窖剑,有三個(gè)核心服務(wù)坚洽。它們向客戶端暴露外部API。在現(xiàn)實(shí)系統(tǒng)中西土,這個(gè)數(shù)量可以非逞冉ⅲ快速地增長,同時(shí)整個(gè)系統(tǒng)將變得非常復(fù)雜需了。實(shí)際上跳昼,一個(gè)復(fù)雜頁面的渲染可能涉及到數(shù)百個(gè)服務(wù)。

理論上肋乍,客戶端可以直接向每個(gè)微服務(wù)直接發(fā)送請(qǐng)求鹅颊。但是這種方式是存在挑戰(zhàn)和限制的,如果需要知道所有端點(diǎn)的地址住拭,分別對(duì)每一段信息執(zhí)行http請(qǐng)求挪略,將結(jié)果合并到客戶端历帚。另一個(gè)問題是滔岳,這不是web友好協(xié)議,可能只在后端使用挽牢。

通常一個(gè)更好的方法是使用API網(wǎng)關(guān)谱煤。它是系統(tǒng)的單個(gè)入口點(diǎn),用于通過將請(qǐng)求路由到適當(dāng)?shù)暮蠖朔?wù)或者通過調(diào)用多個(gè)后端服務(wù)并聚合結(jié)果來處理請(qǐng)求禽拔。此外刘离,它還可以用于認(rèn)證、insights睹栖、壓力測試硫惕、金絲雀測試(canary testing)、服務(wù)遷移野来、靜態(tài)響應(yīng)處理和主動(dòng)變換管理恼除。

聚合結(jié)果:http://techblog.netflix.com/2013/01/optimizing-netflix-api.html

Netflix開源這樣的邊緣服務(wù),現(xiàn)在用Spring Cloud,我們可以用一個(gè)@EnabledZuulProxy注解來啟用它豁辉。在這個(gè)項(xiàng)目中令野,我使用Zuul存儲(chǔ)靜態(tài)內(nèi)容(UI應(yīng)用),并將請(qǐng)求路由到適當(dāng)?shù)奈⒎?wù)徽级。以下是一個(gè)簡單的基于前綴(prefix-based)路由的通知服務(wù)配置:

zuul:
routes:
notification-service:
    path: /notifications/**
    serviceId: notification-service
    stripPrefix: false

這意味著所有以/notification開頭的請(qǐng)求將被路由到通知服務(wù)气破。您可以看到,里面沒有硬編碼的地址餐抢。Zuul使用服務(wù)發(fā)現(xiàn)機(jī)制來定位通知服務(wù)實(shí)例以及斷路器和負(fù)載均衡器现使,如下所述。

服務(wù)發(fā)現(xiàn)

另一種常見的架構(gòu)模式是服務(wù)發(fā)現(xiàn)弹澎。它允許自動(dòng)檢測服務(wù)實(shí)例的網(wǎng)絡(luò)位置朴下,由于自動(dòng)擴(kuò)展、故障和升級(jí)苦蒿,它可能會(huì)動(dòng)態(tài)分配地址殴胧。

服務(wù)發(fā)現(xiàn)的關(guān)鍵部分是注冊(cè)。我使用Netflix Eureka進(jìn)行這個(gè)項(xiàng)目佩迟,當(dāng)客戶端需要負(fù)責(zé)確定可以用的服務(wù)實(shí)例(使用注冊(cè)服務(wù)器)的位置和跨平臺(tái)的負(fù)載均衡請(qǐng)求時(shí)团滥,Eureka就是客戶端發(fā)現(xiàn)模式的一個(gè)很好的例子。

使用Spring Boot报强,您可以使用spring-cloud-starter-eureka-server依賴灸姊、@EnabledEurekaServer注解和簡單的配置屬性輕松構(gòu)建Eureka注冊(cè)中心(Eureka Registry)。

使用@EnabledDiscoveryClient注解和帶有應(yīng)用名稱的bootstrap.yml來啟用客戶端支持:

spring:
application:
name: notification-service

現(xiàn)在秉溉,在應(yīng)用啟動(dòng)時(shí)力惯,它將向Eureka服務(wù)器注冊(cè)并提供元數(shù)據(jù),如主機(jī)和端口召嘶、健康指示器URL父晶、主頁等。Eureka接收來自從屬于某服務(wù)的每個(gè)實(shí)例的心跳消息弄跌。如果心跳失敗超過配置的時(shí)間表甲喝,該實(shí)例將從注冊(cè)表中刪除。

此外铛只,Eureka還提供了一個(gè)簡單的界面埠胖,您可以通過它來跟蹤運(yùn)行中的服務(wù)和可用實(shí)例的數(shù)量:http://localhost:8761

image

負(fù)載均衡器、斷路器和Http客戶端

Netflix OSS提供了另一套很棒的工具淳玩。

Ribbon

Ribbon是一個(gè)客戶端負(fù)載均衡器直撤,可以很好地控制HTTP和TCP客戶端的行為。與傳統(tǒng)的負(fù)載均衡器相比蜕着,每次線上調(diào)用都不需要額外的跳躍——您可以直接聯(lián)系所需的服務(wù)谋竖。

它與Spring Cloud和服務(wù)發(fā)現(xiàn)是集成在一起的,可開箱即用。Eureka客戶端提供了可用服務(wù)器的動(dòng)態(tài)列表圈盔,因此Ribbon可以在它們之間進(jìn)行平衡豹芯。

Hystrix

Hystrix是斷路器模式的一種實(shí)現(xiàn),它可以通過網(wǎng)絡(luò)訪問依賴來控制延遲和故障驱敲。中心思想是在具有大量微服務(wù)的分布式環(huán)境中停止級(jí)聯(lián)故障铁蹈。這有助于快速失敗并盡快恢復(fù)——自我修復(fù)在容錯(cuò)系統(tǒng)中是非常重要的。

除了斷路器控制众眨,在使用Hystrix握牧,您可以添加一個(gè)備用方法,在主命令失敗的情況下娩梨,該方法將被調(diào)用以獲取默認(rèn)值沿腰。

此外,Hystrix生成每個(gè)命令的執(zhí)行結(jié)果和延遲的度量狈定,我們可以用它來監(jiān)視系統(tǒng)的行為颂龙。

Feign

Feign是一個(gè)聲明式HTTP客戶端,能與Ribbon和Hystrix無縫集成纽什。實(shí)際上措嵌,通過一個(gè)spring-cloud-starter-feign依賴和@EnabledFeignClients注解,您可以使用一整套負(fù)載均衡器芦缰、斷路器和HTTP客戶端企巢,并附帶一個(gè)合理的的默認(rèn)配置。

以下是賬戶服務(wù)的示例:

@FeignClient(name = "statistics-service")
public interface StatisticsServiceClient {
@RequestMapping(method = RequestMethod.PUT, value = "/statistics/{accountName}", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
void updateStatistics(@PathVariable("accountName") String accountName, Account account);
} 
  • 您需要的只是一個(gè)接口

  • 您可以在Spring MVC控制器和Feign方法之間共享@RequestMapping部分

  • 以上示例僅指定所需要的服務(wù)ID——statistics-service让蕾,這得益于Eureka的自動(dòng)發(fā)現(xiàn)(但顯然您可以使用特定的URL訪問任何資源)浪规。

監(jiān)控儀表盤

在這個(gè)項(xiàng)目配置中,Hystrix的每一個(gè)微服務(wù)都通過Spring Cloud Bus(通過AMQP broker)將指標(biāo)推送到Turbine探孝。監(jiān)控項(xiàng)目只是一個(gè)使用了Turbine和Hystrix儀表盤的小型Spring Boot應(yīng)用笋婿。

讓我們看看系統(tǒng)行為在負(fù)載下:賬戶服務(wù)調(diào)用統(tǒng)計(jì)服務(wù)和它在一個(gè)變化的模擬延遲下的響應(yīng)。響應(yīng)超時(shí)閾值設(shè)置為1秒再姑。

image

日志分析

集中式日志記錄在嘗試查找分布式環(huán)境中的問題時(shí)非常有用萌抵。Elasticsearch找御、Logstash和Kibana技術(shù)椩疲可讓您輕松搜索和分析您的日志、利用率和網(wǎng)絡(luò)活動(dòng)數(shù)據(jù)霎桅。在我的另一個(gè)項(xiàng)目中已經(jīng)有現(xiàn)成的Docker配置栖疑。

安全

高級(jí)安全配置已經(jīng)超過了此概念性項(xiàng)目的范圍。為了更真實(shí)地模擬真實(shí)系統(tǒng)滔驶,請(qǐng)考慮使用https和JCE密鑰庫來加密微服務(wù)密碼和配置服務(wù)器的properties內(nèi)容(有關(guān)詳細(xì)信息遇革,請(qǐng)參閱文檔)。

基礎(chǔ)設(shè)施自動(dòng)化

部署微服務(wù)比部署單一的應(yīng)用的流程要復(fù)雜得多,因?yàn)樗鼈兿嗷ヒ蕾嚶芸臁碛型耆A(chǔ)設(shè)置自動(dòng)化是非常重要的锻霎。我們可以通過持續(xù)交付的方式獲得以下好處:

  • 隨時(shí)發(fā)布軟件的能力。

  • 任何構(gòu)建都可能最終成為一個(gè)發(fā)行版本揪漩。

  • 構(gòu)建工件(artifact)一次旋恼,根據(jù)需要進(jìn)行部署。

這是一個(gè)簡單的持續(xù)交付工作流程奄容,在這個(gè)項(xiàng)目的實(shí)現(xiàn):

在此配置中冰更,Travis CI為每一個(gè)成功的Git推送創(chuàng)建了標(biāo)記鏡像。因此昂勒,每一個(gè)微服務(wù)在Docker Hub上的都會(huì)有一個(gè)latest鏡像蜀细,而較舊的鏡像則使用Git提交的哈希進(jìn)行標(biāo)記。如果有需要戈盈,可以輕松部署任何一個(gè)奠衔,并快速回滾。

image

如何運(yùn)行全部塘娶?

這真的很簡單涣觉,我建議您嘗試一下。請(qǐng)記住血柳,您將要啟動(dòng)8個(gè)Spring Boot應(yīng)用官册、4個(gè)MongoDB實(shí)例和RabbitMq。確保您的機(jī)器上有4GB的內(nèi)存难捌。您可以隨時(shí)通過網(wǎng)關(guān)膝宁、注冊(cè)中心、配置根吁、認(rèn)證服務(wù)和賬戶中心運(yùn)行重要的服務(wù)员淫。

運(yùn)行之前

  • 安裝Docker和Docker Compose。

  • 配置環(huán)境變量:CONFIG_SERVICE_PASSWORD, NOTIFICATION_SERVICE_PASSWORD, STATISTICS_SERVICE_PASSWORD, ACCOUNT_SERVICE_PASSWORD, MONGODB_PASSWORD

生產(chǎn)模式

在這種模式下击敌,所有最新的鏡像都將從Docker Hub上拉取介返。只需要復(fù)制docker-compose.yml并執(zhí)行docker-compose up -d即可。

開發(fā)模式

如果您想自己構(gòu)建鏡像(例如沃斤,在代碼中進(jìn)行一些修改)圣蝎,您需要克隆所有倉庫(repository)并使用Mavne構(gòu)建工件(artifact)。然后衡瓶,運(yùn)行docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d

docker-compose.dev.yml繼承了docker-compose.yml徘公,附帶額外配置,可在本地構(gòu)建鏡像哮针,并暴露所有容器端口以方便開發(fā)关面。

重要的端點(diǎn)(Endpoint)

  • localhost:80 —— 網(wǎng)關(guān)

  • localhost:8761 —— Eureka儀表盤

  • localhost:9000 —— Hystrix儀表盤

  • localhost:8989 —— Turbine stream(Hystrix儀表盤來源)

  • localhost:15672 —— RabbitMq管理

注意

所有Spring Boot應(yīng)用都需要運(yùn)行配置服務(wù)器才能啟動(dòng)坦袍。得益于Spring Boot的fail-fast屬性和docker-compsoe的restart:always選項(xiàng),我們可以同時(shí)啟動(dòng)所有容器等太。這意味著所有依賴的容器將嘗試重新啟動(dòng)捂齐,直到配置服務(wù)器啟動(dòng)運(yùn)行為止。

此外缩抡,服務(wù)發(fā)現(xiàn)機(jī)制在所有應(yīng)用啟動(dòng)后需要一段時(shí)間辛燥。在實(shí)例、Eureka服務(wù)器和客戶端在其本地緩存中都具有相同的元數(shù)據(jù)之前缝其,任何服務(wù)都不可用于客戶端發(fā)現(xiàn)挎塌,因此可能需要3次心跳。默認(rèn)的心跳周期為30秒内边。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末榴都,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子漠其,更是在濱河造成了極大的恐慌嘴高,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件和屎,死亡現(xiàn)場離奇詭異拴驮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)柴信,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門套啤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人随常,你說我怎么就攤上這事潜沦。” “怎么了绪氛?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵唆鸡,是天一觀的道長。 經(jīng)常有香客問我枣察,道長争占,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任序目,我火速辦了婚禮臂痕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宛琅。我一直安慰自己刻蟹,他們只是感情好逗旁,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布嘿辟。 她就那樣靜靜地躺著舆瘪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪红伦。 梳的紋絲不亂的頭發(fā)上英古,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音昙读,去河邊找鬼召调。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蛮浑,可吹牛的內(nèi)容都是我干的唠叛。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼沮稚,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼艺沼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蕴掏,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤障般,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后盛杰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挽荡,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年即供,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了定拟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逗嫡,死狀恐怖办素,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情祸穷,我是刑警寧澤性穿,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站雷滚,受9級(jí)特大地震影響需曾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜祈远,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一呆万、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧车份,春花似錦谋减、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庄吼。三九已至,卻和暖如春严就,著一層夾襖步出監(jiān)牢的瞬間总寻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工梢为, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留渐行,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓铸董,卻偏偏與公主長得像祟印,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子粟害,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345