Service Mesh - Istio服務(wù)觀測(cè)篇

洞察你的服務(wù):使用Kiali觀測(cè)你的微服務(wù)應(yīng)用

微服務(wù)架構(gòu)可視化的重要性:

  • 痛點(diǎn):
    • 服務(wù)間依賴關(guān)系錯(cuò)綜復(fù)雜
    • 問題排查困難毡琉,扯皮甩鍋時(shí)有發(fā)生
  • 可視化的優(yōu)勢(shì):
    • 梳理服務(wù)的交互關(guān)系
    • 了解應(yīng)用的行為與狀態(tài)

什么是 Kiali

Kiali屬于Istio的集成組件之一软啼,是一個(gè)用于Istio的可觀測(cè)性控制臺(tái)疹味,具有服務(wù)網(wǎng)格配置和驗(yàn)證功能滔吠。它通過監(jiān)控網(wǎng)絡(luò)流量來推斷服務(wù)拓?fù)浜蛨?bào)告錯(cuò)誤烂完,幫助你了解服務(wù)網(wǎng)格的結(jié)構(gòu)和運(yùn)行狀況赂蕴。Kiali提供了詳細(xì)的度量和基本的Grafana集成设哗,可用于高級(jí)查詢唱捣。

  • 官方定義:
    • Istio 的可觀察性控制臺(tái)
    • 通過服務(wù)拓?fù)鋷椭憷斫夥?wù)網(wǎng)格的結(jié)構(gòu)
    • 提供網(wǎng)格的健康狀態(tài)視圖
    • 具有服務(wù)網(wǎng)格配置功能
  • 名字含義:源自希臘語,意為望遠(yuǎn)鏡
  • 依賴 Istio 作為宿主网梢,為 Istio 開發(fā)有較強(qiáng)的綁定關(guān)系
  • Kiali 是 Istio 服務(wù)觀測(cè)的一環(huán)

Kiali 的功能:

image.png

Kiali 的架構(gòu):

image.png

從上圖可以看到 Kiali 是一個(gè)前后端分離的架構(gòu)震缭,我們可以使用官方提供的配置文件啟動(dòng) Kiali 的后端組件:

[root@m1 ~]# kubectl apply -f /usr/local/istio-1.8.1/samples/addons/kiali.yaml

確認(rèn)啟動(dòng)成功:

[root@m1 ~]# kubectl get pods -n istio-system 
NAME                                    READY   STATUS    RESTARTS   AGE
kiali-7476977cf9-nwnsg                  1/1     Running   1          33h
...

然后使用如下命令啟動(dòng) kiali 的前端:

[root@m1 ~]# istioctl dashboard kiali --address 192.168.243.138
http://localhost:20001/kiali
  • Tips:這里的 IP 是該虛擬機(jī)可被外部訪問的 IP

使用瀏覽器訪問 192.168.243.138:20001 ,基本頁面如下:


image.png

在 “Application” 頁面可以查看不同 Namespace 下所部署的應(yīng)用:


image.png

在 “Graph” 頁面下可以查看服務(wù)之間的總體拓?fù)湔铰玻⑻峁┝硕喾N頁面操作:


image.png

在 “Services” 頁面可以查看指定 Namespace 下的服務(wù)信息:


image.png

點(diǎn)擊服務(wù)的名稱可以進(jìn)入該服務(wù)的詳情頁:


image.png

在 “Workloads” 頁面可以查看指定 Namespace 下的工作負(fù)載信息:


image.png

點(diǎn)擊工作負(fù)載的名稱可以進(jìn)入該工作負(fù)載的詳情頁:


image.png

在 “Istio Config” 頁面可以對(duì) Istio 中的資源配置進(jìn)行查看拣宰、編輯及驗(yàn)證:


image.png
  • 綠色代表沒問題,黃色代表有警告烦感,例如使用了過期的配置項(xiàng)巡社,紅色則代表配置有錯(cuò)誤

例如 detail 的配置有錯(cuò)誤,我們可以點(diǎn)擊進(jìn)去查看出錯(cuò)的地方手趣,并且根據(jù)提示進(jìn)行修改晌该,然后點(diǎn)擊 “Save” 保存即可:


image.png

在 “Istio Config” 頁面還有個(gè)向?qū)Чδ埽梢宰屛覀儎?chuàng)建 Istio 的資源回懦。如下:


image.png

但目前只提供了少數(shù)的幾個(gè)資源類型可以創(chuàng)建:


