零基础快速入门SpringBoot2.0教程 (四)



一、JMS介绍和使用场景及基础编程模型

  简介:讲解什么是小写队列,JMS的基础知识和使用场景

 1、什么是JMS: Java消息服务(Java Message Service),Java平台中关于面向消息中间件的接口

 2、JMS是一种与厂商无关的 API,用来访问消息收发系统消息,它类似于JDBC(Java Database Connectivity)。这里,JDBC 是可以用来访问许多不同关系数据库的 API

 3、使用场景:

 1)跨平台

 2)多语言

 3)多项目

 4)解耦

 5)分布式事务

 6)流量控制

 7)最终一致性

 8)RPC调用

  上下游对接,数据源变动->通知下属

 4、概念 

 JMS提供者:Apache ActiveMQ、RabbitMQ、Kafka、Notify、MetaQ、RocketMQ

 JMS生产者(Message Producer)

 JMS消费者(Message Consumer)

 JMS消息

 JMS队列

 JMS主题

 JMS消息通常有两种类型:点对点(Point-to-Point)、发布/订阅(Publish/Subscribe)

 5、编程模型

 MQ中需要用的一些类

 ConnectionFactory :连接工厂,JMS 用它创建连接

 Connection :JMS 客户端到JMS Provider 的连接

 Session: 一个发送或接收消息的线程

 Destination :消息的目的地;消息发送给谁.

 MessageConsumer / MessageProducer: 消息接收者,消费者

二、ActiveMQ5.x消息队列基础介绍和安装

  简介:介绍ActiveMQ5.x消息队列基础特性和本地快速安装

  特点:

 1)支持来自Java,C,C ++,C#,Ruby,Perl,Python,PHP的各种跨语言客户端和协议

 2)支持许多高级功能,如消息组,虚拟目标,通配符和复合目标

 3) 完全支持JMS 1.1和J2EE 1.4,支持瞬态,持久,事务和XA消息

 4) Spring支持,ActiveMQ可以轻松嵌入到Spring应用程序中,并使用Spring的XML配置机制进行配置

 5) 支持在流行的J2EE服务器(如TomEE,Geronimo,JBoss,GlassFish和WebLogic)中进行测试

 6) 使用JDBC和高性能日志支持非常快速的持久化

 ...

 1、下载地址:http://activemq.apache.org/activemq-5153-release.html

 2、快速开始:http://activemq.apache.org/getting-started.html

 3、如果我们是32位的机器,就双击win32目录下的activemq.bat,如果是64位机器,则双击win64目录下的activemq.bat

 4、bin目录里面启动 选择对应的系统版本和位数,activeMQ start 启动

 5、启动后访问路径http://127.0.0.1:8161/

 6、用户名和密码默认都是admin

 7、官方案例集合

 https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples

  面板:   

 Name:队列名称。

 Number Of Pending Messages:等待消费的消息个数。

 Number Of Consumers:当前连接的消费者数目

 Messages Enqueued:进入队列的消息总个数,包括出队列的和待消费的,这个数量只增不减。

 Messages Dequeued:已经消费的消息数量。

三、SpringBoot2整合ActiveMQ实战之点对点消息

  简介:SpringBoot2.x整合ActiveMQ实战之点对点消息

 1、官网地址:https://docs.spring.io/spring-boot/docs/<st1:chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on">2.1.0</st1:chsdate>.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-activemq

 2、加入依赖

 <!-- 整合消息队列ActiveMQ -->

 <dependency>

 <groupId>org.springframework.boot</groupId>

 <artifactId>spring-boot-starter-activemq</artifactId>

 </dependency>

 <!-- 如果配置线程池则加入 -->

 <dependency>

 <groupId>org.apache.activemq</groupId>

 <artifactId>activemq-pool</artifactId>

 </dependency>

 3、application.properties配置文件配置

 #整合jms测试,安装在别的机器,防火墙和端口号记得开放

 spring.activemq.broker-url=tcp://127.0.0.1:61616

 #集群配置

 #spring.activemq.broker-url=failover:(tcp://localhost:61616,tcp://localhost:61617)

 spring.activemq.user=admin

 spring.activemq.password=admin

 #下列配置要增加依赖

 spring.activemq.pool.enabled=true

 spring.activemq.pool.max-connections=100

 4、springboot启动类 @EnableJms,开启支持jms

 5、模拟请求

 localhost:8080/api/v1/order?msg=12312321321312

 6、消费者:实时监听对应的队列

 @JmsListener(destination = "order.queue")

