SpringBoot(二) 高級以及原理解釋

整合RabbitMQ

創(chuàng)建服務(wù)提供者

  • 引入依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.itcast</groupId>
    <artifactId>rabbitmq_provider</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>
</project>
  • 創(chuàng)建啟動類
package com.probuing.sb2.rabbitmq;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author wangxin
 * @date 2020/1/12 15:49
 * @description: TODO
 * GOOD LUCK怔匣!
 */
@SpringBootApplication
public class ApplicationRun {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationRun.class, args);
    }
}

  • 創(chuàng)建發(fā)送消息的測試類
    ProviderTest.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class ProviderTest {

    @Autowired
    private AmqpTemplate amqpTemplate;

    @Test
    public void sendMsg() {
        amqpTemplate.convertAndSend("", "sb2_message", "這是一條message");

    }
}
  • 配置文件
    主要配置RabbitMQ的ip地址怖侦、端口號、虛擬主機(jī)、用戶名、密碼
server:
  port: 8080
spring:
  rabbitmq:
    host: 127.0.0.1
    username: admin
    password: admin
    virtual-host: sb2
    port: 5672
    
  • 隊(duì)列類
    MQConfig.java
@Component
public class MQConfig {
    @Bean
    public Queue queue(){
        return new Queue("sb2_mq");
    }
}
  • 創(chuàng)建服務(wù)消費(fèi)者 創(chuàng)建module springboot_rabbitmq_consumer
  • 引入依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>SpringBoot2</artifactId>
        <groupId>com.probuing.sb2</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springboot2_rabbitmq_consumer</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>

</project>
  • 啟動類
    ApplicationConsumerRun.java
@SpringBootApplication
public class ApplicationConsumerRun {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationConsumerRun.class, args);
    }
}

  • 創(chuàng)建監(jiān)聽類
    MyListener.java
@Component
public class MyListener {
    @RabbitListener(queues = "sb2_mq")
    public void receiveMsg(String msg) {
        System.out.println("listener收到信息" + msg);
    }
}
  • 配置文件
    applicaiton.yml
spring:
  rabbitmq:
    host: 127.0.0.1
    username: admin
    password: admin
    virtual-host: heima118
    port: 5672
server:
  port: 8081
  • 小結(jié)

創(chuàng)建服務(wù)的提供者

  • 需要一個啟動類
  • 需要一個測試類,發(fā)送消息
  • 需要AmqpTemplate.convertAndSend發(fā)送信息
  • 配置文件需要配置RabbitMQ的信息:IP地址橘洞、端口號、用戶名说搅、密碼炸枣、虛擬主機(jī)
  • 需要一個初始化隊(duì)列的類,主要的作用就是將隊(duì)列寫入到Bean里

創(chuàng)建服務(wù)的消費(fèi)者

  • 需要創(chuàng)建啟動類
  • 需要監(jiān)聽類弄唧,監(jiān)聽消息适肠,主要使用@RabbitListener注解
  • 配置文件需要配置RabbitMQ的信息:IP地址、端口號候引、用戶名侯养、密碼、虛擬主機(jī)

整合Redis

創(chuàng)建模塊澄干,引入依賴

  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>SpringBoot2</artifactId>
        <groupId>com.probuing.sb2</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springboot2_redis</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>
</project>
  • 創(chuàng)建啟動類
    ApplicationRunner.java
@SpringBootApplication
public class ApplicationRun {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationRun.class, args);
    }
}
  • 創(chuàng)建測試類
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ApplicationRun.class)
public class RedisTest {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Test
    public void redisTest() {
        stringRedisTemplate.opsForValue().set("redis_sb", "testRedis");
        String redis_sb = stringRedisTemplate.opsForValue().get("redis_sb");
        System.out.println(redis_sb);
    }
}

注解:@Condition

Condition:Condition是在Spring4.0增加的條件判斷功能逛揩,通過這個注解可以實(shí)現(xiàn)選擇性的創(chuàng)建Bean的操作

