RabbitMQ的幾種常見模式的詳細(xì)介紹和使用---實踐

RabbitMQ的幾種常見模式的詳細(xì)介紹和使用---實踐

官網(wǎng):RabbitMQ

官方文檔:各個模式簡介

RabbitMQ就不詳細(xì)介紹了,以下就是各個模式的原理和實踐操作:

1.安裝配置

查看mq鏡像: docker search rabbitmq:management
下載mq鏡像: docker pull rabbitmq:management
安裝鏡像:docker run -d --name rabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 -p 25672:25672 -p 61613:61613 -p 1883:1883 rabbitmq:management

說明
5672:默認(rèn)的客戶端連接的端口
15672:默認(rèn)的web管理界面的端口
 命令中的【RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin】是web管理平臺的用戶名和密碼
【 -p 15672:15672】 是控制平臺docker映射到系統(tǒng)的對應(yīng)端口
【 -p 5672:5672】 是應(yīng)用程序的訪問端口

訪問地址
http://ip:15672

如果是linux服務(wù)器液肌,首先開放服務(wù)器端口挟炬,例如阿里云鸥滨,先配置安全組:

image-20210926180156983

添加:

image-20210926180312617

開始安裝:

查詢 docker search rabbitmq:management

image-20210926175821524

下載 docker search rabbitmq:management

安裝 docker run -d --name rabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 -p 25672:25672 -p 61613:61613 -p 1883:1883 rabbitmq:management

image-20210926175859729

安裝成功

image-20210926180008591

訪問地址:
http://你的ip:15672

2.測試

先創(chuàng)建一個連接類:

package boot.spring.controller;

import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

/**
 * @description
 * @AUTHER: sk
 * @DATE: 2021/9/26
 **/

public class ConnectionUtil {
    /**
     * 獲取連接
     * @return Connection
     * @throws Exception
     */
    public static Connection getConnection() throws Exception {
        //定義連接工廠
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("你的ip");
        factory.setPort(5672);
        //設(shè)置vhost
        factory.setVirtualHost("/");
        factory.setUsername("admin");
        factory.setPassword("admin");
        //通過工廠獲取連接
        Connection connection = factory.newConnection();
        return connection;
    }
}

2.1簡單模式

一個生產(chǎn)者蒋纬,一個消費者昔驱。

原理圖:
image-20210927094435976

發(fā)送:

package boot.spring.controller.easy;

import boot.spring.controller.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

/**
 * @description 1.簡單模式:一個生產(chǎn)者一個消費者
 * @AUTHER: sk
 * @DATE: 2021/9/26
 **/

public class TestSend {
    public final static String QUEUE_NAME = "test-queue";
    //創(chuàng)建隊列,發(fā)送消息
    public static void main(String[] args) throws Exception {
        //獲取連接
        Connection connection = ConnectionUtil.getConnection();
        //創(chuàng)建通道
        Channel channel = connection.createChannel();
        //聲明創(chuàng)建隊列
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        //消息內(nèi)容
        String message = "Hello World!";
        channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
        System.out.println("發(fā)送消息:"+message);
        //關(guān)閉連接和通道
        channel.close();
        connection.close();
    }

}

image-20210926185732305

生產(chǎn)的一條消息未被消費:

image-20210926185843146

接收:

package boot.spring.controller.easy;

import boot.spring.controller.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.QueueingConsumer;

/**
 * @description 簡單模式一個生產(chǎn)者一個消費者
 * @AUTHER: sk
 * @DATE: 2021/9/26
 **/

public class TestResive {
    //消費者消費消息
    public static void main(String[] args) throws Exception {
        //獲取連接和通道
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();
        //聲明通道
        channel.queueDeclare(TestSend.QUEUE_NAME,false,false,false,null);
        //定義消費者
        QueueingConsumer consumer = new QueueingConsumer(channel);
        //監(jiān)聽隊列
        channel.basicConsume(TestSend.QUEUE_NAME,true,consumer);

        while(true){
            //這個方法會阻塞住,直到獲取到消息
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());
            System.out.println("接收到消息:"+message);
        }
    }
}

