中间件简介

一、mysql

1、什么是mysql 数据库

​ msyql 是一种开放源代码的关系型数据库系统(RDBMS),使用最常见的数据库管理语句(结构化查询语言)进行数据库管理。

​ mysql是由sql接口,解释器,优化器,缓存,存储引擎组成

2、mysql原理

image.png

connectors:交互接口

Management Serveices & Utilities:系统管理和控制工具

Connection Pool (连接池):管理缓冲用户连接,线程处理等需要缓存的需求

SQL Interface (SQL接口):接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface

Parser (解析器):SQL命令传递到解析器的时候会被解析器验证和解析。

Optimizer (查询优化器):SQL语句在查询之前会使用查询优化器对查询进行优化(产生多种执行计划,最终数据库会选择最优化的方案去执行,尽快返会结果) 他使用的是“选取-投影-联接”策略进行查询。

Cache和Buffer (查询缓存):如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等

Engine (存储引擎):存储引擎是MySql中具体的与文件打交道的子系统。也是Mysql最具有特色的一个地方。

程序的请求会通过mysql的connectors与其进行交互,请求到处后,会暂时存放在连接池(connection pool)中并由处理器(Management Serveices & Utilities)管理。当该请求从等待队列进入到处理队列,管理器会将该请求丢给SQL接口(SQL Interface)。SQL接口接收到请求后,它会将请求进行hash处理并与缓存中的结果进行对比,如果完全匹配则通过缓存直接返回处理结果;否则,需要完整的走一趟流程:

(1)由SQL接口丢给后面的解释器(Parser),解释器会判断SQL语句正确与否,若正确则将其转化为数据结构。

(2)解释器处理完,便来到后面的优化器(Optimizer),它会产生多种执行计划,最终数据库会选择最优化的方案去执行,尽快返会结果。

(3)确定最优执行计划后,SQL语句此时便可以交由存储引擎(Engine)处理,存储引擎将会到后端的存储设备中取得相应的数据,并原路返回给程序。

3、优点

  • 可移植性好
  • 支持多操作系统
  • 支持多线程
  • 多种变成语言提供api
  • 优化 sql算法,提高了查询速度
  • mysql内提供很多管理工具

4、适用场景

关系型数据库使用场景:

  • 需要做复杂处理数据;
  • 数据量不是特别大的数据;
  • 对安全性能要求高的数据;
  • 数据格式单一的数据;

非关系型数据库使用场景

  • 适合存储非结构化数据存储,数据量且不可预期。如:评论,文章
  • 排行榜数据获取,实时更新的数据。如:游戏榜排名,用户投票
  • 限时抢购活动。如:淘宝抢购活动
  • 反垃圾系统。如:敏感词
  • 消息实时推送。如:微博推送
  • 缓存。如:热点数据

(1)单节点

  • 很多个人站点,初创公司,小型内部系统,考虑到成本,更新频率,系统重要性等问题,系统只依赖一个单例数据库提供服务,基本已经满足需求。
  • 单节点场景应关注:数据备份,数据还原,备份监控,数据文件远程存储。

(2)一主一从

  • 考虑一主一从的多数初衷是系统性能和系统高可用性问题

(3)一主n从

  • 一旦开始考虑一主多从的服务器架构,则证明你的系统对可用性、一致性、性能中一种或者多种的要求比较高。好多系统在开始搭建的时候都会往这个方向看齐,这样“看起来”系统会健壮很多。一主n从关注的重点是:数据一致性、脑裂、雪崩、连接池管理

二、postgresql

1、介绍

​ postgresql 是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),不仅包括RDBMS所具有的特征,比如事务,触发器,视图,外键,锁机制还具有独有的特性,如用户定义的类型,继承性和规则

2、原理

image.png
image.png
  • 主进程 Postmaster

    是整个数据库实例的总控进程,负责启动和关闭该数据库实例

  • 辅助进程:SysLogger(系统日志)进程、BgWriter(后台写)进程、WALWrite(预写式日志)进程、PgArch(归档)进程、AutoVacuum(系统自动清理)进程、PgStat(统计收集)进程、CheckPoint()进程

3、特点,优点

  • 支持多操作系统
  • 支持SQL的许多功能,例如复杂的SQL查询,子查询,外键,触发器,视图,视图,多进程并发控制(MVCC)、异步复制。(MVCC,Multi-Version Concurrency Control)
  • 良好的可扩展性,可以自定义数据类型、索引类型等,同时也能开发一系列的功能插件
  • 支持文本,图片,视频,声音等

