Dubbo與Spring整合源碼分析

通過(guò)EnableDubbo和PropertySource開(kāi)啟了dubbo


image.png

PropertySource是spring的注解棍掐,用來(lái)指定配置文件路徑

EnableDubbo

image.png

@EnableDubboConfig注解用來(lái)將properties配置文件中的配置項(xiàng)轉(zhuǎn)化為相對(duì)應(yīng)的Bean
@DubboComponentScan注解用來(lái)掃描服務(wù)提供者和引用者(@Service)

1厌处、EnableDubboConfig

image.png

1堰汉、導(dǎo)入DubboConfigConfigurationRegistrar類調(diào)用registerBeanDefinitions
EnableDubboConfig注解中import導(dǎo)入DubboConfigConfigurationRegistrar類
DubboConfigConfigurationRegistrar實(shí)現(xiàn)了ImportBeanDefinitionRegistrar類,這個(gè)類是Spring的擴(kuò)展點(diǎn)之一拾枣,用來(lái)向spring容器中注冊(cè)Bean亏娜,某個(gè)時(shí)機(jī)會(huì)調(diào)用到registerBeanDefinitions()方法
org.apache.dubbo.config.spring.context.annotation.DubboConfigConfigurationRegistrar#registerBeanDefinitions


image.png

對(duì)于添加了EnableDubboConfig注解(添加了EnableDubbo注解)的類的元數(shù)據(jù)信息职辅,便會(huì)得到EnableDubboConfig注解的屬性值,根據(jù)屬性值鍵值對(duì)可以獲取multiple的屬性值唬滑,默認(rèn)multiple=true告唆。用來(lái)決定是注冊(cè)DubboConfigConfiguration.Single的Bean還是注冊(cè)DubboConfigConfiguration.Multiple.class類型的Bean


image.png

2、multiple=true的意義
以protocol為例晶密,multiple=true的意義表示protocols有多種
image.png

3擒悬、Single和Multiple
DubboConfigConfiguration.Single
image.png

DubboConfigConfiguration.Multiple


image.png

DubboConfigConfiguration.Single有兩個(gè)注解:@EnableDubboConfigBindings和@EnableDubboConfigBinding
Single和Multiple的唯一區(qū)別就是Multiple=true。
4惹挟、EnableDubboConfigBindings
導(dǎo)入DubboConfigBindingsRegistrar類
image.png

DubboConfigBindingsRegistrar實(shí)現(xiàn)了ImportBeanDefinitionRegistrar
image.png

image.png

這個(gè)registerBeanDefinitions方法就是獲取注解信息中@EnableDubboConfigBindings包含的@EnableDubboConfigBinding注解
,然后進(jìn)行遍歷注冊(cè)調(diào)用DubboConfigBindingRegistrar的registerBeanDefinitions方法
5连锯、registerBeanDefinitions
org.apache.dubbo.config.spring.context.annotation.DubboConfigBindingRegistrar#
registerBeanDefinitions
以dubbo.application配置為例归苍,把前綴是dubbo.application的配置與type的class類型是org.apache.dubbo.config.ApplicationConfig注冊(cè)一個(gè)XxxConfig配置Bean
image.png

6、registerDubboConfigBeans
org.apache.dubbo.config.spring.context.annotation.DubboConfigBindingRegistrar#registerDubboConfigBeans


image.png

image.png

①运怖、根據(jù)multiple的值拼弃,獲取beanName
如果multiple為false,則看有沒(méi)有配置id屬性摇展,如果沒(méi)有配置則自動(dòng)生成一個(gè)
org.apache.dubbo.config.spring.context.annotation.DubboConfigBindingRegistrar#
resolveMultipleBeanNames
image.png