image-20210926185917182

已被消費:

image-20210926185945971
2.2 work模式

競爭消費者模式

一個生產(chǎn)者适室,多個消費者,每個消費者獲取到的消息唯一鸥拧,生產(chǎn)的消息會被消費者瓜分茉稠。

原理圖:
image-20210927094551158

生產(chǎn)100條消息:

package boot.spring.controller.work;

import boot.spring.controller.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

/**
 * @description 2.work模式:一個生產(chǎn)者多個消費者
 * @AUTHER: sk
 * @DATE: 2021/9/26
 **/

public class WorkSend2 {
    public final static String QUEUE_NAME = "test2";
    //消息生產(chǎn)者
    public static void main(String[] args) throws Exception {
        //獲取連接和通道
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();
        //聲明隊列
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        String message = "";
        for(int i = 0; i<100; i++){
            message = "" + i;
            channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
            System.out.println("發(fā)送消息:"+message);
            Thread.sleep(i);
        }

        channel.close();
        connection.close();
    }
}
image-20210927095421093

消費者1:

package boot.spring.controller.work;

import boot.spring.controller.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.QueueingConsumer;

/**
 * @description 2.work模式:一個生產(chǎn)者多個消費者
 * @AUTHER: sk
 * @DATE: 2021/9/26
 **/

public class WorkResive1 {

    //消費者1  自動模式
    public static void main(String[] args) throws Exception {
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(WorkSend2.QUEUE_NAME,false,false,false,null);

        //同一時刻服務(wù)器只發(fā)送一條消息給消費端
        channel.basicQos(1);

        QueueingConsumer consumer = new QueueingConsumer(channel);

        channel.basicConsume(WorkSend2.QUEUE_NAME,false,consumer);

        while(true){
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());
            System.out.println("recive1:"+message);
            Thread.sleep(100);
            //消息消費完給服務(wù)器返回確認(rèn)狀態(tài),表示該消息已被消費
            channel.basicAck(delivery.getEnvelope().getDeliveryTag(),false);
        }
    }
}

消費者1卿吐,消費了100條消息中的一半:

image-20210927095602819

消費者2:

package boot.spring.controller.work;

import boot.spring.controller.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.QueueingConsumer;

/**
 * @description 2.work模式:一個生產(chǎn)者多個消費者
 * @AUTHER: sk
 * @DATE: 2021/9/26
 **/

public class WorkResive2 {

    //消費者2  手動模式
    public static void main(String[] args) throws Exception {
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare("test2",false,false,false,null);

        channel.basicQos(1);

        QueueingConsumer consumer = new QueueingConsumer(channel);

        channel.basicConsume("test2",true,consumer);

        while(true){
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());
            System.out.println("recive1:"+message);
            Thread.sleep(10);
            //channel.basicAck(delivery.getEnvelope().getDeliveryTag(),false);
        }
    }
}

消費者2消費了100條消息的另一半:

image-20210927095726835
2.3 訂閱模式

生產(chǎn)者將消息發(fā)送到交換機旁舰,消費者從交換機獲取消息。

原理圖:
image-20210927100245937

生產(chǎn)者發(fā)送消息到交換機:

package boot.spring.controller.exchange;

import boot.spring.controller.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

/**
 * @description 3.訂閱者模式:一個生產(chǎn)者發(fā)送的消息會被多個消費者獲取
 * @AUTHER: sk
 * @DATE: 2021/9/26
 **/