image.png

指標(biāo):使用Prometheus收集指標(biāo)

Prometheus 是一個(gè)開源的監(jiān)控系統(tǒng)和時(shí)間序列數(shù)據(jù)庫气笙。你可以使用 Prometheus 來記錄跟蹤 Istio 和服務(wù)網(wǎng)格內(nèi)應(yīng)用程序運(yùn)行狀況的指標(biāo)。然后可以使用Grafana和Kiali等工具對(duì)監(jiān)控指標(biāo)進(jìn)行可視化怯晕。

Prometheus 的功能:

image.png

Prometheus 的架構(gòu):

image.png

Prometheus 與 Istio 的集成也比較簡(jiǎn)單潜圃,我們可以使用官方提供的配置文件啟動(dòng) Prometheus Server:

[root@m1 ~]# kubectl apply -f /usr/local/istio-1.8.1/samples/addons/prometheus.yaml

確認(rèn)啟動(dòng)成功:

[root@m1 ~]# kubectl get pods -n istio-system 
NAME                                    READY   STATUS    RESTARTS   AGE
prometheus-7bfddb8dbf-4mnzr             2/2     Running   2          33h
...

然后使用如下命令啟動(dòng) Prometheus 的 Web UI :

[root@m1 ~]# istioctl dashboard prometheus --address 192.168.243.138
http://localhost:9090

使用瀏覽器訪問 192.168.243.138:9090,頁面如下:


image.png

通過官方提供的配置文件啟動(dòng) Prometheus Server 后舟茶,它就會(huì)自動(dòng)收集 Istio 的監(jiān)控指標(biāo)了谭期。此時(shí)我們就可以通過 Prometheus 收集指標(biāo)并查看指標(biāo)數(shù)據(jù)了堵第,例如查看 Istio 的請(qǐng)求總數(shù),該指標(biāo)屬于服務(wù)指標(biāo)

image.png

Envoy 代理指標(biāo)則以 envoy 開頭隧出,可以輸入前綴進(jìn)行查詢:

image.png

除以上兩類指標(biāo)外還有控制平面指標(biāo)踏志,這類指標(biāo)是 Istio 提供的一系列自我監(jiān)控指標(biāo),這些指標(biāo)用于監(jiān)控 Istio 本身的行為胀瞪。

在 “Status -> Targets” 頁面可以查看監(jiān)控目標(biāo)的狀態(tài):


image.png

Istio 1.5 之后提供的遙測(cè)指標(biāo):

  • 請(qǐng)求總數(shù)(istio_requests_total)
  • 請(qǐng)求時(shí)長(istio_request_duration_milliseconds)
  • 請(qǐng)求大姓胗唷(istio_request_bytes)
  • 響應(yīng)大小(istio_response_bytes)
  • TCP 發(fā)送字節(jié)數(shù)(istio_tcp_sent_bytes_total)
  • TCP 接受字節(jié)數(shù)(istio_tcp_received_bytes_total)
  • TCP 連接打開數(shù)(istio_tcp_connections_opened_total)
  • TCP 連接關(guān)閉數(shù)(istio_tcp_connections_closed_total)

Istio 1.5 之前是通過Mixer來進(jìn)行指標(biāo)收集的凄诞,如下圖:


image.png
  • 首先Envoy需要調(diào)用Mixer來上報(bào)指標(biāo)信息圆雁,Mixer則會(huì)提供一個(gè) metrics 這樣的接口給 Prometheus 去抓取指標(biāo)數(shù)據(jù)。因?yàn)槊看握?qǐng)求進(jìn)入代理時(shí)都需要調(diào)用Mixer上報(bào)數(shù)據(jù)帆谍,導(dǎo)致了一些性能問題伪朽,例如額外的資源占用以及請(qǐng)求延遲這樣的情況,所以1.5之后Mixer就被廢棄了

Istio 1.5 之后就直接是 Envoy 和 Prometheus 進(jìn)行交互汛蝙,如下圖:


image.png
  • 無論是代理級(jí)別的指標(biāo)還是服務(wù)級(jí)別的指標(biāo)烈涮,都是通過 Envoy 直接去獲取的,這就省去了一層與Mixer的交互窖剑。盡管更改后的版本在性能上有了大幅提升坚洽,但還是存在一些問題。首先因?yàn)槿∠薓ixer這樣的中心化管理苛吱,所以導(dǎo)致 Envoy 代理需要自己去上傳指標(biāo)數(shù)據(jù)酪术,不是很方便,擴(kuò)展性變?nèi)趿恕?/li>