四、SpringBoot2整合ActiveMQ实战之发布订阅模式

  简介:SpringBoot整合ActiveMQ实战之发布订阅模式(pub/sub),及同时支持点对点和发布订阅模型

 1、需要加入配置文件,支持发布订阅模型,默认只支持点对点

 #default point to point

 spring.jms.pub-sub-domain=true

  注意点:

 1、默认消费者并不会消费订阅发布类型的消息,这是由于springboot默认采用的是p2p模式进行消息的监听

  修改配置:spring.jms.pub-sub-domain=true

 2、@JmsListener如果不指定独立的containerFactory的话是只能消费queue消息

  修改订阅者container:containerFactory="jmsListenerContainerTopic"

 //需要给topic定义独立的JmsListenerContainer

 @Bean

 public JmsListenerContainerFactory<?> jmsListenerContainerTopic(ConnectionFactory activeMQConnectionFactory) {

 DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory();

 bean.setPubSubDomain(true);

 bean.setConnectionFactory(activeMQConnectionFactory);

 return bean;

 }

  在配置文件里面,注释掉 #spring.jms.pub-sub-domain=true

五、RocketMQ4.x消息队列介绍

  简介:阿里开源消息队列 RocketMQ4.x介绍和新概念讲解

 1、Apache RocketMQ作为阿里开源的一款高性能、高吞吐量的分布式消息中间件

 2、特点

 1)在高压下1毫秒内响应延迟超过99.6%。

 2)适合金融类业务,高可用性跟踪和审计功能。

 3)支持发布订阅模型,和点对点

 4)支持拉pull和推push两种消息模式

 5)单一队列百万消息

 6)支持单master节点,多master节点,多master多slave节点

 ...

 3、概念

 Producer:消息生产者

 Producer Group:消息生产者组,发送同类消息的一个消息生产组

 Consumer:消费者

 Consumer Group:消费同个消息的多个实例

 Tag:标签,子主题(二级分类),用于区分同一个主题下的不同业务的消息

 Topic:主题

 Message:消息

 Broker:MQ程序,接收生产的消息,提供给消费者消费的程序

 Name Server:给生产和消费者提供路由信息,提供轻量级的服务发现和路由         

 3、官网地址:http://rocketmq.apache.org/

  学习资源:

 1)http://jm.taobao.org/<st1:chsdate year="2017" month="1" day="12" islunardate="False" isrocdate="False" w:st="on">2017/01/12</st1:chsdate>/rocketmq-quick-start-in-10-minutes/ 

 2)[https://www.jianshu.com/p/453c6e7ff81c](https://www.jianshu.com/p/453c6e7ff81c)

六、RocketMQ4.x本地快速部署

  简介:RocketMQ4.x本地快速部署

 1、安装前提条件(推荐)

 64bit OS, Linux/Unix/Mac

 64bit JDK 1.8+;

 2、快速开始 http://rocketmq.apache.org/docs/quick-start/

  下载安装包:https://www.apache.org/dyn/closer.cgi?path=rocketmq/<st1:chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on">4.2.0</st1:chsdate>/rocketmq-all-4.2.0-bin-release.zip

  路径:/Users/jack/Desktop/person/springboot/资料/第13章/第5课/rocketmq-all-<st1:chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on">4.2.0</st1:chsdate>-bin-release/bin

 3、解压压缩包

 1)进入bin目录,启动namesrv

 nohup sh mqnamesrv &

 2) 查看日志 tail -f nohup.out

  结尾:The Name Server boot success. serializeType=JSON 表示启动成功

 3、启动broker  

 nohup sh mqbroker -n 127.0.0.1:9876 &

 4)、关闭nameserver broker执行的命令

 sh mqshutdown namesrv

 sh mqshutdown broker

七、RoekerMQ4.x可视化控制台讲解

  简介:RoekerMQ4.x可视化控制台讲解

 1、下载 https://github.com/apache/rocketmq-externals

 2、编译打包 mvn clean package -Dmaven.test.skip=true

 3、target目录 通过java -jar的方式运行

 4、无法连接获取broker信息

 1)修改配置文件,名称路由地址为 namesrvAddr,例如我本机为

 2)src/main/resources/application.properties

 rocketmq.config.namesrvAddr=192.168.0.101:9876

 5、默认端口 localhost:8080

 6、注意:

  在阿里云,腾讯云或者虚拟机,记得检查端口号和防火墙是否启动