public class Send {
    public static final String EXCHANGE_NAME = "test_exchange_fanout";
    //生產(chǎn)者嗡官,發(fā)送消息到交換機
    public static void main(String[] args) throws Exception {
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();
        //聲明交換機 fanout:交換機類型 主要有fanout,direct,topics三種
        channel.exchangeDeclare(EXCHANGE_NAME,"fanout");

        String message = "訂閱模式:消息007!";
        channel.basicPublish(EXCHANGE_NAME,"",null,message.getBytes());
        System.out.println(message);
        channel.close();
        connection.close();
    }
}

生產(chǎn)者產(chǎn)生的消息:

image-20210927101447291

消費者1:

package boot.spring.controller.exchange;

import boot.spring.controller.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.QueueingConsumer;

/**
 * @description 3.訂閱者模式:一個生產(chǎn)者發(fā)送的消息會被多個消費者獲取
 * @AUTHER: sk
 * @DATE: 2021/9/26
 **/

public class Resive1 {
    //消費者1
    public final static String QUEUE_NAME = "test_queue_exchange_1";
    public static void main(String[] args) throws Exception {
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        //綁定隊列到交換機上
        channel.queueBind(QUEUE_NAME,Send.EXCHANGE_NAME,"");
        channel.basicQos(1);
        QueueingConsumer consumer = new QueueingConsumer(channel);
        channel.basicConsume(QUEUE_NAME,true,consumer);
        while(true){
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());
            System.out.println("消費者1:"+message);
        }
    }
}
image-20210927101551786

消費者2:

package boot.spring.controller.exchange;

import boot.spring.controller.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.QueueingConsumer;

/**
 * @description 3.訂閱者模式:一個生產(chǎn)者發(fā)送的消息會被多個消費者獲取
 * @AUTHER: sk
 * @DATE: 2021/9/26
 **/

public class Resive2 {
    //消費者2
    public final static String QUEUE_NAME = "test_queue_exchange_2";
    public static void main(String[] args) throws Exception {
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        //綁定隊列到交換機上
        channel.queueBind(QUEUE_NAME,Send.EXCHANGE_NAME,"");
        channel.basicQos(1);
        QueueingConsumer consumer = new QueueingConsumer(channel);
        channel.basicConsume(QUEUE_NAME,true,consumer);

        while(true){
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());
            System.out.println("消費者2:"+message);
        }
    }
}
image-20210927101633853

由此可見箭窜,訂閱者模式中,所有的消費者都通過交換機收到了消息衍腥。

2.4 路由模式

生產(chǎn)者發(fā)送消息到隊列中時可自定義一個key磺樱,消費者可根據(jù)key去選擇對應(yīng)的消息,各取所需婆咸。
注意:路由key竹捉,是一種完全匹配,只有匹配到的消費者才能消費消息尚骄。

原理圖:
image-20210927102501361

生產(chǎn)者生產(chǎn)帶key的消息:(key=“dog”)

package boot.spring.controller.rout;

import boot.spring.controller.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

/**
 * @description 4.路由模式:發(fā)送消息到交換機并且要指定路由key
 * @AUTHER: sk
 * @DATE: 2021/9/26
 **/

public class RoutSend {
    public static final String EXCHANGE_NAME = "test_exchange_direct";
    //生產(chǎn)者
    public static void main(String[] args) throws Exception {
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();
        //聲明交換機 fanout:交換機類型 主要有fanout,direct,topics三種
        channel.exchangeDeclare(EXCHANGE_NAME,"direct");

        String message = "路由模式產(chǎn)生的消息!";
        channel.basicPublish(EXCHANGE_NAME,"dog",null,message.getBytes());
        System.out.println(message);
        channel.close();
        connection.close();
    }
}
image-20210927102827292

消費者1:(key=“dog”)

package boot.spring.controller.rout;

import boot.spring.controller.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.QueueingConsumer;

/**
 * @description 4.路由模式:消費者將隊列綁定到交換機時需要指定路由key
 * @AUTHER: sk
 * @DATE: 2021/9/26
 **/

public class RoutResive1 {