②吻氧、如果配置有多個(gè)(multiple=true)則會(huì)為每個(gè)beanName都會(huì)注冊(cè)一個(gè)BeanDefinition的配置類,這些配置了都實(shí)現(xiàn)了AbstractConfig
③、如果配置有多個(gè)(multiple=true)則為每個(gè)bean注冊(cè)一個(gè)類型是DubboConfigBindingBeanPostProcessor的后置處理器
a盯孙、registerDubboConfigBindingBeanPostProcessor
org.apache.dubbo.config.spring.context.annotation.DubboConfigBindingRegistrar#
registerDubboConfigBindingBeanPostProcessor
image.png

image.png

DubboConfigBindingBeanPostProcessor實(shí)現(xiàn)了BeanPostProcessor, ApplicationContextAware, InitializingBean , BeanDefinitionRegistryPostProcessor
b鲁森、postProcessBeforeInitialization
org.apache.dubbo.config.spring.beans.factory.annotation.DubboConfigBindingBeanPostProcessor#
postProcessBeforeInitialization
這里是spring后置處理器的調(diào)用
image.png

每個(gè)XxConfig配置類都會(huì)對(duì)應(yīng)一個(gè)BeanPostProcessor后置處理器,所以每個(gè)DubboConfigBindingBeanPostProcessor只處理其對(duì)應(yīng)的bean振惰。bind方法用來(lái)對(duì)XxConfig配置類歌溉,從properties文件中獲取值,并設(shè)置到dubboConfig對(duì)象中骑晶。customize方法用來(lái)設(shè)置dubboConfig對(duì)象的name屬性痛垛,設(shè)置為beanName
c、bind
org.apache.dubbo.config.spring.beans.factory.annotation.DubboConfigBindingBeanPostProcessor#bind
通過(guò)DubboConfigBinder dubboConfigBinder進(jìn)行綁定
image.png

④桶蛔、注冊(cè)一個(gè)NamePropertyDefaultValueDubboConfigBeanCustomizer的bean
EnableDubboConfigBinding

2匙头、DubboComponentScan

掃描指定的包,會(huì)把添加了@Service注解的類添加到容器中仔雷。


image.png

這個(gè)DubboComponentScan注解import導(dǎo)入DubboComponentScanRegistrar類蹂析,DubboComponentScanRegistrar實(shí)現(xiàn)了ImportBeanDefinitionRegistrar


image.png

1、獲取DubboComponentScan注解上的包路徑朽寞,用來(lái)掃描該package下的類
2识窿、注冊(cè)ServiceAnnotationBeanPostProcessor類型的Bean,用來(lái)處理@Service注解

掃描包下添加了@Service注解的類脑融,對(duì)于每個(gè)類都會(huì)生成一個(gè)BeanDefinition喻频,對(duì)于每個(gè)對(duì)應(yīng)的類都會(huì)注冊(cè)一個(gè)ServiceBean,會(huì)把@Service注解包含的屬性值肘迎、當(dāng)前類的引用添加到ref中及其他信息都會(huì)添加到ServiceBean中甥温。
3、注冊(cè)ReferenceAnnotationBeanPostProcessor妓布,用來(lái)處理@Reference注解姻蚓,進(jìn)行屬性填充

@Service

注冊(cè)ServiceBean

由于在注冊(cè)ServiceAnnotationBeanPostProcessor中注冊(cè)ServiceBean是比較核心的步驟,所以單獨(dú)拎出來(lái)匣沼。
1狰挡、registerServiceAnnotationBeanPostProcessor
注冊(cè)ServiceAnnotationBeanPostProcessor類型的Bean
org.apache.dubbo.config.spring.context.annotation.DubboComponentScanRegistrar#registerServiceAnnotationBeanPostProcessor


image.png

生成一個(gè)beanClass是ServiceAnnotationBeanPostProcessor.class的beanDefinition,在構(gòu)建這個(gè)beanDefinition時(shí)释涛,把packagesToScan包路徑作為構(gòu)造方法參數(shù)傳入到生成的Bean中加叁。


image.png