創(chuàng)建Condition模塊

  • 引入依賴
    pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>SpringBoot2</artifactId>
        <groupId>com.probuing.sb2</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springboot2_condition</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
    </dependencies>
</project>
  • 啟動類
    ApplicationRunner.java
@SpringBootApplication
public class ApplicationCoRunner {
    public static void main(String[] args) {
        //ConfigurableApplicationContext是Spring的IOC容器柠傍,可以通過容器獲取bean和環(huán)境變量中的
        ConfigurableApplicationContext configurableApplicationContext = SpringApplication.run(ApplicationCoRunner.class, args);
        Object redisTemplate = configurableApplicationContext.getBean("redisTemplate");
        System.out.println(redisTemplate);
    }
}

使用Condition注釋

創(chuàng)建一個MyCondition類,實(shí)現(xiàn)Condition接口辩稽,接口中有一個方法惧笛,返回boolean
MyCondition.java

/**
 * @author wangxin
 * @date 2020/1/12 17:26
 * @description: TODO
 * GOOD LUCK!
 */
public class MyCondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        boolean flag = true;
        try {
            Class.forName("redis.clients.jedis.Jedis");
        } catch (ClassNotFoundException e) {
            flag = false;
        }
        return flag;
    }
}

UserConfig類

@Configuration
public class UserConfig {
    @Bean
    @Conditional(MyCondition.class)
    public User user() {
        return new User();
    }
}

動態(tài)加載Bean

  • 創(chuàng)建一個注解類
