traefik 2.1 for docker

??用traefik 做一個本機docker環(huán)境的代理付呕,對于開發(fā)人員用起來還是挺方便的计福, 搞一個泛解析的域名,然后部署一個容器徽职,就能馬上用二級域名訪問象颖,至少不用煩心端口的相互占用。

??traefik 是用來做反向代理和負載均衡的姆钉,在原生云環(huán)境中能動態(tài)的根據(jù)后端的變化而動態(tài)配置说订,適合微服和kubernetes這種service 頻繁變化的應用環(huán)境,traefik 可以在docker潮瓶,kubernetes ,或者獨立運行陶冷。traefik的后臺配置支持非常多比如docker,k8s毯辅,etcd埂伦,zookeeper。 traefik 2比1版本的主要區(qū)別之一思恐,是增加了Middlewares這樣一個中間層沾谜,這樣意味著代理的流量還可以在traefik里面周游一圈洗個澡了再出來,效率怎么樣還不好說壁袄,至少又多了一層控制手段。想著用就用個新版的媚媒,沒事用一用可以為將來做準備嗜逻。

??這里主要用traefik 2.1 以docker為配置后端實際操作一下,為開發(fā)人員開一個方便之門缭召。假設你已經安裝好docker栈顷,和docker-compose,為了區(qū)別具體環(huán)境逆日,輸出一下我的本地環(huán)境。

[root@one ~]# rpm -qa |grep docker
docker-ce-cli-19.03.4-3.el7.x86_64
docker-ce-19.03.4-3.el7.x86_64
[root@one ~]# docker-compose version
docker-compose version 1.25.0, build 0a186604
docker-py version: 4.1.0
CPython version: 3.7.4
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

一個traefik,mysql,phpmyadmin 的樣例

編寫docker-compose.yml

version: '3'

volumes:
  mysql_data:
      driver: local
services:
  mysql:
      image: mysql:5.7.26
      container_name: mysql
      volumes:
        - mysql_data:/var/lib/mysql
      environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: keycloak
        MYSQL_USER: keycloak
        MYSQL_PASSWORD: password
      ports:
        - 3306:3306
      networks:
        default:
          aliases:
          - mysql
  phpmyadmin:
      image: phpmyadmin/phpmyadmin:edge-4.9
      labels:
        - "traefik.http.routers.phpmyadmin.rule=Host(`pma.xilin.com`)"
        - "traefik.http.services.phpmyadmin.loadbalancer.server.port=80"
        - "traefik.enable=true"
      container_name: phpmyadmin
      environment:
        PMA_HOST: mysql
        PMA_PORT: 3306
        PMA_USER: root
        PMA_PASSWORD: root
      networks:
        default:
          aliases:
          - phpmyadmin
      depends_on:
        - mysql
  traefik:
      image: traefik:2.1
      container_name: traefik
      volumes:
        - /etc/traefik/traefik.toml:/etc/traefik/traefik.toml
        - /var/run/docker.sock:/var/run/docker.sock
      networks:
        default:
          aliases:
          - traefik
      ports:
        - 80:80
        - 443:443
        - 8080:8080

traefik.toml配置

################################################################
# Global configuration
################################################################
[global]
  checkNewVersion = true
  sendAnonymousUsage = true

################################################################
# Entrypoints configuration
################################################################

# Entrypoints definition
#
# Optional
# Default:
[entryPoints]
  [entryPoints.web]
    address = ":80"

  [entryPoints.websecure]
    address = ":443"

################################################################
# Traefik logs configuration
################################################################

# Traefik logs
# Enabled by default and log to stdout
#
# Optional
#
[log]

  # Log level
  #
  # Optional
  # Default: "ERROR"
  #
  # level = "DEBUG"

  # Sets the filepath for the traefik log. If not specified, stdout will be used.
  # Intermediate directories are created if necessary.
  #
  # Optional
  # Default: os.Stdout
  #
  # filePath = "log/traefik.log"

  # Format is either "json" or "common".
  #
  # Optional
  # Default: "common"
  #
  # format = "json"