會(huì)把傳入的掃描包的路徑賦值給ServiceAnnotationBeanPostProcessor#packagesToScan屬性值
2、ServiceAnnotationBeanPostProcessor
ServiceAnnotationBeanPostProcessor類實(shí)現(xiàn)了BeanDefinitionRegistryPostProcessor唇撬,這里也是spring的擴(kuò)展點(diǎn)之一它匕。會(huì)在spring bean生成過(guò)程的生命周期中調(diào)用到postProcessBeanDefinitionRegistry方法
org.apache.dubbo.config.spring.beans.factory.annotation.ServiceAnnotationBeanPostProcessor#
postProcessBeanDefinitionRegistry
image.png

3、registerServiceBeans
org.apache.dubbo.config.spring.beans.factory.annotation.ServiceAnnotationBeanPostProcessor#registerServiceBeans


image.png

①窖认、首先自定義一個(gè)掃描器DubboClassPathBeanDefinitionScanner
②豫柬、對(duì)這個(gè)掃描器進(jìn)行屬性設(shè)置及掃描規(guī)則添加告希。
只對(duì)com.alibaba.dubbo.config.annotation.Service.class注解和org.apache.dubbo.config.
annotation.Service.class注解過(guò)濾
image.png

image.png

③、對(duì)包掃描@Service的注解類得到的beanDefinition放入到beanDefinitionHolders集合中
④烧给、對(duì)得到的每個(gè)beanDefinition進(jìn)行注冊(cè)ServiceBean
4燕偶、registerServiceBean
org.apache.dubbo.config.spring.beans.factory.annotation.ServiceAnnotationBeanPostProcessor#
registerServiceBean
image.png

根據(jù)beanDefinitionHolder獲取對(duì)應(yīng)的類beanClass,獲取注解service创夜,獲取當(dāng)前類的注解信息屬性值serviceAnnotationAttributes
image.png

注冊(cè)ServiceBean杭跪,根據(jù)beanName和構(gòu)建的serviceBeanDefinition。beanName是ServiceBean:org.apache.dubbo.demo.DemoService
5驰吓、buildServiceBeanDefinition
org.apache.dubbo.config.spring.beans.factory.annotation.ServiceAnnotationBeanPostProcessor#
buildServiceBeanDefinition


image.png

生成一個(gè)類是ServiceBean對(duì)應(yīng)的BeanDefinition,之后進(jìn)行屬性值處理
image.png

①系奉、把serviceAnnotation中的參數(shù)值賦值給ServiceBean的屬性propertyValues
②檬贰、ref屬性賦值為annotatedServiceBeanName, 對(duì)應(yīng)的就是被@Service注解類對(duì)應(yīng)的bean。
③缺亮、添加interface翁涤、parameters屬性值
④、methods屬性配置萌踱,則給ServiceBean對(duì)應(yīng)的methods屬性賦值
⑤葵礼、provider、monitor并鸵、application鸳粉、module、registries园担、protocols屬性添加
6届谈、onApplicationEvent
ServiceBean注冊(cè)之后,由于ServiceBean實(shí)現(xiàn)了ApplicationListener弯汰,所以在spring bean生命周期中艰山,生成對(duì)應(yīng)的Bean。便會(huì)調(diào)用ApplicationListener的實(shí)現(xiàn)類發(fā)布一個(gè)ContextRefreshedEvent事件咏闪。
org.apache.dubbo.config.spring.ServiceBean#onApplicationEvent
image.png

調(diào)用到export();方法曙搬,就會(huì)進(jìn)行服務(wù)注冊(cè)(也叫dubbo服務(wù)導(dǎo)出),注冊(cè)到注冊(cè)中心鸽嫂。

@Reference

注冊(cè)ReferenceAnnotationBeanPostProcessor

org.apache.dubbo.config.spring.context.annotation.DubboComponentScanRegistrar#registerReferenceAnnotationBeanPostProcessor


image.png