/**
 * @author wangxin
 * @date 2020/1/12 17:38
 * @description: TODO
 * GOOD LUCK逞泄!
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(MyCondition.class)
public @interface MyConditional {
    String[] value();
}
  • 修改MyCondition.java
public class MyCondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        boolean flag = true;
        Map<String, Object> map = annotatedTypeMetadata.getAnnotationAttributes(MyConditional.class.getName());
        String[] strings = (String[]) map.get("value");
        try {
            for (String string : strings) {
                Class.forName(string);

            }
        } catch (ClassNotFoundException e) {
            flag = false;
        }
        return flag;
    }
}

SpringBoot常用條件注解

  • ConditionalOnProperty:判斷配置文件中是否有對應(yīng)的屬性和值才初始化Bean
  • ConditionalOnClass:判斷環(huán)境中是否有對應(yīng)的字節(jié)碼文件才初始化Bean
  • ConditionalOnMissingBean:判斷環(huán)境中是否有對應(yīng)的Bean才初始化Bean

注解@Enable

SpringBoot中提供了很多Enable開頭的注解患整,這些注解都是用于動態(tài)啟用某些功能的,而其底層原理是使用@Import注解導(dǎo)入一些配置類喷众,實(shí)現(xiàn)Bean的動態(tài)加載

springboot工程是否可以直接獲取jar包中定義的bean?

案例背景:創(chuàng)建兩個模塊各谚,一個是springboot_enable 一個是springboot_enable_other
需求:在springboot_enable里通過@Enable注解加載User這個Bean,而User這個Bean是在springboot_enable_other模塊中

創(chuàng)建兩個模塊

  • springboot_enable
  • springboot_enable_other
  • 在enable模塊中加入enable_other依賴
  • pom.xml
 <dependency>
            <groupId>com.probuing.sb2</groupId>
            <artifactId>springboot_enable_other</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

在springboot_enable_other中創(chuàng)建User侮腹、UserConfig(配置類)

  • UserConfig.java
@Configuration
public class UserConfig {
    @Bean
    public User user() {
        return new User();
    }
}
  • User.java
public class User {
}

加載UserBean

方式一:擴(kuò)大掃描包范圍:

在Enable啟動類里增加ComponentScan

@SpringBootApplication
@ComponentScan("com.probuing.sb2.domain")
public class EnableApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(EnableApplication.class, args);
        //獲取user
        Object user = context.getBean("user");
        System.out.println(user);
    }
}

方式二:導(dǎo)入User類

  • EnableApplication.java
@SpringBootApplication
//@ComponentScan("com.probuing.sb2.domain")
@Import(User.class)
public class EnableApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(EnableApplication.class, args);
        //從Ioc容器中獲取map集合
        Map<String, User> map = context.getBeansOfType(User.class);
        User user = map.get("com.probuing.sb2.domain.User");
        System.out.println(user);
    }
}

注意
直接導(dǎo)入User類嘲碧,spring容器導(dǎo)入bean之后取了一個名字,這個名字是bean的全限定名稱父阻,所以可以通過類型獲取Bean

三 導(dǎo)入配置類

  • EnableApplicaiton.java
@SpringBootApplication
@Import(UserConfig.class)
public class EnableApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(EnableApplication.class, args);
        Object user = context.getBean("user");
        System.out.println(user);
    }
}

四 通過Enable注解

在spring_enable_other中自定義一個注解

  • EnableUser.java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(UserConfig.class)
public @interface EnableUser {
}

啟動類

  • EnableApplication.java
@SpringBootApplication
@EnableUser
public class EnableApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(EnableApplication.class, args);
        Object user = context.getBean("user");
        System.out.println(user);
    }
}

@Import注解

@Enable*底層依賴于@Import注解導(dǎo)入一些類,使用@Import導(dǎo)入的類會被Spring加載到IOC容器中望抽。而@Import提供4種用法

  • 導(dǎo)入Bean
  • 導(dǎo)入配置類
  • 導(dǎo)入ImportSelector實(shí)現(xiàn)類加矛,一般用于加載配置文件中的類
  • 導(dǎo)入ImportBeanDefinitionRegistrar實(shí)現(xiàn)類

導(dǎo)入ImportSelector

  • 創(chuàng)建實(shí)現(xiàn)類
    • MyImportSelector.java
public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[]{"com.probuing.sb2.domain.User"};
    }
}
  • 修改啟動類
    • EnableApplication.java
@SpringBootApplication
@Import(MyImportSelector.class)
public class EnableApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(EnableApplication.class, args);
        Object user = context.getBean("user");
        System.out.println(user);
    }
}

導(dǎo)入ImportBeanDefinitionRegistrar實(shí)現(xiàn)類

  • 創(chuàng)建實(shí)現(xiàn)類
    • MyImportBeanDefinitionRegister.java
public class MyImportBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata annotationMetadata,
                                        BeanDefinitionRegistry beanDefinitionRegistry) {
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(User.class).getBeanDefinition();
        beanDefinitionRegistry.registerBeanDefinition("user",beanDefinition);
        
    }
}
  • 修改啟動類
    ·* EnableApplication.java
@SpringBootApplication
@Import(MyImportBeanDefinitionRegister.class)
public class EnableApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(EnableApplication.class, args);
//        Object user = context.getBean(User.class);
        Object user = context.getBean("user");
        System.out.println(user);
    }
}

自定義Starter

模擬Mybatis的Starter加載過程

  • redis-spring-boot-autoconfigure

  • redis-spring-boot-starter

  • redis-spring-boot-starter引入依賴

<dependencies>

        <dependency>
            <groupId>com.probuing.sb2</groupId>
            <artifactId>redis-spring-boot-autoconfigure</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
  • redis-spring-boot-autoconfigure 引入依賴
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.1.0</version>
        </dependency>
  • 創(chuàng)建RedisAutoConfigure
    autoconfigure模塊
    • RedisAutoConfigure.java
@Configuration
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoConfig {
@Configuration
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoConfig {
    @Bean
    public Jedis jedis(RedisProperties redisProperties) {
        return new Jedis(redisProperties.getHost(), redisProperties.getPort());
    }
}
}
  • 創(chuàng)建一個新的springboot模塊
    • 引入依賴
 <dependencies>

        <dependency>
            <groupId>com.probuing.sb2</groupId>
            <artifactId>redis-spring-boot-starter</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
  • 啟動類
@SpringBootApplication
public class MyRedisRun {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(MyRedisRun.class);
        Jedis jedis = (Jedis) context.getBean("jedis");
        jedis.set("probuing", "abc");
        String probuinhg = jedis.get("probuing");
        System.out.println(probuinhg);
    }
}

springboot監(jiān)控

  • 創(chuàng)建模塊 springboot_actuator
  • 引入依賴
    • pom.xml
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
    </dependencies>
  • 配置文件
server:
  port: 8090
info:
  name: heima118
  class: springboot
management:
  endpoint:
    health:
      show-details: always
  endpoints:
    web:
      exposure:
        include: "*"
  • server.port:端口號

  • info.name\info.class:監(jiān)控中心里的配置文件info下的內(nèi)容

  • management.endpoint.health.show-details:在健康中心下監(jiān)控你的程序運(yùn)行狀態(tài)

  • management.endpoints.web.exposure.include:"*" 開啟所有的監(jiān)控內(nèi)容

  • info: http://localhost:8090/actuator/info 讀取的是配置文件中info的內(nèi)容

  • health:http://localhost:8090/actuator/health 讀取當(dāng)前應(yīng)用狀態(tài)

  • beans:http://localhost:8090/actuator/beans 讀取所有bean

springboot可視化監(jiān)控

springboot_admin

  • 創(chuàng)建一個模塊
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>cn.itcast</groupId>
    <artifactId>springboot_admin</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot_admin</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-boot-admin.version>2.2.1</spring-boot-admin.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>de.codecentric</groupId>
                <artifactId>spring-boot-admin-dependencies</artifactId>
                <version>${spring-boot-admin.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
  • 啟動類
@SpringBootApplication
@EnableAdminServer
public class AdminApplication {
    public static void main(String[] args) {
        SpringApplication.run(AdminApplication.class, args);
    }
}

注意
這里要添加@EnableAdminServer,開啟一個admin服務(wù)煤篙,主要是管理所有在admin里注冊的服務(wù)

  • 配置文件
server.port=8088

加入客戶端

  • 創(chuàng)建模塊 springboot_myredis
<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-client</artifactId>
    <version>2.1.3</version>
</dependency>
  • 客戶端的配置文件
#在admin服務(wù)中進(jìn)行注冊斟览,url指向的是admin對應(yīng)的地址
spring:
  boot:
    admin:
      client:
        url: http://localhost:8088

#顯示所有的健康信息
management:
  endpoint:
    health:
      show-details: always
      
  #顯示所有的信息    
  endpoints:
    web:
      exposure:
        include: "*"
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市辑奈,隨后出現(xiàn)的幾起案子苛茂,更是在濱河造成了極大的恐慌,老刑警劉巖鸠窗,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妓羊,死亡現(xiàn)場離奇詭異,居然都是意外死亡稍计,警方通過查閱死者的電腦和手機(jī)躁绸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臣嚣,“玉大人净刮,你說我怎么就攤上這事」柙颍” “怎么了淹父?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長怎虫。 經(jīng)常有香客問我暑认,道長督暂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任穷吮,我火速辦了婚禮逻翁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捡鱼。我一直安慰自己八回,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布驾诈。 她就那樣靜靜地躺著缠诅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乍迄。 梳的紋絲不亂的頭發(fā)上管引,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機(jī)與錄音闯两,去河邊找鬼褥伴。 笑死,一個胖子當(dāng)著我的面吹牛漾狼,可吹牛的內(nèi)容都是我干的重慢。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼逊躁,長吁一口氣:“原來是場噩夢啊……” “哼似踱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起稽煤,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤核芽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后酵熙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轧简,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年绿店,在試婚紗的時候發(fā)現(xiàn)自己被綠了吉懊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡假勿,死狀恐怖借嗽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情转培,我是刑警寧澤恶导,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站浸须,受9級特大地震影響惨寿,放射性物質(zhì)發(fā)生泄漏邦泄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一裂垦、第九天 我趴在偏房一處隱蔽的房頂上張望顺囊。 院中可真熱鬧,春花似錦蕉拢、人聲如沸特碳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽午乓。三九已至,卻和暖如春闸准,著一層夾襖步出監(jiān)牢的瞬間益愈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工夷家, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蒸其,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓瘾英,卻偏偏與公主長得像枣接,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子缺谴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

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