4、适用场景

100TB 数据量以内,OLTP和OLAP的混合场景,可以选择PostgreSQL。
超过100TB,OLAP可以选择Greenplum。
超过100TB,OLTP可以选择基于PostgreSQL的分库分表。
PostgreSQL 的特性较多,BUG较少。
比如窗口查询,分组聚合,CUBE,地理位置,几何类型,图类型,机器学习库,医学类型,流式数据分析,哈希JOIN,MERGE JOIN,JSON类型,multi master,IP地址类型,ISBN类型,外部表(可以直接读写mysql, oracle, sqlserver, mongodb, redis, WWW, HADOOP等几乎所有数据源)。
如果你对PostgreSQL熟悉的话,可以优先考虑PG。

OLTP(on-line transacation processing):联机事务处理,主要是执行基本日常的事务处理,比如数据库记录的增删改查;实时性要求高,数据量不是很大,交易一般是明确的,高并发。

OLAP(on-line analytical processing):联机分析处理,是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果;实时性要求不是很高,数据量大,重点是通过数据提供决策支持,所以查询一般都是动态,自定义的。

三、redis

1、介绍

​ redis(remote dictionary server)是一个键值存储的高速缓存数据库。整个数据库系统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。

2、原理

。。。。。。

3、特征优点

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
  • 支持五种数据类型:string,hash,list,set, sorted set(zset)

4、应用场景

  • 会话缓存
  • 消息队列 —支付
  • 活动排行榜或计数
  • 发布,订阅消息— 消息通知
  • 商品列表,评论列表

四、MongoDB

1、介绍

​ MongoDB是一个基于分部署文件存储的数据库,由c++语言编写。旨在为web应用提供可扩展的高性能数据存储解决方案。

2、原理

https://blog.csdn.net/baijiwei/article/details/78128632

读过程

  • 生成语法树(matchExpression)
  • 逻辑优化过程,由MatchExpression 生成 CanoncalQuery
  • 生成查询计划,由CanoncalQuery生成QuerySolution和 MultiPlanStage
  • 生成planExecutor
  • 执行计划

写过程

3、特征,优点

  • MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
  • 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。
  • 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
  • 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
  • Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
  • MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
  • Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
  • Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
  • Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
  • GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
  • MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
  • MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
  • MongoDB安装简单

4、应用场景

  • 网站实时数据处理。它非常适合实时的插入、更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性
  • 缓存。由于性能很高,它适合作为信息基础设施的缓存层。在系统重启之后,由它搭建的持久化缓存层可以避免下层的数据源过载
  • 高伸缩性的场景。非常适合由数十或数百台服务器组成的数据库,它的路线图中已经包含对MapReduce引擎的内置支持

不适合的场景:

  • 要求高度事务性的系统
  • 传统的商业智能应用
  • 复杂的跨文档(表)级联查询

五、es

1、什么是es

es是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎Apache lucene基础上的搜索引擎。不仅包括了全文搜索功能,还可以进行一下工作:

  • 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索
  • 实时分析非分布式搜索引擎
  • 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据

2、原理

涉及概念:索引,类型,文档,字段,倒排索引

倒排索引原理:

  • 正向索引:用户在主页上搜索关键词“华为手机”时,假设只存在正向索引(forward index),那么就需要扫描索引库中的所有文档,找出所有包含关键词“华为手机”的文档,再根据打分模型进行打分,排出名次后呈现给用户

    文档1”的ID > 单词1:出现次数,出现位置列表

    “文档2”的ID > 此文档出现的关键词列表。

    一般是通过key,去找value

  • 倒排索引:

    “关键词1”:“文档1”的ID,“文档2”的ID

    “关键词2”:带有此关键词的文档ID列表。

    从词的关键字,去找文档

3、es特征优点

  • 高度的可伸缩性:可以搭建大型的分布式集群,处理PB级的数据服务于大公司,也可以运行在单机上,服务于小公司

  • ES本身不是新技术,而是将全文检索、数据分析、分布式技术融合在一起而形成的,lucene(全文检索)

    商用的数据分析软件(也是有的),

    分布式数据库(mycat)

  • 开箱即用、搭建简单

  • 与数据库互补:复杂数据分析,海量数据的近实时处理;Elasticsearch作为传统数据库的一个补充,提供了数据库所不能提供的很多功能

  • 高可用提供复制(replica)机制,一个分片可以设置多个复制,使得某台服务器宕机的情况下,集群仍旧可以照常运行。