    //消費者1
    public final static String QUEUE_NAME = "test_queue_direct_1";
    public static void main(String[] args) throws Exception {
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        //綁定隊列到交換機上,并制定路由鍵為"dog"
        channel.queueBind(QUEUE_NAME, RoutSend.EXCHANGE_NAME,"dog");
        channel.basicQos(1);
        QueueingConsumer consumer = new QueueingConsumer(channel);
        channel.basicConsume(QUEUE_NAME,true,consumer);
        while(true){
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());
            System.out.println("RoutResive1:"+message);
        }
    }
}
image-20210927103033299

消費者2:(key=“cat”)

package boot.spring.controller.rout;

import boot.spring.controller.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.QueueingConsumer;

/**
 * @description 4.路由模式:消費者將隊列綁定到交換機時需要指定路由key
 * @AUTHER: sk
 * @DATE: 2021/9/26
 **/

public class RoutResive2 {

    //消費者2
    public final static String QUEUE_NAME = "test_queue_direct_2";
    public static void main(String[] args) throws Exception {
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        //綁定隊列到交換機上,并制定路由鍵為"cat"
        channel.queueBind(QUEUE_NAME, RoutSend.EXCHANGE_NAME,"cat");
        channel.basicQos(1);
        QueueingConsumer consumer = new QueueingConsumer(channel);
        channel.basicConsume(QUEUE_NAME,true,consumer);
        while(true){
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());
            System.out.println("RoutResive2:"+message);
        }
    }
}
image-20210927103119368

很顯然块差,消費者1獲取到了消息,消費者2并沒有獲取到消息,因為消費者2的key與生產(chǎn)者的key不一致憨闰。

2.5 通配符模式

原理和路由模式類似询兴,只是key值作了模糊匹配而已。

  • *(星號)可以正好代替一個詞起趾。

  • # (hash) 可以代替零個或多個單詞

  • topic交換器通過模式匹配分配消息的路由鍵屬性诗舰,將路由鍵和某個模式進行匹配,此時隊列需要綁定到一個模式上训裆。它將路由鍵和綁定鍵的字符串切分成單詞眶根,這些單詞之間用點隔開。它同樣也會識別兩個通配符:符號“#”和符號“”边琉。#匹配0個或多個單詞属百,匹配一個單詞。如下圖所示:

    20180628164513643

原理圖:
image-20210927103418777

生產(chǎn)者產(chǎn)生消息:

package boot.spring.controller.topic;

import boot.spring.controller.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

/**
 * @description 5.路由模式:發(fā)送消息到交換機并且要指定通配符路由
 * @AUTHER: sk
 * @DATE: 2021/9/26
 **/

public class TopicSend {
    //生產(chǎn)者
    public static final String EXCHANGE_NAME = "test_exchange_topic";

    public static void main(String[] args) throws Exception {
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();
        //聲明交換機 topic:交換機類型
        channel.exchangeDeclare(EXCHANGE_NAME,"topic");
        String message = "通配符模式產(chǎn)生的消息";
        channel.basicPublish(EXCHANGE_NAME,"dog.1",null,message.getBytes());
        System.out.println(message);
        channel.close();
        connection.close();
    }
}
image-20210927104718676

消費者1:

package boot.spring.controller.topic;

import boot.spring.controller.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.QueueingConsumer;

/**
 * @description 5.路由模式:消費者將隊列綁定到交換機時需要指定通配符路由key
 * @AUTHER: sk
 * @DATE: 2021/9/26
 **/

public class TopicResive1 {

    //消費者1
    public final static String QUEUE_NAME = "test_queue_topic_1";
    public static void main(String[] args) throws Exception {
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        //綁定隊列到交換機上,并制定路由鍵匹配規(guī)則為"dog.*"
        channel.queueBind(QUEUE_NAME, TopicSend.EXCHANGE_NAME,"dog.*");
        channel.basicQos(1);
        QueueingConsumer consumer = new QueueingConsumer(channel);
        channel.basicConsume(QUEUE_NAME,true,consumer);

        while(true){
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());
            System.out.println("TopicResive1:"+message);
        }
    }
}
image-20210927104759387