beanName是referenceAnnotationBeanPostProcessor纵装,beanClass是ReferenceAnnotationBeanPostProcessor的Bean。
ReferenceAnnotationBeanPostProcessor繼承了AnnotationInjectedBeanPostProcessor溪胶。
AnnotationInjectedBeanPostProcessor是dubbo自定義的一個(gè)抽象后置處理器搂擦,繼承了InstantiationAwareBeanPostProcessorAdapter,實(shí)現(xiàn)了MergedBeanDefinitionPostProcessor的spring后置處理器哗脖。這兩個(gè)后置處理器會(huì)在spring bean的生命周期調(diào)用瀑踢,分別調(diào)用postProcessMergedBeanDefinition和postProcessPropertyValues方法
為什么僅僅說(shuō)這兩個(gè)方法扳还,因?yàn)锳nnotationInjectedBeanPostProcessor類在處理@Reference注解時(shí)重寫(xiě)了這兩個(gè)方法。后置處理器重寫(xiě)也是spring擴(kuò)展點(diǎn)之一橱夭,也是與spring整合的一個(gè)關(guān)鍵點(diǎn)氨距。

1、postProcessMergedBeanDefinition

org.apache.dubbo.config.spring.beans.factory.annotation.AnnotationInjectedBeanPostProcessor#postProcessMergedBeanDefinition
查找注入元數(shù)據(jù)InjectionMetadata包括字段注入和方法注入


image.png

在dubbo-demo測(cè)試代碼中是這樣引用的

@Component("demoServiceComponent")
public class DemoServiceComponent implements DemoService {
    @Reference
    private DemoService demoService; 
}

這個(gè)查找注入點(diǎn)的關(guān)鍵是如何查找到這些信息的棘劣,需要查看下findInjectionMetadata方法
①俏让、findInjectionMetadata
org.apache.dubbo.config.spring.beans.factory.annotation.AnnotationInjectedBeanPostProcessor#findInjectionMetadata


image.png

在injectionMetadataCache緩存中不存在當(dāng)前類的注解信息,需要通過(guò)buildAnnotatedMetadata查找茬暇,并放入到injectionMetadataCache緩存中(結(jié)構(gòu)是ConcurrentMap<String, AnnotationInjectedBeanPostProcessor.AnnotatedInjectionMetadata>)
②首昔、buildAnnotatedMetadata


image.png

findFieldAnnotationMetadata用來(lái)查找filed字段上有@Reference注解
findAnnotatedMethodMetadata用來(lái)查找method方法上有@Reference注解
返回一個(gè)Dubbo自定義的AnnotatedInjectionMetadata,之后就可以使用這個(gè)類進(jìn)行屬性注入
③、findFieldAnnotationMetadata

org.apache.dubbo.config.spring.beans.factory.annotation.AnnotationInjectedBeanPostProcessor#findFieldAnnotationMetadata


image.png

image.png

這個(gè)注解類型annotationType是在創(chuàng)建ReferenceAnnotationBeanPostProcessor時(shí)通過(guò)構(gòu)造方法傳入
image.png

賦值給AnnotationInjectedBeanPostProcessor的annotationTypes
image.png

所以這個(gè)方法就是尋找在當(dāng)前類中添加了@Reference注解的字段,如果是靜態(tài)的static則不會(huì)添加到elements中
④尖坤、findAnnotatedMethodMetadata
把set方法的參數(shù)(找到set方法所對(duì)應(yīng)的屬性)添加到elements中
image.png

image.png

⑤评凝、AnnotationInjectedBeanPostProcessor.AnnotatedInjectionMetadata
返回注入類型AnnotatedInjectionMetadata,是一個(gè)實(shí)現(xiàn)了InjectionMetadata的內(nèi)部類,包含需要注入的字段集合fieldElements和方法集合methodElements。這兩個(gè)集合的類型是實(shí)現(xiàn)了InjectionMetadata.InjectedElement的內(nèi)部類AnnotationInjectedBeanPostProcessor.AnnotatedFieldElement和AnnotatedMethodElement
image.png
2、postProcessPropertyValues
image.png