八、Springboot2整合RocketMQ4.x实战上集

  简介:Springboot2.x整合RocketMQ4.x实战,加入相关依赖,开发生产者代码

  启动nameser和broker

 1、加入相关依赖

 <dependency>

 <groupId>org.apache.rocketmq</groupId>

 <artifactId>rocketmq-client</artifactId>

 <version>${rocketmq.version}</version>

 </dependency>

 <dependency>

 <groupId>org.apache.rocketmq</groupId>

 <artifactId>rocketmq-common</artifactId>

 <version>${rocketmq.version}</version>

 </dependency>

 2、application.properties加入配置文件            

 # 消费者的组名

 apache.rocketmq.consumer.PushConsumer=orderConsumer

 # 生产者的组名

 apache.rocketmq.producer.producerGroup=Producer

 # NameServer地址

 apache.rocketmq.namesrvAddr=127.0.0.1:9876

 3、开发MsgProducer

 /**

 * 生产者的组名

 */

 @Value("${apache.rocketmq.producer.producerGroup}")

 private String producerGroup;

 /**

 * NameServer 地址

 */

 @Value("${apache.rocketmq.namesrvAddr}")

 private String namesrvAddr;

 private DefaultMQProducer producer ;

 public DefaultMQProducer getProducer(){

 return this.producer;

 }

 @PostConstruct

 public void defaultMQProducer() {

 //生产者的组名

 producer = new DefaultMQProducer(producerGroup);

 //指定NameServer地址,多个地址以 ; 隔开

 //如 producer.setNamesrvAddr("192.168.100.141:9876;192.168.100.142:9876;192.168.100.149:9876");

 producer.setNamesrvAddr(namesrvAddr);

 producer.setVipChannelEnabled(false);

 try {

 /**

 * Producer对象在使用之前必须要调用start初始化,只能初始化一次

 */

 producer.start();

 } catch (Exception e) {

 e.printStackTrace();

 }

 // producer.shutdown(); 一般在应用上下文,关闭的时候进行关闭,用上下文监听器

 }