4、应用场景

  • 维基百科
  • The Guardian(国外新闻网站)
  • Stack Overflow(国外的程序异常讨论论坛)
  • GitHub(开源代码管理)
  • 电商网站
  • 日志数据分析
  • 商品价格监控网站
  • BI系统(Business intelligence 商业智能)

5、常用命令

命令 描述
查看es集群统计信息 curl -XGET 'http://localhost:9200/_cluster/stats?pretty'
查看所有索引 curl 'localhost:9200/_cat/indices?v'
查看集群的节点列表 curl 'localhost:9200/_cat/nodes?v'
检查集群状态 curl 'localhost:9200/_cat/health?v'
获取数据 curl -XGET 'localhost:9200/customer/external/1?pretty' #获取customer索引下类型为external,id为1的数据,pretty参数表示返回结果格式
创建索引 curl -XPUT 'localhost:9200/customer?pretty'
删除索引 curl -XGET 'localhost:9200/customer/external/1?pretty'
插入数据 curl -XPUT 'localhost:9200/customer/external/1?pretty' d
查询数据 curl 'localhost:9200/bank/_search?q=*&pretty'<br />#返回所有bank中的索引数据,其中q=*
https://blog.csdn.net/zhuoshengda/article/details/90378466

六、elk

what

​ ELK是elasticsearch,logstash,kibana三大开源框架首写字母简称。是一个日志分析架构技术栈总称,但实际上ELK不仅仅适用于日志分析,它还可以支持其它任何数据分析和收集的场景

how to work

filebeat

image.png

logstash

image.png

es

使用log4j的appender向kafka的topic发送日志信息,同时也记录了文本文件,logstash收到kafka的数据存储起来过滤后交给elasticsearch拿去建立索引分析、检索,最后kibana的web页面来搜索日志、分析出图表等。

kibana

advantages

  • 强大的搜索功能

  • 完善的展示功能

  • 分布式功能

application scenarios

  • 分部署部署项目,需要收集日志
  • 微服务架构项目,收集各个服务的日志
  • 大数据行业

七、nginx

1、what

​ Nginx 是一个使用c语言开发的高性能的HTTP和反向代理web服务器。由俄罗斯的程序员gor sysoev 所开发,官方测试nginx能够支支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定。

2、how to work

​ Nginx由内核和模块组成。Nginx本身做的工作实际很少,当它接到一个HTTP请求时,它仅仅是通过查找配置文件将此次请求映射到一个location block,而此location中所配置的各个指令则会启动不同的模块去完成工作,因此模块可以看做Nginx真正的劳动工作者。通常一个location中的指令会涉及一个handler模块和多个filter模块(当然,多个location可以复用同一个模块)。handler模块负责处理请求,完成响应内容的生成,而filter模块对响应内容进行处理。

用户根据自己的需要开发的模块都属于第三方模块。正是有了这么多模块的支撑,Nginx的功能才会如此强大。

Nginx的模块从结构上分为核心模块、基础模块和第三方模块:

  • 核心模块:HTTP模块、EVENT模块和MAIL模块
  • 基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块,
  • 第三方模块:HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块。