可同時(shí)解決性能與擴(kuò)展性問題最可行的一個(gè)方法就是未來在 Envoy 上使用 WebAssembly 這樣的技術(shù)翠储。WebAssembly in Envoy:

image.png

  • 解決靜態(tài)化編譯(構(gòu)建時(shí))的弊端
  • 優(yōu)勢(shì):
    • 無需修改 Envoy
    • 避免遠(yuǎn)程調(diào)用
    • 隔離性/安全/多樣性
    • 可移植/可維護(hù)

關(guān)于收集绘雁、查詢指標(biāo)的更多方式可以參考官方文檔:


監(jiān)控:使用Grafana查看系統(tǒng)的整體狀態(tài)

Grafana 的功能:

image.png

  • Grafana 只是一個(gè)功能強(qiáng)大的可視化分析平臺(tái),自身并不包含數(shù)據(jù)源援所,所以通常需要配合 Prometheus 等數(shù)據(jù)源使用庐舟。讓 Grafana 從Prometheus 中讀取數(shù)據(jù)進(jìn)行各種可視化展示,可以彌補(bǔ) Prometheus 自帶的可視化界面的不足

Istio 默認(rèn)提供了一些 Grafana Dashboard:

  • Mesh Dashboard:查看應(yīng)用(服務(wù))數(shù)據(jù)
    • 網(wǎng)格數(shù)據(jù)總覽
    • 服務(wù)視圖
    • 工作負(fù)載視圖
  • Performance Dashboard:查看 Istio 自身(各組件)數(shù)據(jù)
    • Istio 系統(tǒng)總覽
    • 各組件負(fù)載情況

關(guān)于 Grafana 與 Istio 的集成住拭,官方也提供了相應(yīng)的配置文件挪略,使用如下命令就可以啟動(dòng) Grafana :

[root@m1 ~]# kubectl apply -f /usr/local/istio-1.8.1/samples/addons/grafana.yaml

確認(rèn)啟動(dòng)成功:

[root@m1 ~]# kubectl get pods -n istio-system 
NAME                                    READY   STATUS    RESTARTS   AGE
grafana-784c89f4cf-s26lp                1/1     Running   1          33h
...

然后使用如下命令啟動(dòng) Grafana 的 Web UI :

[root@m1 ~]# istioctl dashboard grafana --address 192.168.243.138
http://localhost:3000

使用瀏覽器訪問 192.168.243.138:3000 ,首頁如下:


image.png

現(xiàn)在我們就可以使用 Grafana 查看指標(biāo)生成的 Istio Dashboard了滔岳,進(jìn)入 “Home”杠娱,可以看到 Istio 提供的 Dashboard:

image.png

打開 “Istio Mesh Dashboard” 查看網(wǎng)格數(shù)據(jù)總覽,展示效果如下:


image.png

點(diǎn)擊下方的 Service 名稱可以進(jìn)入 “Istio Service Dashboard” 查看服務(wù)視圖:


image.png

“Istio Workload Dashboard” 查看工作負(fù)載視圖:


image.png

“Istio Performance Dashboard” 查看資源使用總覽:


image.png

日志:如何獲取Envoy的日志并進(jìn)行調(diào)試

最簡(jiǎn)單的一種Istio日志記錄是Envoy的訪問日志記錄谱煤。訪問日志(Access logs)提供了一種從單個(gè)工作負(fù)載實(shí)例的角度監(jiān)視和理解行為的方法关斜,通過查看Envoy日志可以了解流量信息屿附、定位問題。Envoy代理將訪問信息打印到其標(biāo)準(zhǔn)輸出隧期。然后凿可,使用kubectl logs命令可以打印Envoy容器的標(biāo)準(zhǔn)輸出。

這一小節(jié)將演示如何獲取Envoy的訪問日志。首先,確認(rèn) Envoy 日志配置已開啟(默認(rèn)是開啟的)野来,可使用如下命令開啟:

$ istioctl install <flags-you-used-to-install-Istio> --set meshConfig.accessLogFile=/dev/stdout

還是以Bookinfo應(yīng)用作為示例:

[root@m1 ~]# kubectl get pods
NAME                              READY   STATUS    RESTARTS   AGE
details-v1-79c697d759-wpxlj       2/2     Running   2          9h
productpage-v1-65576bb7bf-4bwwr   2/2     Running   2          9h
ratings-v1-7d99676f7f-cfbw4       2/2     Running   2          9h
reviews-v1-987d495c-8n5mv         2/2     Running   2          9h
reviews-v2-6c5bf657cf-rzn4q       2/2     Running   2          9h
reviews-v3-5f7b9f4f77-29454       2/2     Running   2          9h
[root@m1 ~]# 

訪問Bookinfo應(yīng)用的服務(wù)后會(huì)產(chǎn)生流量輸出,此時(shí)可以使用如下命令查看 Envoy(istio-proxy)的日志輸出:

[root@m1 ~]# kubectl logs -l app=productpage -c istio-proxy
...
[2020-12-23T01:34:30.349Z] "GET /details/0 HTTP/1.1" 200 - "-" 0 178 15 14 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" "1e449e4d-0f3f-928b-9add-8b8ace3f5feb" "details:9080" "172.22.152.212:9080" outbound|9080||details.default.svc.cluster.local 172.22.152.206:42074 10.104.2.32:9080 172.22.152.206:56744 - default
[2020-12-23T01:34:30.376Z] "GET /reviews/0 HTTP/1.1" 200 - "-" 0 375 948 948 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" "1e449e4d-0f3f-928b-9add-8b8ace3f5feb" "reviews:9080" "172.22.78.148:9080" outbound|9080||reviews.default.svc.cluster.local 172.22.152.206:52008 10.100.239.139:9080 172.22.152.206:55806 - default

訪問日志默認(rèn)的格式是 TEXT 格式踪旷,不利于查看日志項(xiàng)的含義曼氛,我們可以將日志格式設(shè)置為JSON,這樣可以比較方便觀察其日志項(xiàng)埃脏,使用如下命令將accessLogEncoding設(shè)置為JSON:

$ istioctl install <flags-you-used-to-install-Istio> --set meshConfig.accessLogEncoding=JSON

將日志格式設(shè)置為JSON后搪锣,此時(shí)輸出的日志內(nèi)容如下:

{"upstream_cluster":"outbound|9080||reviews.default.svc.cluster.local","downstream_remote_address":"172.22.152.206:32852","authority":"reviews:9080","path":"/reviews/0","protocol":"HTTP/1.1","upstream_service_time":"735","upstream_local_address":"172.22.152.206:53320","duration":735,"route_name":"default","downstream_local_address":"10.100.239.139:9080","upstream_transport_failure_reason":null,"user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36","response_code":200,"response_flags":"-","start_time":"2020-12-23T01:45:58.932Z","method":"GET","request_id":"12bc8456-65b1-9a34-96e6-0fa9f0525f23","upstream_host":"172.22.152.209:9080","x_forwarded_for":null,"requested_server_name":null,"bytes_received":0,"bytes_sent":379}

將JSON格式化后,如下:


image.png

日志信息中有五個(gè)重要的字段彩掐,也就是所謂的Envoy 流量五元組:

image.png

  • Envoy 流量五元組可以讓你清晰地知道,流量是從哪里來灰追,會(huì)到哪里去堵幽,所以五元組是 Envoy 日志中非常重要的概念

調(diào)試關(guān)鍵字段:response_flags,一些請(qǐng)求的錯(cuò)誤標(biāo)志會(huì)被賦值給該字段弹澎。常見錯(cuò)誤標(biāo)志有如下幾種:

  • UH:upstream cluster 中沒有健康的 host朴下,503
  • UF:upstream 連接失敗,503
  • UO:upstream overflow(熔斷)
  • NR:沒有路由配置苦蒿,404
  • URX:請(qǐng)求被拒絕因?yàn)橄蘖骰蜃畲筮B接次數(shù)
  • 更多信息可參考:官方文檔

Envoy 的一些日志配置項(xiàng):


image.png

分布式追蹤:使用Jeager對(duì)應(yīng)用進(jìn)行分布式追蹤

分布式追蹤概念

  • 分析和監(jiān)控應(yīng)用的監(jiān)控方法
  • 查找故障點(diǎn)殴胧、分析性能問題
  • 起源于 Google 的 Dapper
  • 隨著分布式追蹤技術(shù)的發(fā)展,衍生出了OpenTracing:API 規(guī)范佩迟、框架团滥、公共庫的組合


    image.png