九、Springboot2整合RocketMQ4.x实战下集

  简介:Springboot2.x整合RocketMQ4.x实战,开发消费者代码,常见问题处理

 1、创建消费者

  问题:

 1、Caused by: org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to <172.17.42.1:10911> failed

 2、com.alibaba.rocketmq.client.exception.MQClientException: Send [1] times, still failed, cost [1647]ms, Topic: TopicTest1, BrokersSent: [broker-a, null, null]

 3、org.apache.rocketmq.client.exception.MQClientException: Send [3] times, still failed, cost [497]ms, Topic: TopicTest, BrokersSent: [chenyaowudeMacBook-Air.local, chenyaowudeMacBook-Air.local, chenyaowudeMacBook-Air.local]

  解决:多网卡问题处理

 1、设置producer: producer.setVipChannelEnabled(false);

 2、编辑ROCKETMQ 配置文件:broker.conf(下列ip为自己的ip)

 namesrvAddr = 192.168.0.101:9876

 brokerIP1 = 192.168.0.101

 4、DESC: service not available now, maybe disk full, CL:

  解决:修改启动脚本runbroker.sh,在里面增加一句话即可:            

 JAVA_OPT="${JAVA_OPT} -Drocketmq.broker.diskSpaceWarningLevelRatio=0.98"

  (磁盘保护的百分比设置成98%,只有磁盘空间使用率达到98%时才拒绝接收producer消息)

  常见问题处理:

 https://blog.csdn.net/sqzhao/article/details/54834761

 https://blog.csdn.net/mayifan0/article/details/67633729

 [https://blog.csdn.net/a906423355/article/details/78192828](https://blog.csdn.net/a906423355/article/details/78192828)

十、SpringBoot多环境配置介绍和项目实战(核心知识)

  简介:SpringBoot介绍多环境配置和使用场景

 1、不同环境使用不同配置

  例如数据库配置,在开发的时候,我们一般用开发数据库,而在生产环境的时候,我们是用正式的数据

 2、配置文件存放路径

 classpath根目录的“/config”包下

 classpath的根目录下

 3、spring boot允许通过命名约定按照一定的格式(application-{profile}.properties)来定义多个配置文件

十一、SprinBoot2.x响应式编程简介

  简介:讲解什么是reactive响应式编程和使用的好处

 1、基础理解:

  依赖于事件,事件驱动(Event-driven)

  一系列事件称为“流”

  异步

  非阻塞

  观察者模式

  网上的一个例子:

 int b= 2;

 int c=3

 int a = b+c //命令式编程后续b和c变化,都不影响a

 b=5;

 int b= 2;

 int c= 3

 int a = b+c //响应式编程中,a的变化,会和b、c的变化而变化(事件驱动)

 b=5;

 2、官网:https://docs.spring.io/spring-boot/docs/<st1:chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on">2.1.0</st1:chsdate>.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-webflux

 SpingBoot2底层是用spring5,开始支持响应式编程,Spring又是基于Reactor试下响应式。

  学习资料

 1、reactive-streams学习资料:http://www.reactive-streams.org/

 2、web-flux相关资料:[https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#spring-webflux](https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#spring-webflux)

十二、SpringBoot2.x响应式编程webflux介绍

  简介:讲解SpringBoot2.x响应式编程介绍 Mono、Flux对象和优缺点

 1、Spring WebFlux是Spring Framework 5.0中引入的新的反应式Web框架

  与Spring MVC不同,它不需要Servlet API,完全异步和非阻塞,并 通过Reactor项目实现Reactive Streams规范。

 RxJava

 2、Flux和Mono User List<User>

 1)简单业务而言:和其他普通对象差别不大,复杂请求业务,就可以提升性能

 2)通俗理解:

 Mono 表示的是包含 0 或者 1 个元素的异步序列

 mono->单一对象 User redis->用户ID-》唯一的用户Mono<User> 

 Flux 表示的是包含 0 到 N 个元素的异步序列

 flux->数组列表对象 List<User> redis->男性用户->Flux<User>

 Flux 和 Mono 之间可以进行转换

 3、Spring WebFlux有两种风格:基于功能和基于注解的。基于注解非常接近Spring MVC模型,如以下示例所示:

  第一种:

 @RestController

 @RequestMapping(“/ users”)

 public class MyRestController {

 @GetMapping(“/ {user}”)

 public Mono <User> getUser( @PathVariable Long user){

 // ...

 }

 @GetMapping(“/ {user} / customers”)

 public Flux <Customer> getUserCustomers( @PathVariable Long user){

 // ...

 }

 @DeleteMapping(“/ {user}”)

 public Mono <User> deleteUser( @PathVariable Long user){

 // ...

 }

 }

  第二种: 路由配置与请求的实际处理分开

 @Configuration

 public class RoutingConfiguration {

 @Bean

 public RouterFunction <ServerResponse> monoRouterFunction(UserHandler userHandler){

 return route(GET( “/ {user}”).and(accept(APPLICATION_JSON)),userHandler :: getUser)

 .andRoute(GET(“/ {user} / customers”).and(accept(APPLICATION_JSON)),userHandler :: getUserCustomers)

 .andRoute(DELETE(“/ {user}”).and(accept(APPLICATION_JSON)),userHandler :: deleteUser);

 }

 }

 @Component

 public class UserHandler {

  公共 Mono <ServerResponse> getUser(ServerRequest请求){

 // ...

 }

 public Mono <ServerResponse> getUserCustomers(ServerRequest request){

 // ...

 }

  公共 Mono <ServerResponse> deleteUser(ServerRequest请求){

 // ...

 }

 }

 4、Spring WebFlux应用程序不严格依赖于Servlet API,因此它们不能作为war文件部署,也不能使用src/main/webapp目录

 5、可以整合多个模板引擎

  除了REST Web服务外,您还可以使用Spring WebFlux提供动态HTML内容。Spring WebFlux支持各种模板技术,包括Thymeleaf,FreeMarker