Nginx的模块从功能上分为如下三类:

  • Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。Handlers处理器模块一般只能有一个。
  • Filters (过滤器模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出。
  • Proxies (代理类模块)。此类模块是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如FastCGI等进行交互,实现服务代理和负载均衡等功能。

3、advantages

  • 高并发
  • 内存消耗少
  • 成本低
  • 配置文件简单
  • 支持rewrite
  • 内置健康检查功能
  • 稳定性高
  • 支持热部署
image.png

4、application scenarios

  • http 服务器,Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器
  • 虚拟主机。可以实现在一台服务器虚拟出多个网站
    • 基于端口的,不同的端口
    • 基于域名的,不同域名
  • 反向代理,负载均衡

八、rabbitmq

1、what

RabbitMQ(Advanced Message Queuing Protocol) erlang语言开发,支持持久化消息队列的消息中间件。应用在上下游的层次级业务逻辑中,上级业务逻辑相当于生产者发布消息,下游业务逻辑相当于消费者接受到消息并且消费消息。

2、how to work

image.png
  • Broker:rabbitmq集群节点
  • Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列
  • Queue:消息队列载体,每个消息都会被投入到一个或多个队列
  • binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来
  • Routing Key:路由关键字,exchange根据这个关键字进行消息投递
  • vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离
  • producer:消息生产者,就是投递消息的程序
  • consumer:消息消费者,就是接受消息的程序
  • channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
  1. 客户端连接到消息队列服务器,打开一个channel。
  2. 客户端声明一个exchange,并设置相关属性。
  3. 客户端声明一个queue,并设置相关属性。
  4. 客户端使用routing key,在exchange和queue之间建立好绑定关系。
  5. 客户端投递消息到exchange
  6. exchange接收到消息后,就根据消息的key和已经设由binding,进行消息路里,将消息投递到一个或多个队列里

3、advantages

几种消息队列软件对比:https://www.cnblogs.com/mengchunchen/p/9999774.html

  • 支持集群化,高可用架构,消息高可靠支持
  • 复杂系统的解耦
  • 复杂系统的异步调用
  • 瞬时高峰的削峰处理

4、application scenarios

  • 异步处理
  • 应用解耦
  • 流量削峰

九、kafka

1、what

​ kafka 是一种高吞吐量的分布式发布 订阅消息系统,它可以出来消费者在网站中的所有动作流数据。

2、how to work

image.png

(1)broker

待整理

kafka 常用命令

命令 描述
./kafka-topics.sh --create --topic test1 --replication-factor 2 --partitions 3 --zookeeper hbp001:2181 创建topic
./kafka-topics.sh --zookeeper node01:2181 --alter --topic t_cdr --partitions 10 添加分区
./kafka-topics.sh --zookeeper hbp201:2181 –list 查看所有topic列表
./kafka-topics.sh --zookeeper hbp201:2181 --describe --topic TopicName 查看指定topic信息
./kafka-console-producer.sh --broker-list node86:9092 --topic t_cdr 控制台向topic生产数据
https://www.cnblogs.com/aixinge/p/9456381.html

十、zookeeper

1、what

​ Zookeeper 是一个开源分布式协调服务。ZooKeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。是一个典型的分布式数据一致性解决方案,分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。 一个最常用的使用场景就是用于担任服务生产者和服务消费者的注册中心。即服务生产者将自己提供的服务注册到 ZooKeeper 中心,服务的消费者在进行服务调用的时候先到 ZooKeeper 中查找服务,获取到服务生产者的详细信息之后,再去调用服务生产者的内容与数据

2、how to work

image.png

3、advantages

  • 最终一致性:客户端不论连接到哪个Zookeeper的哪一个节点,都会收到同一份状态
  • 可靠性
  • 实用性
  • wait-free:慢的或者失效的client不得干预快速的client的请求,使得每个client都能有效的等待
  • 原子性
  • 顺序性:包括全局有序和偏序两种:全局有序是指如果在一台server上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面

4、application scenarios

  • 数据发布与订阅
  • 命名空间服务
  • 分布式通知/协调
  • 分布式锁
  • 集群管理

十一、fastdfs

1、what

​ fastDFS 是以C语言开发的一项开源轻量级分布式文件系统,他对文件进行管理,主要功能有:文件存储,文件同步,文件访问(文件上传/下载),特别适合以文件为载体的在线服务,如图片网站,视频网站等

2、how to work

image.png
  • 跟踪服务器(Tracker Server)

    追踪服务器负责接收客户端的请求,选择合适的组合storage server ,tracker server 与 storage server之间也会用心跳机制来检测对方是否活着。
    Tracker需要管理的信息也都放在内存中,并且里面所有的Tracker都是对等的(每个节点地位相等),很容易扩展
    客户端访问集群的时候会随机分配一个Tracker来和客户端交互

  • 存储服务器(Storage Server)

    实际存储数据,分成若干个组(group),实际traker就是管理的storage中的组,而组内机器中则存储数据,group可以隔离不同应用的数据,不同的应用的数据放在不同group里面。

  • 客户端(client)主要是上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。每个客户端服务器都需要安装Nginx

写入数据

写操作的时候,storage会将他所挂载的所有数据存储目录的底下都创建2级子目录,每一级256个总共65536个,新写的文件会以hash的方式被路由到其中某个子目录下,然后将文件数据作为本地文件存储到该目录中

下载文件

当客户端向Tracker发起下载请求时,并不会直接下载,而是先查询storage server(检测同步状态),返回storage server的ip和端口,
然后客户端会带着文件信息(组名,路径,文件名),去访问相关的storage,然后下载文件。

3、advantages

  • 量的存储,主从型分布式存储,存储空间方便拓展;
  • fastDFS对文件内容做hash处理,避免出现重复文件;
  • 然后fastDFS结合Nginx集成, 提供网站效率
  • 需要的计算资源少
  • 支持在线扩容

4、application scenarios

  • 适合用来存储图片,视频,文档
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容