################################################################
# Access logs configuration
################################################################

# Enable access logs
# By default it will write to stdout and produce logs in the textual
# Common Log Format (CLF), extended with additional fields.
#
# Optional
#
# [accessLog]

  # Sets the file path for the access log. If not specified, stdout will be used.
  # Intermediate directories are created if necessary.
  #
  # Optional
  # Default: os.Stdout
  #
  # filePath = "/path/to/log/log.txt"

  # Format is either "json" or "common".
  #
  # Optional
  # Default: "common"
  #
  # format = "json"

################################################################
# API and dashboard configuration
################################################################

# Enable API and dashboard
[api]

  # Enable the API in insecure mode
  #
  # Optional
  # Default: true
  #
  insecure = true

  # Enabled Dashboard
  #
  # Optional
  # Default: true
  #
  dashboard = true

################################################################
# Ping configuration
################################################################

# Enable ping
[ping]

  # Name of the related entry point
  #
  # Optional
  # Default: "traefik"
  #
  # entryPoint = "traefik"

################################################################
# Docker configuration backend
################################################################

# Enable Docker configuration backend
[providers.docker]

  # Docker server endpoint. Can be a tcp or a unix socket endpoint.
  #
  # Required
  # Default: "unix:///var/run/docker.sock"
  #
  # endpoint = "tcp://10.10.10.10:2375"
  # domain = "xilin.com"
  # Default host rule.
  #
  # Optional
  # Default: "Host(`{{ normalize .Name }}`)"
  #
  #defaultRule = "Host(`{{ normalize .Name }}.docker.localhost`)"
  defaultRule = "Host(`{{ .Name }}.xilin.com`)"

  # Expose containers by default in traefik
  #
  # Optional
  # Default: true
  #
  exposedByDefault = false

敲黑板萄凤,注:

  • traefik有默認的defaultRule = "Host({{ normalize .Name }}.docker.localhost)"
    他產生的域名應該是 serviceName - userName.docker.loalhost室抽。
  • 但你更依靠docker-compose.yml中的labels讓traefik為你工作, 注意labels 的書寫方式靡努,網(wǎng)上有很多文章不一樣坪圾,應該是版本的差異,注意自己的使用環(huán)境惑朦。
    labels:
    - "traefik.http.routers.phpmyadmin.rule=Host(pma.xilin.com)"
    "traefik.http.services.rabbitmq.loadbalancer.server.port" 指定被代理的端口
    traefik2 的界面比1的漂亮多了
    1.png
2.png
3.png

至于 traefik 的中間層下次吧兽泄。

附錄:

labels:
  - "traefik.enable=true"
  - "traefik.docker.network=foobar"
  - "traefik.docker.lbswarm=true"
  - "traefik.http.middlewares.middleware00.addprefix.prefix=foobar"
  - "traefik.http.middlewares.middleware01.basicauth.headerfield=foobar"
  - "traefik.http.middlewares.middleware01.basicauth.realm=foobar"
  - "traefik.http.middlewares.middleware01.basicauth.removeheader=true"
  - "traefik.http.middlewares.middleware01.basicauth.users=foobar, foobar"
  - "traefik.http.middlewares.middleware01.basicauth.usersfile=foobar"
  - "traefik.http.middlewares.middleware02.buffering.maxrequestbodybytes=42"
  - "traefik.http.middlewares.middleware02.buffering.maxresponsebodybytes=42"
  - "traefik.http.middlewares.middleware02.buffering.memrequestbodybytes=42"
  - "traefik.http.middlewares.middleware02.buffering.memresponsebodybytes=42"
  - "traefik.http.middlewares.middleware02.buffering.retryexpression=foobar"
  - "traefik.http.middlewares.middleware03.chain.middlewares=foobar, foobar"
  - "traefik.http.middlewares.middleware04.circuitbreaker.expression=foobar"
  - "traefik.http.middlewares.middleware05.compress=true"
  - "traefik.http.middlewares.middleware06.digestauth.headerfield=foobar"
  - "traefik.http.middlewares.middleware06.digestauth.realm=foobar"
  - "traefik.http.middlewares.middleware06.digestauth.removeheader=true"
  - "traefik.http.middlewares.middleware06.digestauth.users=foobar, foobar"
  - "traefik.http.middlewares.middleware06.digestauth.usersfile=foobar"
  - "traefik.http.middlewares.middleware07.errors.query=foobar"
  - "traefik.http.middlewares.middleware07.errors.service=foobar"
  - "traefik.http.middlewares.middleware07.errors.status=foobar, foobar"
  - "traefik.http.middlewares.middleware08.forwardauth.address=foobar"
  - "traefik.http.middlewares.middleware08.forwardauth.authresponseheaders=foobar, foobar"
  - "traefik.http.middlewares.middleware08.forwardauth.tls.ca=foobar"
  - "traefik.http.middlewares.middleware08.forwardauth.tls.caoptional=true"
  - "traefik.http.middlewares.middleware08.forwardauth.tls.cert=foobar"
  - "traefik.http.middlewares.middleware08.forwardauth.tls.insecureskipverify=true"
  - "traefik.http.middlewares.middleware08.forwardauth.tls.key=foobar"
  - "traefik.http.middlewares.middleware08.forwardauth.trustforwardheader=true"
  - "traefik.http.middlewares.middleware09.headers.accesscontrolallowcredentials=true"
  - "traefik.http.middlewares.middleware09.headers.accesscontrolallowheaders=foobar, foobar"
  - "traefik.http.middlewares.middleware09.headers.accesscontrolallowmethods=foobar, foobar"
  - "traefik.http.middlewares.middleware09.headers.accesscontrolalloworigin=foobar"
  - "traefik.http.middlewares.middleware09.headers.accesscontrolexposeheaders=foobar, foobar"
  - "traefik.http.middlewares.middleware09.headers.accesscontrolmaxage=42"
  - "traefik.http.middlewares.middleware09.headers.addvaryheader=true"
  - "traefik.http.middlewares.middleware09.headers.allowedhosts=foobar, foobar"
  - "traefik.http.middlewares.middleware09.headers.browserxssfilter=true"
  - "traefik.http.middlewares.middleware09.headers.contentsecuritypolicy=foobar"
  - "traefik.http.middlewares.middleware09.headers.contenttypenosniff=true"
  - "traefik.http.middlewares.middleware09.headers.custombrowserxssvalue=foobar"
  - "traefik.http.middlewares.middleware09.headers.customframeoptionsvalue=foobar"
  - "traefik.http.middlewares.middleware09.headers.customrequestheaders.name0=foobar"
  - "traefik.http.middlewares.middleware09.headers.customrequestheaders.name1=foobar"
  - "traefik.http.middlewares.middleware09.headers.customresponseheaders.name0=foobar"
  - "traefik.http.middlewares.middleware09.headers.customresponseheaders.name1=foobar"
  - "traefik.http.middlewares.middleware09.headers.featurepolicy=foobar"
  - "traefik.http.middlewares.middleware09.headers.forcestsheader=true"
  - "traefik.http.middlewares.middleware09.headers.framedeny=true"
  - "traefik.http.middlewares.middleware09.headers.hostsproxyheaders=foobar, foobar"
  - "traefik.http.middlewares.middleware09.headers.isdevelopment=true"
  - "traefik.http.middlewares.middleware09.headers.publickey=foobar"
  - "traefik.http.middlewares.middleware09.headers.referrerpolicy=foobar"
  - "traefik.http.middlewares.middleware09.headers.sslforcehost=true"
  - "traefik.http.middlewares.middleware09.headers.sslhost=foobar"
  - "traefik.http.middlewares.middleware09.headers.sslproxyheaders.name0=foobar"
  - "traefik.http.middlewares.middleware09.headers.sslproxyheaders.name1=foobar"
  - "traefik.http.middlewares.middleware09.headers.sslredirect=true"
  - "traefik.http.middlewares.middleware09.headers.ssltemporaryredirect=true"
  - "traefik.http.middlewares.middleware09.headers.stsincludesubdomains=true"
  - "traefik.http.middlewares.middleware09.headers.stspreload=true"
  - "traefik.http.middlewares.middleware09.headers.stsseconds=42"
  - "traefik.http.middlewares.middleware10.ipwhitelist.ipstrategy.depth=42"
  - "traefik.http.middlewares.middleware10.ipwhitelist.ipstrategy.excludedips=foobar, foobar"
  - "traefik.http.middlewares.middleware10.ipwhitelist.sourcerange=foobar, foobar"
  - "traefik.http.middlewares.middleware11.inflightreq.amount=42"
  - "traefik.http.middlewares.middleware11.inflightreq.sourcecriterion.ipstrategy.depth=42"
  - "traefik.http.middlewares.middleware11.inflightreq.sourcecriterion.ipstrategy.excludedips=foobar, foobar"
  - "traefik.http.middlewares.middleware11.inflightreq.sourcecriterion.requestheadername=foobar"
  - "traefik.http.middlewares.middleware11.inflightreq.sourcecriterion.requesthost=true"
  - "traefik.http.middlewares.middleware12.passtlsclientcert.info.issuer.commonname=true"
  - "traefik.http.middlewares.middleware12.passtlsclientcert.info.issuer.country=true"
  - "traefik.http.middlewares.middleware12.passtlsclientcert.info.issuer.domaincomponent=true"
  - "traefik.http.middlewares.middleware12.passtlsclientcert.info.issuer.locality=true"
  - "traefik.http.middlewares.middleware12.passtlsclientcert.info.issuer.organization=true"
  - "traefik.http.middlewares.middleware12.passtlsclientcert.info.issuer.province=true"
  - "traefik.http.middlewares.middleware12.passtlsclientcert.info.issuer.serialnumber=true"
  - "traefik.http.middlewares.middleware12.passtlsclientcert.info.notafter=true"
  - "traefik.http.middlewares.middleware12.passtlsclientcert.info.notbefore=true"
  - "traefik.http.middlewares.middleware12.passtlsclientcert.info.sans=true"
  - "traefik.http.middlewares.middleware12.passtlsclientcert.info.subject.commonname=true"
  - "traefik.http.middlewares.middleware12.passtlsclientcert.info.subject.country=true"
  - "traefik.http.middlewares.middleware12.passtlsclientcert.info.subject.domaincomponent=true"
  - "traefik.http.middlewares.middleware12.passtlsclientcert.info.subject.locality=true"
  - "traefik.http.middlewares.middleware12.passtlsclientcert.info.subject.organization=true"
  - "traefik.http.middlewares.middleware12.passtlsclientcert.info.subject.province=true"
  - "traefik.http.middlewares.middleware12.passtlsclientcert.info.subject.serialnumber=true"
  - "traefik.http.middlewares.middleware12.passtlsclientcert.pem=true"
  - "traefik.http.middlewares.middleware13.ratelimit.average=42"
  - "traefik.http.middlewares.middleware13.ratelimit.burst=42"
  - "traefik.http.middlewares.middleware13.ratelimit.sourcecriterion.ipstrategy.depth=42"
  - "traefik.http.middlewares.middleware13.ratelimit.sourcecriterion.ipstrategy.excludedips=foobar, foobar"
  - "traefik.http.middlewares.middleware13.ratelimit.sourcecriterion.requestheadername=foobar"
  - "traefik.http.middlewares.middleware13.ratelimit.sourcecriterion.requesthost=true"
  - "traefik.http.middlewares.middleware14.redirectregex.permanent=true"
  - "traefik.http.middlewares.middleware14.redirectregex.regex=foobar"
  - "traefik.http.middlewares.middleware14.redirectregex.replacement=foobar"
  - "traefik.http.middlewares.middleware15.redirectscheme.permanent=true"
  - "traefik.http.middlewares.middleware15.redirectscheme.port=foobar"
  - "traefik.http.middlewares.middleware15.redirectscheme.scheme=foobar"
  - "traefik.http.middlewares.middleware16.replacepath.path=foobar"
  - "traefik.http.middlewares.middleware17.replacepathregex.regex=foobar"
  - "traefik.http.middlewares.middleware17.replacepathregex.replacement=foobar"
  - "traefik.http.middlewares.middleware18.retry.attempts=42"
  - "traefik.http.middlewares.middleware19.stripprefix.forceslash=true"
  - "traefik.http.middlewares.middleware19.stripprefix.prefixes=foobar, foobar"
  - "traefik.http.middlewares.middleware20.stripprefixregex.regex=foobar, foobar"
  - "traefik.http.routers.router0.entrypoints=foobar, foobar"
  - "traefik.http.routers.router0.middlewares=foobar, foobar"
  - "traefik.http.routers.router0.priority=42"
  - "traefik.http.routers.router0.rule=foobar"
  - "traefik.http.routers.router0.service=foobar"
  - "traefik.http.routers.router0.tls=true"
  - "traefik.http.routers.router0.tls.certresolver=foobar"
  - "traefik.http.routers.router0.tls.domains[0].main=foobar"
  - "traefik.http.routers.router0.tls.domains[0].sans=foobar, foobar"
  - "traefik.http.routers.router0.tls.domains[1].main=foobar"
  - "traefik.http.routers.router0.tls.domains[1].sans=foobar, foobar"
  - "traefik.http.routers.router0.tls.options=foobar"
  - "traefik.http.routers.router1.entrypoints=foobar, foobar"
  - "traefik.http.routers.router1.middlewares=foobar, foobar"
  - "traefik.http.routers.router1.priority=42"
  - "traefik.http.routers.router1.rule=foobar"
  - "traefik.http.routers.router1.service=foobar"
  - "traefik.http.routers.router1.tls=true"
  - "traefik.http.routers.router1.tls.certresolver=foobar"
  - "traefik.http.routers.router1.tls.domains[0].main=foobar"
  - "traefik.http.routers.router1.tls.domains[0].sans=foobar, foobar"
  - "traefik.http.routers.router1.tls.domains[1].main=foobar"
  - "traefik.http.routers.router1.tls.domains[1].sans=foobar, foobar"
  - "traefik.http.routers.router1.tls.options=foobar"
  - "traefik.http.services.service01.loadbalancer.healthcheck.headers.name0=foobar"
  - "traefik.http.services.service01.loadbalancer.healthcheck.headers.name1=foobar"
  - "traefik.http.services.service01.loadbalancer.healthcheck.hostname=foobar"
  - "traefik.http.services.service01.loadbalancer.healthcheck.interval=foobar"
  - "traefik.http.services.service01.loadbalancer.healthcheck.path=foobar"
  - "traefik.http.services.service01.loadbalancer.healthcheck.port=42"
  - "traefik.http.services.service01.loadbalancer.healthcheck.scheme=foobar"
  - "traefik.http.services.service01.loadbalancer.healthcheck.timeout=foobar"
  - "traefik.http.services.service01.loadbalancer.passhostheader=true"
  - "traefik.http.services.service01.loadbalancer.responseforwarding.flushinterval=foobar"
  - "traefik.http.services.service01.loadbalancer.sticky=true"
  - "traefik.http.services.service01.loadbalancer.sticky.cookie.httponly=true"
  - "traefik.http.services.service01.loadbalancer.sticky.cookie.name=foobar"
  - "traefik.http.services.service01.loadbalancer.sticky.cookie.secure=true"
  - "traefik.http.services.service01.loadbalancer.server.port=foobar"
  - "traefik.http.services.service01.loadbalancer.server.scheme=foobar"
  - "traefik.tcp.routers.tcprouter0.entrypoints=foobar, foobar"
  - "traefik.tcp.routers.tcprouter0.rule=foobar"
  - "traefik.tcp.routers.tcprouter0.service=foobar"
  - "traefik.tcp.routers.tcprouter0.tls=true"
  - "traefik.tcp.routers.tcprouter0.tls.certresolver=foobar"
  - "traefik.tcp.routers.tcprouter0.tls.domains[0].main=foobar"
  - "traefik.tcp.routers.tcprouter0.tls.domains[0].sans=foobar, foobar"
  - "traefik.tcp.routers.tcprouter0.tls.domains[1].main=foobar"
  - "traefik.tcp.routers.tcprouter0.tls.domains[1].sans=foobar, foobar"
  - "traefik.tcp.routers.tcprouter0.tls.options=foobar"
  - "traefik.tcp.routers.tcprouter0.tls.passthrough=true"
  - "traefik.tcp.routers.tcprouter1.entrypoints=foobar, foobar"
  - "traefik.tcp.routers.tcprouter1.rule=foobar"
  - "traefik.tcp.routers.tcprouter1.service=foobar"
  - "traefik.tcp.routers.tcprouter1.tls=true"
  - "traefik.tcp.routers.tcprouter1.tls.certresolver=foobar"
  - "traefik.tcp.routers.tcprouter1.tls.domains[0].main=foobar"
  - "traefik.tcp.routers.tcprouter1.tls.domains[0].sans=foobar, foobar"
  - "traefik.tcp.routers.tcprouter1.tls.domains[1].main=foobar"
  - "traefik.tcp.routers.tcprouter1.tls.domains[1].sans=foobar, foobar"
  - "traefik.tcp.routers.tcprouter1.tls.options=foobar"
  - "traefik.tcp.routers.tcprouter1.tls.passthrough=true"
  - "traefik.tcp.services.tcpservice01.loadbalancer.terminationdelay=42"
  - "traefik.tcp.services.tcpservice01.loadbalancer.server.port=foobar"
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市漾月,隨后出現(xiàn)的幾起案子病梢,更是在濱河造成了極大的恐慌,老刑警劉巖梁肿,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜓陌,死亡現(xiàn)場離奇詭異,居然都是意外死亡吩蔑,警方通過查閱死者的電腦和手機钮热,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哥纫,“玉大人霉旗,你說我怎么就攤上這事≈В” “怎么了厌秒?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長擅憔。 經常有香客問我鸵闪,道長,這世上最難降的妖魔是什么暑诸? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任蚌讼,我火速辦了婚禮,結果婚禮上个榕,老公的妹妹穿的比我還像新娘篡石。我一直安慰自己,他們只是感情好西采,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布凰萨。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胖眷。 梳的紋絲不亂的頭發(fā)上武通,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音珊搀,去河邊找鬼冶忱。 笑死,一個胖子當著我的面吹牛境析,可吹牛的內容都是我干的囚枪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼簿晓,長吁一口氣:“原來是場噩夢啊……” “哼眶拉!你這毒婦竟也來了?” 一聲冷哼從身側響起憔儿,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤忆植,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谒臼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朝刊,經...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年蜈缤,在試婚紗的時候發(fā)現(xiàn)自己被綠了拾氓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡底哥,死狀恐怖咙鞍,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情趾徽,我是刑警寧澤续滋,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站孵奶,受9級特大地震影響疲酌,放射性物質發(fā)生泄漏。R本人自食惡果不足惜了袁,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一朗恳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧载绿,春花似錦粥诫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽劝堪。三九已至,卻和暖如春揉稚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背熬粗。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工搀玖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人驻呐。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓灌诅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親含末。 傳聞我的和親對象是個殘疾皇子猜拾,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355