這時(shí)injectionMetadataCache已經(jīng)存在當(dāng)前bean的屬性竣蹦,之后調(diào)用inject進(jìn)行注入。便會(huì)調(diào)用AnnotatedFieldElement和AnnotatedMethodElement的inject方法
1沧奴、AnnotatedFieldElement#inject
org.apache.dubbo.config.spring.beans.factory.annotation.AnnotationInjectedBeanPostProcessor.
AnnotatedFieldElement#inject


image.png

2痘括、getInjectedObject
org.apache.dubbo.config.spring.beans.factory.annotation.AnnotationInjectedBeanPostProcessor#getInjectedObject


image.png

哪個(gè)Service應(yīng)用了哪個(gè)類型的服務(wù),通過(guò)什么方式引入的
cacheKey屬性名不一樣的時(shí)候扼仲,cacheKey不一樣远寸,導(dǎo)致不能緩存, 在一個(gè)Service中@Reference兩次同一個(gè)服務(wù)緩存不到
3屠凶、doGetInjectedBean
org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor#
doGetInjectedBean
image.png

①驰后、referencedBeanName:表示得到引入服務(wù)的beanName,示例代碼引入的是ServiceBean:org.apache.dubbo.demo.DemoService
這個(gè)值也可以判斷引用的這個(gè)服務(wù)是不是我自己導(dǎo)出的矗愧。attributes里存的是@Reference注解中的所配置的屬性與值灶芝,injectedType表示引入的是哪個(gè)服務(wù)接口
②、referenceBeanName:@Reference org.apache.dubbo.demo.DemoServiceorg.apache.dubbo.demo.DemoService
表示唉韭,要的根據(jù)@Reference注解來(lái)生成一個(gè)RefrenceBean夜涕,對(duì)應(yīng)的beanName


image.png

③、生成ReferenceBean對(duì)象属愤,并放到referenceBeanCache緩存
④女器、把referenceBean注冊(cè)到Spring容器中去
⑤、緩存需要注入的引用對(duì)象
⑥住诸、返回代理對(duì)象
4驾胆、buildReferenceBeanIfAbsent
org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor#
buildReferenceBeanIfAbsent
生成了一個(gè)ReferenceBean對(duì)象涣澡,attributes是@Reference注解的參數(shù)值
image.png

5、build
org.apache.dubbo.config.spring.beans.factory.annotation.AnnotatedInterfaceConfigBeanBuilder#build
image.png

①丧诺、checkDependencies()空方法
②入桂、創(chuàng)建一個(gè)ReferenceBean對(duì)象
org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceBeanBuilder#doBuild
image.png

③、給ReferenceBean對(duì)象的屬性賦值
org.apache.dubbo.config.spring.beans.factory.annotation.AnnotatedInterfaceConfigBeanBuilder#
configureBean


image.png

attributes注解上的屬性值驳阎、注解上registry的值抗愁、注解上的monitor值、注解上的application呵晚、注解上的module值
org.apache.dubbo.config.spring.beans.factory.annotation.AnnotatedInterfaceConfigBeanBuilder#
configureRegistryConfigs
解析@Refrence注解中配置的registry屬性蜘腌、獲得注冊(cè)中心對(duì)應(yīng)的RegistryConfig對(duì)象
image.png

org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceBeanBuilder#resolveRegistryConfigBeanNames
image.png

org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceBeanBuilder#postConfigureBean
設(shè)置applicationContext、interfaceName饵隙、consumer逢捺、methods屬性,并調(diào)用ReferenceBean對(duì)象的afterPropertiesSet方法
image.png

