6.入门指南-Part1: Actor架构

10 篇文章 5 订阅
订阅专栏

Part1: Actor架构

依赖

在你的项目中添加如下依赖:

<properties>
  <scala.binary.version>2.13</scala.binary.version>
</properties>
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.typesafe.akka</groupId>
      <artifactId>akka-bom_${scala.binary.version}</artifactId>
      <version>2.6.19</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
<dependencies>
  <dependency>
    <groupId>com.typesafe.akka</groupId>
    <artifactId>akka-actor-typed_${scala.binary.version}</artifactId>
  </dependency>
</dependencies>

引言

使用 Akka 使您无需为 Actor 系统创建基础设施,也无需编写控制基本行为所需的低级代码。 为了理解这一点,让我们看看您在代码中创建的Actor与 Akka 在内部为您创建和管理的Actor之间的关系、Actor的生命周期以及如何处理故障。

Akka actor层次架构

在Akka中,一个Actor总是有一个父级。您可以通过调用ActorContext.spawn()来创建一个Actor。创建Actor的创建者是新创建出来的子Actor的父级。你可能会问,你创建的第一个Actor的父级是谁?
如下图所示,所有 Actor 都有一个共同的父级,用户守护者是在您启动 ActorSystem 时定义和创建的。 正如我们在快速入门指南中介绍的那样,创建Actor会返回一个有效 URL 的引用。 因此,例如,如果我们使用 context.spawn(someBehavior, "someActor") 从用户守护者创建一个名为 someActor 的演员,它的引用路径是 /user/someActor
在这里插入图片描述
实际上,你的第一个Actor启动前,Akka已经在系统中创建了两个Actor。这些内置Actor的名字包含守护对象。守护Actor包括:

  • / root守护对象。这是在系统中所有Actor的父级,也是在系统关闭时最后停止的一个。
  • /system 系统守护对象。Akka 或其他构建在 Akka 之上的库可以在系统命名空间中创建Actor。
  • /user 用户守护对象。这是您提供的用于启动应用程序中所有其他Actor的顶级Actor。

查看 Actor 层次结构的最简单方法是打印 ActorRef 实例。 在这个小实验中,我们创建了一个 actor,打印它的引用,创建这个 actor 的一个子节点,并打印该子节点的引用。 我们从 Hello World 项目开始,如果您还没有下载它,请从 Lightbend 技术中心下载 Quickstart 项目。

在您的Hello World项目中,进入到com.example包下,并为下面代码片段中的每个类创建一个 Java 文件并复制相应的内容。 保存文件并从构建工具或 IDE 运行 com.example.ActorHierarchyExperiments 以观察输出。

请注意消息要求第一个Actor完成工作的方式。 我们使用父级的引用发送消息:firstRef.tell("printit", ActorRef.noSender())。当代码执行时,输出包括第一个Actor的引用和它作为 printit 案例的一部分创建的子节点。 您的输出应类似于以下内容:

First: Actor[akka://testSystem/user/first-actor#96948015]
Second: Actor[akka://testSystem/user/first-actor/second-actor#-1516441762]

注意引用的结构:

  • 两个路径都是以akka://testSystem/开头。由于所有Actor引用都是有效的 URL,所以 akka:// 是协议字段的值。
  • 接下来,就像在万维网上一样,URL 标识系统。 在此示例中,系统名为 testSystem,但它可以是任何其他名称。 如果启用了多个系统之间的远程通信,则 URL 的这一部分包含主机名,以便其他系统可以在网络上找到它。
  • 因为第二个Actor的引用包含路径/first-actor/,所以它将它其标识为第一个Actor的子节点。
  • Actor引用的最后一部分,#96948015#-1516441762 是一个唯一标识符,在大多数情况下您可以忽略它。

现在您了解了Actor层次结构的样子,您可能想知道:为什么我们需要这个层次结构? 它是干什么用的?

层次结构的一个重要作用是安全地管理Actor的生命周期。 接下来让我们考虑一下,看看这些知识如何帮助我们编写更好的代码。

Actor生命周期

Actor 在创建时出现,然后在用户请求时停止。 每当一个actor停止时,它的所有子节点也会递归停止。 这种行为极大地简化了资源清理,并有助于避免诸如由打开的套接字和文件引起的资源泄漏。 事实上,在处理低级多线程代码时,一个经常被忽视的难点是各种并发资源的生命周期管理。

要停止Actor,推荐的模式是在Actor内部返回 Behaviors.stopped() 以停止自身,通常作为对某些用户定义的停止消息的响应或当Actor完成其工作时。 通过从父级调用 context.stop(childRef) 来停止子actor在技术上是可能的,但不可能以这种方式停止任意(非子)actor。

Akka actor API 公开了一些生命周期触发机制,例如 PostStop 在 actor 停止后立即发送。 在此之后不会处理任何消息。

让我们在一个简单的实验中使用 PostStop 生命周期触发机制来观察我们停止Actor时的行为。 首先,将以下 2 个Actor类添加到您的项目中:

class StartStopActor1 extends AbstractBehavior<String> {

  static Behavior<String> create() {
    return Behaviors.setup(StartStopActor1::new);
  }

  private StartStopActor1(ActorContext<String> context) {
    super(context);
    System.out.println("first started");

    context.spawn(StartStopActor2.create(), "second");
  }

  @Override
  public Receive<String> createReceive() {
    return newReceiveBuilder()
        .onMessageEquals("stop", Behaviors::stopped)
        .onSignal(PostStop.class, signal -> onPostStop())
        .build();
  }

  private Behavior<String> onPostStop() {
    System.out.println("first stopped");
    return this;
  }
}

class StartStopActor2 extends AbstractBehavior<String> {

  static Behavior<String> create() {
    return Behaviors.setup(StartStopActor2::new);
  }

  private StartStopActor2(ActorContext<String> context) {
    super(context);
    System.out.println("second started");
  }

  @Override
  public Receive<String> createReceive() {
    return newReceiveBuilder().onSignal(PostStop.class, signal -> onPostStop()).build();
  }

  private Behavior<String> onPostStop() {
    System.out.println("second stopped");
    return this;
  }
}

然后像上面一样创建一个Main类,用来启动Actor然后发送stop消息:

ActorRef<String> first = context.spawn(StartStopActor1.create(), "first");
first.tell("stop");

您也可以使用sbt来启动程序。输出应如下所示:

first started
second started
second stopped
first stopped

当我们停止firstActor时,在停止前它会先去停止它的子Actorsecond。这个顺序是严格的,所有子节点的 PostStop 信号在处理父节点的 PostStop 信号之前被处理。

异常处理

父子Actor在他们的整个生命周期中都是相互联系的。 每当Actor失败(抛出异常或从 Receive 中冒出未处理的异常)时,失败信息就会传播到监督策略,然后由监督策略决定如何处理由Actor引起的异常。 监督策略通常由父 Actor 在生成子 Actor 时定义。 这样,父Actor就充当了子Actor的监督者。 默认的主管策略是停止子Actor。 如果您不定义策略,所有失败都会导致停止。

让我们在一个简单的实验中观察重启监督策略。 将以下类添加到您的项目中,就像您对之前的类所做的那样:

class SupervisingActor extends AbstractBehavior<String> {

  static Behavior<String> create() {
    return Behaviors.setup(SupervisingActor::new);
  }

  private final ActorRef<String> child;

  private SupervisingActor(ActorContext<String> context) {
    super(context);
    child =
        context.spawn(
            Behaviors.supervise(SupervisedActor.create()).onFailure(SupervisorStrategy.restart()),
            "supervised-actor");
  }

  @Override
  public Receive<String> createReceive() {
    return newReceiveBuilder().onMessageEquals("failChild", this::onFailChild).build();
  }

  private Behavior<String> onFailChild() {
    child.tell("fail");
    return this;
  }
}

class SupervisedActor extends AbstractBehavior<String> {

  static Behavior<String> create() {
    return Behaviors.setup(SupervisedActor::new);
  }

  private SupervisedActor(ActorContext<String> context) {
    super(context);
    System.out.println("supervised actor started");
  }

  @Override
  public Receive<String> createReceive() {
    return newReceiveBuilder()
        .onMessageEquals("fail", this::fail)
        .onSignal(PreRestart.class, signal -> preRestart())
        .onSignal(PostStop.class, signal -> postStop())
        .build();
  }

  private Behavior<String> fail() {
    System.out.println("supervised actor fails now");
    throw new RuntimeException("I failed!");
  }

  private Behavior<String> preRestart() {
    System.out.println("supervised will be restarted");
    return this;
  }

  private Behavior<String> postStop() {
    System.out.println("supervised stopped");
    return this;
  }
}

然后运行:

ActorRef<String> supervisingActor =
    context.spawn(SupervisingActor.create(), "supervising-actor");
supervisingActor.tell("failChild");

您应该会看到类似于以下内容的输出:

supervised actor started
supervised actor fails now
supervised actor will be restarted
supervised actor started
[ERROR] [11/12/2018 12:03:27.171] [ActorHierarchyExperiments-akka.actor.default-dispatcher-2] [akka://ActorHierarchyExperiments/user/supervising-actor/supervised-actor] Supervisor akka.actor.typed.internal.RestartSupervisor@1c452254 saw failure: I failed!
java.lang.Exception: I failed!
	at typed.tutorial_1.SupervisedActor.onMessage(ActorHierarchyExperiments.scala:113)
	at typed.tutorial_1.SupervisedActor.onMessage(ActorHierarchyExperiments.scala:106)
	at akka.actor.typed.scaladsl.AbstractBehavior.receive(AbstractBehavior.scala:59)
	at akka.actor.typed.Behavior$.interpret(Behavior.scala:395)
	at akka.actor.typed.Behavior$.interpretMessage(Behavior.scala:369)
	at akka.actor.typed.internal.InterceptorImpl$$anon$2.apply(InterceptorImpl.scala:49)
	at akka.actor.typed.internal.SimpleSupervisor.aroundReceive(Supervision.scala:85)
	at akka.actor.typed.internal.InterceptorImpl.receive(InterceptorImpl.scala:70)
	at akka.actor.typed.Behavior$.interpret(Behavior.scala:395)
	at akka.actor.typed.Behavior$.interpretMessage(Behavior.scala:369)

我们看到,在失败后,受监督的 Actor 被停止并立即重新启动。 我们还看到一个日志条目报告已处理的异常,在这种情况下,是我们的测试异常。 在此示例中,我们还使用了在重新启动之前处理的 PreRestart 信号。

如果您想更多了解,我们还建议您查看容错参考页面以获取更深入的详细信息。

总结

我们已经了解了 Akka 如何在父Actor监督子Actor及异常处理的层次结构中管理Actor。 我们看到了如何创建一个非常简单的Actor及其子Actor。 接下来,我们将通过对从设备Actor获取信息所需的通信进行建模,将这些知识应用到我们的示例用例中。 稍后,我们将讨论如何管理组中的Actor。

Next: Part2: 创建第一个Actor

【Thingsboard】源码分析:Actor模型架构
这个人很懒什么都没有~
11-06 881
Device Actor: 维护设备的状态:活动会话、订阅、挂起的 RPC 命令等。App Actor:负责租户Actor的管理。处理规则引擎(链/节点)actor 消息的 actor 系统调度程序的线程池大小。处理 device actor 消息的 actor 系统调度程序的线程池大小。处理 tenant actor 消息的 actor 系统调度器的线程池大小。在切换到处理下一个参与者的消息之前,参与者系统将处理每个参与者的消息数。处理 app actor 消息的 actor 调度程序的线程池大小。
Flink报错:org.apache.flink.util.FlinkRuntimeException: Exceeded checkpoint tolerable failure threshold
小蚯蚓的博客
01-14 4811
org.apache.flink.util.FlinkRuntimeException: Exceeded checkpoint tolerable failure threshold 一、问题描述 flink执行任务报错 2022-01-11 15:10:49 org.apache.flink.util.FlinkRuntimeException: Exceeded checkpoint tolerable failure threshold. at org.apache.flink.runtime.c
actor 框架
大黄蜂的博客
12-16 2467
前言 传统的游戏服务器要么是单线程要么是多线程,过去几十年里CPU一直遵循摩尔定律发展,带来的结果是单核频率越来越高。而近几年摩尔定义在CPU上已然失效,为什么呢? 大于在2003年左右,计算机的核心特性经历了一个重要的变化,处理器的速度达到了一个顶点。在接下来近15年里,时钟速度是呈线性增长的,而不会像以前那样以指数级的速度增长。 由于CPU的工艺制程和发热稳定性之间难以取舍,取而代之的策略是增...
Actor模型介绍与应用
最新发布
weixin_44716895的博客
08-29 1174
actor模型介绍,akka介绍,自定义actor模型
actor模型 java框架,Actor模型以及网络程序架构
weixin_39641876的博客
03-12 213
在去年实现我的Raft实现,考察过一些Raft算法的实现,包括Golang的一些实现。基于Golang的实现给人的第一感觉是,不知道有哪些协程是“持续”运行的,比如说监听网络请求,快照生成等等。而且由于CSP模型不关注发送者和接受者导致数据追踪比较困难,在没有IDE的情况下你可能几眼都看不出数据到了哪个模块的哪行代码。个人不确实是不是开发者的问题,导致这个网络程序架构那么松散,还是说CSP模型下的...
【AKKA 官方文档翻译】第一部分:Actor架构
TJM2014的博客
12-18 378
第一部分:Actor架构 akka版本2.5.8 版权声明:本文为博主原创文章,未经博主允许不得转载。 Akka为你提供了创建actor系统的一些基础功能,并且已经实现了控制基本行为必需的底层代码。为了体会这一点,我们来看看你创建的actor角色与akka内部创建的管理角色的关系,顺便了解下actor的生命周期和失败处理方式。 ...
Orleans 微软基于 Actor 的分布式框架
热门推荐
zhujisoft的专栏
07-15 2万+
Orleans是微软开源的分布式基于Actor的模型框架。Orleans 是一个跨平台框架,用于构建可靠且可缩放的分布式应用程序。分布式应用程序定义为跨多个进程的应用,通常使用对等通信来超越硬件边界。Orleans 从单个本地服务器扩展到了云中成百上千的分布式、高度可用的应用程序。Orleans 将熟悉的概念和 C# 习语扩展到了多服务器环境。Orleans 在设计上可弹性缩放。当主机加入群集时,它可以接受新的激活。
protoactor-go:Proto Actor-用于Go,C#和JavaKotlin的超快速分布式actor
02-25
跨平台演员 介绍Go和C#之间的跨平台参与者支持。 我可以用这个吗? Go实施仍处于测试阶段,已经有... 超快速远程处理,Proto Actor目前设法仅使用两个actor在节点之间每秒传递超过200万条消息,同时仍保持消息顺序!
Scala编程详解 第21讲-Scala编程详解:Actor入门 共8页.pptx
11-25
Scala编程详解:Actor入门 Scala中的Actor模型是其并发编程的核心机制,它是基于消息传递的并发模型,旨在解决多线程编程中常见的竞态条件、死锁等问题。Actor系统允许程序在安全的环境中并行运行,通过异步消息...
orleans-product-api-sample:基于Actor模型的产品API样本(含奥尔良)。 聚会示例项目
05-10
奥尔良(Orleans)产品API样本项目是一个利用Actor模型构建的应用示例,它主要基于.NET Core(也标记为dotnetcore或dotnet-core)框架,并且使用了Orleans框架(orleans-framework)。这个项目旨在展示如何在C#...
矩阵对策Matlab代码-L2RPN-using-A3C:使用Actor-Critic框架进行L2RPN挑战的强化学习(https://l2r
06-13
Actor-Critic 框架进行 L2RPN 挑战 ( & ) 的强化学习。 使用此代码训练的代理是挑战的获胜者之一。 代码使用pypownet环境()。 该代码是在 LGPLv3 许可下发布的。 要求 Python >= 3.6 凯拉斯 pypownet 虚拟环境 ...
actors-in-java:玩Java中的actor框架
05-24
玩具演员框架 这对做真实的工作没有什么用,只是一个尝试一些事情的场所。 该API就像我认为的Orbit一样,尽管我只尝试了几分钟。
Akka的Hello World(一)Akka的Actor架构
康雨城
05-24 558
使用Akka可以减轻您为actor系统创建基础结构的麻烦,也可以减少编写控制基本行为所需的低级代码。为了理解这一点,让我们看一下您在代码中创建的actor与Akka在内部为您创建和管理的actor之间的关系,actor生命周期和失败处理。
actor框架-Akka
weixin_33849942的博客
01-26 80
2019独角兽企业重金招聘Python工程师标准>>> ...
操作者框架(Actor Framework)快速使用篇
qq_43194510的博客
07-02 2902
Labview操作者框架讲解
C++ Actor并发模型框架 Actor Framework (CAF)
BBinChina的专栏
06-04 4878
什么是ACTOR 并发模型 Actor 是一种处理并发计算的基本模型,主要概念是通过OO 面向对象思想,将计算单元独立成一个对象,在模型中成为Actor,各个独立计算单元之间的通信通过mailbox(邮箱),每个Actor维护自己的mailbox,ma ilbox存储的是需要消费的消息。这里扩散一下知识,在更早期出现的ESB(enterprise service bus)企业服务总线模型是将服务接到消息总线上,服务获取总线上投递给他的消息。 这种方式存在耦合,以及需要一个个服务进行确认,直到消费者进行确认消
Skynet基于Actor模式的开源框架
Linuxhus的博客
01-11 1472
使用多进程解决高并发带来的问题是进程安全锁,框架经常会因为部分代码的报错而导致死锁或内存占用不释放等诸多问题。而使用单进程的服务器框架,通过线程池来做消息轮询和任务执行,能够避开锁带来的诸多问题。 框架的初衷 众核时代的并行编程 免费的晚餐已经结束了(The Free Lunch Is Over -- Herb Sutter, 2005) E5420(2.5GHz 2004) VS E5-2620v3(2.4GHz 2014) 我们获得了更多的核心、更多的线程、更大的缓
java actor 框架 易用_ET框架Actor使用与心得
weixin_39771791的博客
02-13 235
经过这几天的研究、遇到了无数坑,经过了群主和群里的各位大佬一一指点,算了明白了Actor的使用和机制。Actor是ET框架最核心的东西了,使用Actor之前一定要明白什么是分布式服务器,我简单说一下。分布式简单说就是我有3台服务器共同为一个游戏服务、那么他们的关系是:客户端第一次通信:客户端-验证服务器-网关服务器-验证服务器-客户端客户端通信(进行了第一次通信后):客户端-网关服务器-其他功能服...
java框架actor_Scala的Actor模式 & Akka框架
weixin_42453228的博客
02-27 265
今天学Spark的时候,看到Scala的actor模式是一个加分点。所以搜了一下,看了。主要参考下面两篇文章,还没有实验,有些地方领会的不深刻:十分钟理解Actor模式Actor模式是一种并发模型,与另一种模型共享内存完全相反,Actor模型share nothing。所有的线程(或进程)通过消息传递的方式进行合作,这些线程(或进程)称为Actor。共享内存更适合单机多核的并发编程,而且共享带来的...
CheckpointCoordinator.java:875) 2023-06-29 14:11:03,031 | INFO | [Checkpoint Timer] | Triggering checkpoint 2 @ 1688019063016 for job decab560f4e6c83c8a4c599b7b336d92. | org.apache.flink.runtime.checkpoint.CheckpointCoordinator (CheckpointCoordinator.java:600) 2023-06-29 14:11:04,975 | INFO | [flink-akka.actor.default-dispatcher-4] | Map -> (Map -> Filter -> Map -> Process -> Sink: Unnamed, Map -> Map -> Sink: Unnamed) (1/3) (16acda9038be46fa5eae44b15181c5f6) switched from RUNNING to FAILED. | org.apache.flink.runtime.executiongraph.ExecutionGraph (Execution.java:1342) java.lang.NoClassDefFoundError: org/apache/commons/validator/routines/InetAddressValidator at org.apache.rocketmq.common.UtilAll.ipV6Check(UtilAll.java:491) at org.apache.rocketmq.common.UtilAll.getIP(UtilAll.java:547)
07-20
根据日志信息,这是一个 Apache Flink 的异常。具体来说,出现了 `java.lang.NoClassDefFoundError: org/apache/commons/validator/routines/InetAddressValidator` 错误。这个错误表示找不到 `org.apache.commons.validator.routines.InetAddressValidator` 类。 这个问题可能是由于缺少相关的依赖引起的。你可以检查你的项目依赖中是否包含 `commons-validator` 库,并且版本是否正确。如果缺少该库,你可以将其添加到你的项目依赖中。 另外,还要确保你的项目环境中有足够的权限和资源来运行 Apache Flink 任务。还可以检查网络和配置文件等方面是否存在其他问题。如果问题仍然存在,请提供更多的日志信息以便进一步排查。
写文章

热门文章

  • 查找tomcat程序中某个进程占用CPU高的方法 2911
  • 1.入门指南-Akka介绍 2083
  • Akka Actor快速开始(Java) 921
  • PowerDesigner反向生成Mysql表结构的实践 919
  • Nexus本地maven服务器搭建详细介绍 665

分类专栏

  • Akka 10篇
  • 问题解决 1篇
  • 学习整理 4篇
  • PowerDesigner

最新评论

  • PowerDesigner反向生成Mysql表结构的实践

    南丁格尔帅: 为什么 我选数据库了 ,点击生成 而生成的是所有数据库的表

最新文章

  • 9.入门指南- Part4: 使用设备组
  • 8.入门指南-Part3: 使用设备Actor
  • 7.入门指南-Part2: 创建第一个Actor
2022年13篇
2018年1篇
2017年1篇
2015年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家特色玻璃钢花盆有哪些娄底玻璃钢花盆铜仁商场美陈门头山东玻璃钢小品雕塑工程黑龙江园林玻璃钢雕塑定制吉林佛像玻璃钢雕塑哪家便宜供应玻璃钢座椅雕塑聊城玻璃钢气球雕塑玻璃钢黄鹂鸟雕塑苏州玻璃钢动物雕塑设计玻璃钢雕塑主要材质是什么广西玻璃钢卡通雕塑橘子泰州白色玻璃钢花盆嘉峪关玻璃钢雕塑报价广州组合式玻璃钢花盆深圳玻璃钢卡通雕塑艺术品青岛玻璃钢雕塑景观厂家海口加工玻璃钢雕塑哪家好商场美陈粉色义乌玻璃钢雕塑厂家联系方式开阳玻璃钢雕塑厂家玻璃钢雕塑摆件报价商场美陈软装分类广东仿铜玻璃钢雕塑市场石家庄玻璃钢雕塑品质售后无忧广州玻璃钢雕塑大全江苏商业商场美陈甘肃博物馆玻璃钢雕塑陕西基督教玻璃钢雕塑南京春节商场美陈香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化