消費者2:

package boot.spring.controller.topic;

import boot.spring.controller.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.QueueingConsumer;

/**
 * @description 5.路由模式:消費者將隊列綁定到交換機時需要指定通配符路由key
 * @AUTHER: sk
 * @DATE: 2021/9/26
 **/

public class TopicResive2 {

    //消費者2
    public final static String QUEUE_NAME = "test_queue_topic_2";
    public static void main(String[] args) throws Exception {
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        //綁定隊列到交換機上,并制定路由鍵匹配規(guī)則為"#.1"
        channel.queueBind(QUEUE_NAME, TopicSend.EXCHANGE_NAME,"#.1");
        channel.basicQos(1);
        QueueingConsumer consumer = new QueueingConsumer(channel);
        channel.basicConsume(QUEUE_NAME,true,consumer);

        while(true){
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());
            System.out.println("TopicResive2:"+message);
        }
    }
}
image-20210927104900197

消費者3:

package boot.spring.controller.topic;

import boot.spring.controller.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.QueueingConsumer;

/**
 * @description 5.路由模式:消費者將隊列綁定到交換機時需要指定通配符路由key
 * @AUTHER: sk
 * @DATE: 2021/9/26
 **/

public class TopicResive3 {

    //消費者3
    public final static String QUEUE_NAME = "test_queue_topic_3";
    public static void main(String[] args) throws Exception {
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        //綁定隊列到交換機上,并制定路由鍵匹配規(guī)則為"cat.#"
        channel.queueBind(QUEUE_NAME, TopicSend.EXCHANGE_NAME,"cat.#");
        channel.basicQos(1);
        QueueingConsumer consumer = new QueueingConsumer(channel);
        channel.basicConsume(QUEUE_NAME,true,consumer);

        while(true){
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());
            System.out.println("TopicResive3:"+message);
        }
    }
}
image-20210927104935796

結(jié)果:消費者1和消費者2可以收到消息变姨,消費者3不能收到消息族扰。

完整代碼地址:

https://github.com/DongFangXiaoYu/springBoot-RabbitMq/tree/master

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市定欧,隨后出現(xiàn)的幾起案子渔呵,更是在濱河造成了極大的恐慌,老刑警劉巖砍鸠,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扩氢,死亡現(xiàn)場離奇詭異,居然都是意外死亡爷辱,警方通過查閱死者的電腦和手機录豺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饭弓,“玉大人双饥,你說我怎么就攤上這事〉芏希” “怎么了咏花?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長夫嗓。 經(jīng)常有香客問我迟螺,道長,這世上最難降的妖魔是什么舍咖? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任矩父,我火速辦了婚禮,結(jié)果婚禮上排霉,老公的妹妹穿的比我還像新娘窍株。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布球订。 她就那樣靜靜地躺著后裸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪冒滩。 梳的紋絲不亂的頭發(fā)上微驶,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天,我揣著相機與錄音开睡,去河邊找鬼因苹。 笑死,一個胖子當(dāng)著我的面吹牛篇恒,可吹牛的內(nèi)容都是我干的扶檐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼胁艰,長吁一口氣:“原來是場噩夢啊……” “哼款筑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起腾么,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤奈梳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哮翘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颈嚼,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡毛秘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年饭寺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叫挟。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡艰匙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抹恳,到底是詐尸還是另有隱情员凝,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布奋献,位于F島的核電站健霹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瓶蚂。R本人自食惡果不足惜糖埋,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窃这。 院中可真熱鬧瞳别,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至馆铁,卻和暖如春跑揉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背埠巨。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工畔裕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乖订。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓扮饶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親乍构。 傳聞我的和親對象是個殘疾皇子甜无,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,562評論 2 349

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