④癞季、afterPropertiesSet
org.apache.dubbo.config.spring.ReferenceBean#afterPropertiesSet
這個(gè)方法還是在給ReferenceBean對(duì)象的屬性賦值、如果@Reference注解中沒(méi)有配置consumer屬性(getConsumer() == null)倘潜,則會(huì)從Spring容器中尋找ConsumerConfig類型的Bean, 例如可以通過(guò)@Bean定義了一個(gè)ConsumerConfig的Bean绷柒,有可能存在多個(gè)ConsumerConfig類型的Bean,遍歷這些Bean涮因,取第一個(gè)沒(méi)有配置default或者default為true的Bean作為consumer的值
image.png

6废睦、registerReferenceBean
image.png

image.png

beanName是@Reference org.apache.dubbo.demo.DemoService的Bean,如果本地存在則會(huì)使用本地服務(wù)养泡。如果是本地提供的一個(gè)服務(wù)嗜湃,那么@Reference org.apache.dubbo.demo.DemoService的別名是demoService,不需要是ServiceBean的名字
7澜掩、cacheInjectedReferenceBean
org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor#
cacheInjectedReferenceBean
image.png

8购披、getOrCreateProxy
org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor#
getOrCreateProxy
image.png

org.apache.dubbo.config.ReferenceConfig#get
返回的ref便是經(jīng)過(guò)Invoke代理的對(duì)象,這里涉及到dubbo的服務(wù)引入肩榕。
image.png

9刚陡、最終得到的代理對(duì)象,便可以通過(guò)field.set設(shè)置
image.png

image.png

總結(jié):

Dubbo與Spring整合用到了Spring的多個(gè)擴(kuò)展點(diǎn)株汉。這些擴(kuò)展點(diǎn)的目的就是把dubbo自定義的注解(@Service和@Reference)注冊(cè)到spring容器筐乳,然后實(shí)現(xiàn)服務(wù)導(dǎo)入(注冊(cè))和服務(wù)引用。要了解這些擴(kuò)展點(diǎn)需要對(duì)spring有一定的了解乔妈,并了解其執(zhí)行時(shí)機(jī)蝙云。
擴(kuò)展點(diǎn):實(shí)現(xiàn)了ImportBeanDefinitionRegistrar、BeanDefinitionRegistryPostProcessor路召、BeanPostProcessor后置處理器

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載勃刨,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者波材。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市朵你,隨后出現(xiàn)的幾起案子各聘,更是在濱河造成了極大的恐慌,老刑警劉巖抡医,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件躲因,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡忌傻,警方通過(guò)查閱死者的電腦和手機(jī)大脉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)水孩,“玉大人镰矿,你說(shuō)我怎么就攤上這事》郑” “怎么了秤标?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宙刘。 經(jīng)常有香客問(wèn)我苍姜,道長(zhǎng),這世上最難降的妖魔是什么悬包? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任衙猪,我火速辦了婚禮,結(jié)果婚禮上布近,老公的妹妹穿的比我還像新娘垫释。我一直安慰自己,他們只是感情好撑瞧,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布棵譬。 她就那樣靜靜地躺著,像睡著了一般季蚂。 火紅的嫁衣襯著肌膚如雪茫船。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天扭屁,我揣著相機(jī)與錄音算谈,去河邊找鬼。 笑死料滥,一個(gè)胖子當(dāng)著我的面吹牛然眼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播葵腹,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼高每,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼屿岂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起鲸匿,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤爷怀,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后带欢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體运授,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年乔煞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吁朦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渡贾,死狀恐怖逗宜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情空骚,我是刑警寧澤纺讲,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站囤屹,受9級(jí)特大地震影響刻诊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜牺丙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望复局。 院中可真熱鬧冲簿,春花似錦、人聲如沸亿昏。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)角钩。三九已至吝沫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間递礼,已是汗流浹背惨险。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脊髓,地道東北人辫愉。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像将硝,于是被迫代替她去往敵國(guó)和親恭朗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子屏镊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345