十三、SpringBoot2.x webflux实战

  简介:webflux响应式编程实战

 1、WebFlux中,请求和响应不再是WebMVC中的ServletRequest和ServletResponse,而是ServerRequest和ServerResponse

 2、加入依赖,如果同时存在spring-boot-starter-web,则会优先用spring-boot-starter-web

 <dependency>

 <groupId>org.springframework.boot</groupId>

 <artifactId>spring-boot-starter-webflux</artifactId>

 </dependency>

  测试

 localhost:8080/api/v1/user/test

 3、启动方式默认是Netty,8080端口

 4、参考:[https://spring.io/blog/2016/04/19/understanding-reactive-types](https://spring.io/blog/2016/04/19/understanding-reactive-types)、

十四、服务端推送常用技术介绍

  简介:服务端常用推送技术介绍,如websocket,sse轮询等

 1、客户端轮询:ajax定时拉取

 2、服务端主动推送:WebSocket

  全双工的,本质上是一个额外的tcp连接,建立和关闭时握手使用http协议,其他数据传输不使用http协议

  更加复杂一些,适用于需要进行复杂双向数据通讯的场景

 3、服务端主动推送:SSE (Server Send Event)

 html5新标准,用来从服务端实时推送数据到浏览器端,

  直接建立在当前http连接上,本质上是保持一个http长连接,轻量协议

  简单的服务器数据推送的场景,使用服务器推送事件   

  学习资料:[http://www.w3school.com.cn/html5/html_5_serversentevents.asp](http://www.w3school.com.cn/html5/html_5_serversentevents.asp)

十五、高级篇幅之云服务器介绍和部署生产环境实战

1、阿里云服务器介绍和使用讲解

  简介:阿里云服务器介绍和使用讲解

2、阿里云Linux服务器部署JDK8实战

  简介:在阿里云服务器上安装JDK8和配置环境变量

 lnux下使用wget下载jdk8:

  进到目录/usr/local/software

  配置环境变量

 vim /etc/profile

  加入

 export JAVA_HOME=/usr/local/software/jdk8

 export PATH=$PATH:$JAVA_HOME/bin

 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

 export JAVA_HOME PATH CLASSPATH

  使用 source /etc/profile 让配置立刻生效

3、阿里云服务器SpringBoot2.x生产环境部署实战

  简介:讲解SpringBoot生产环境部署和常见注意事项

 1、去除相关生产环境没用的jar

  比如热部署dev-tool

 2、本地maven打包成jar包

 mvn clean package -Dmaven.test.skip=true 跳过测试

 3、服务器安装jdk,上传Jar包

  上传工具:

 windows:

 winscp

 securtyCRT

 mac:

 filezilla

 ssh root@120.79.160.143

  访问路径 http://120.79.160.143:8080/api/v1/user/find

 java -jar xxxx.jar

  守护进程、系统服务、shell脚本

  打包指定配置文件

 1、使用maven的profiles

 2、使用springboot的profile=active

  访问不了

 1、阿里云防火墙是否开启,可以选择关闭,关闭是不安全的,可以选择开放端口

 2、阿里云的安全访问组,开启对应的端口,如果应用是以80端口启动,则默认可以访问

 4、成熟的互联网公司应该有的架构

  本地提交生产代码->gitlab仓库->Jenkins自动化构建->运维或者开发人员发布

十六、SpringBoot2.x监控Actuator实战上集

  简介:讲解SpringBoot使用actuator监控配置和使用

  可用性:100%,99.9%

 1、介绍什么是actuator

  官方介绍:

 Spring Boot包含许多附加功能,可帮助您在将应用程序投入生产时监视和管理应用程序。 可以选择使用HTTP端点或JMX来管理和监控您的应用程序,自动应用于审计,健康和指标收集;

  一句话:springboot提供用于监控和管理生产环境的模块

  官方文档:https://docs.spring.io/spring-boot/docs/<st1:chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on">2.1.0</st1:chsdate>.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready

 2、加入依赖

 <dependency>

 <groupId>org.springframework.boot</groupId>

 <artifactId>spring-boot-starter-actuator</artifactId>

 </dependency>

 3、加入上述依赖后,访问几个url

 /actuator/health

 /actuator/info

 /actuator

十七、SpringBoot2监控Actuator下集及生产环境建议

  简介:SpringBoot2.x监控Actuator实战下集及生产环境建议,SpringBoot新旧版本区别

  注意点: 网上的资料大多数没有讲到访问的前缀

  端点基础路径由 / 调整到 /actuator

  如:/info调整为/actuator/info

 /actuator/xxx

 1、只能访问几个url

 1)需要在配置文件中加入下列配置

 management.endpoints.web.exposure.include=*

 2)官网说明:https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-security-actuator

  原因:

  出于安全考虑,除/ health和/ info之外的所有执行器默认都是禁用的。 management.endpoints.web.exposure.include属性可用于启用执行器

 2、建议

  在设置management.endpoints.web.exposure.include之前,请确保暴露的执行器不包含敏感信息和/

  或通过将其放置在防火墙进行控制,不对外进行使用

  禁用的端点将从应用程序上下文中完全删除。如果您只想更改端点所暴露的技术,请改用 include和exclude属性 。

  例子:

  开启全部:management.endpoints.web.exposure.include=*

  开启某个:management.endpoints.web.exposure.include=metrics

  关闭某个:management.endpoints.web.exposure.exclude=metrics

  或者用springadmin进行管理

  相关资料:https://www.cnblogs.com/ityouknow/p/8440455.html

  或者用自己编写脚本监控

 CPU、内存、磁盘、nginx的http响应状态码200,404,5xx

 3、介绍常用的几个

 /health 查看应用健康指标

 /actuator/metrics 查看应用基本指标列表

 /actuator/metrics/{name} 通过上述列表,查看具体 查看具体指标

 /actuator/env 显示来自Spring的 ConfigurableEnvironment的属性</o:smarttagtype>

更多学习资料可参考:
https://www.xdclass.net/#/coursecatalogue?video_id=4
https://ke.qq.com/course/299498

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