Istio支持通過 Envoy 代理進(jìn)行分布式追蹤。代理會(huì)代表其代理的應(yīng)用程序自動(dòng)生成跟蹤范圍报强,只需要應(yīng)用程序轉(zhuǎn)發(fā)適當(dāng)?shù)恼?qǐng)求上下文灸姊。

Istio支持許多跟蹤后端,包括Zipkin秉溉、Jaeger力惯、Lightstep和Datadog。本小節(jié)將介紹 Istio 集成 Jaeger 實(shí)現(xiàn)分布式追蹤召嘶。

什么是 Jaeger:

  • 開源父晶、端到端的分布式追蹤系統(tǒng)
  • 針對(duì)復(fù)雜的分布式系統(tǒng),對(duì)業(yè)務(wù)鏈路進(jìn)行監(jiān)控和問題排查


    image.png

分布式追蹤的兩個(gè)重要術(shù)語:

  • Span:
    • 邏輯單元
    • 有操作名弄跌、執(zhí)行時(shí)間
    • 嵌套甲喝、有序、因果關(guān)系
  • Trace:
    • 數(shù)據(jù)/執(zhí)行路徑
    • Span 的組合


      image.png

Jaeger 的架構(gòu):

image.png

核心組件:

  • Client libraries:客戶端公共庫碟绑,支持不同語言
  • Agent:用于從應(yīng)用抓取Span俺猿,并發(fā)送給Collector
  • Collector:收集器茎匠,從應(yīng)用層收集Span數(shù)據(jù),并發(fā)送給存儲(chǔ)系統(tǒng)(DB)
  • Query:相當(dāng)于查詢引擎押袍,用于提供在頁面上查詢數(shù)據(jù)的能力
  • Ingester:與Kafka配合使用诵冒,相當(dāng)于Kafka的一個(gè)Consumer,消費(fèi)數(shù)據(jù)存儲(chǔ)到DB中

接下來我們把 Jaeger 集成到 Istio谊惭。首先汽馋,確認(rèn) Istio 開啟了追蹤選項(xiàng),可以使用如下命令開啟:

$ istioctl install <flags-you-used-to-install-Istio> --set values.tracing.enabled=true

我們可以使用官方提供的配置文件快速將 Jaeger 集成到 Istio 中:

[root@m1 ~]# kubectl apply -f /usr/local/istio-1.8.1/samples/addons/jaeger.yaml

確認(rèn) Jaeger 啟動(dòng)成功:

[root@m1 ~]# kubectl get pods -n istio-system 
NAME                                    READY   STATUS    RESTARTS   AGE
jaeger-7f78b6fb65-gchw2                 1/1     Running   2          46h
...

然后使用如下命令啟動(dòng) Jaeger 的Web UI:

[root@m1 ~]# istioctl dashboard jaeger --address 192.168.243.138
http://localhost:16686

使用瀏覽器訪問 Jaeger 的Web UI:


image.png

然后訪問 Bookinfo 應(yīng)用頁面生成一些 trace 數(shù)據(jù)后圈盔,到 Jaeger 查詢 trace 數(shù)據(jù):


image.png

點(diǎn)擊任意 Span 可以查看其詳細(xì) trace 數(shù)據(jù):


image.png

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末豹芯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子驱敲,更是在濱河造成了極大的恐慌铁蹈,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件众眨,死亡現(xiàn)場(chǎng)離奇詭異握牧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)娩梨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門沿腰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人狈定,你說我怎么就攤上這事颂龙。” “怎么了纽什?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵措嵌,是天一觀的道長。 經(jīng)常有香客問我稿湿,道長铅匹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任饺藤,我火速辦了婚禮包斑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涕俗。我一直安慰自己罗丰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布再姑。 她就那樣靜靜地躺著萌抵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绍填,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天霎桅,我揣著相機(jī)與錄音,去河邊找鬼讨永。 笑死滔驶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卿闹。 我是一名探鬼主播揭糕,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼锻霎!你這毒婦竟也來了著角?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤旋恼,失蹤者是張志新(化名)和其女友劉穎吏口,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冰更,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锨侯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了冬殃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡叁怪,死狀恐怖审葬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奕谭,我是刑警寧澤涣觉,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站血柳,受9級(jí)特大地震影響官册,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜难捌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一膝宁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧根吁,春花似錦员淫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春圣蝎,著一層夾襖步出監(jiān)牢的瞬間刃宵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國打工徘公, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留牲证,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓步淹,卻偏偏與公主長得像从隆,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缭裆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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