dapeng-soa启动分析

dapeng-soa

1.Scala-sbt插件

sbt 是 Scala 项目管理工具,类似于 Java 中的 Maven.

1.1.ThriftGeneratorPlugin 生成 Thrift 代码及资源

1.2.RunContainerPlugin 运行大鹏服务

1.3.DbGeneratePlugin 数据库生成插件

1.4.ImageGeneratorPlugin镜像生成器

2.大鹏容器分析

2.1.启动流程

image

  • 2.1.1.大鹏容器启动类com.github.dapeng.bootstrap.Bootstrap.
备注:soa.base属性参数用于指定容器目录.且有默认值.

1. main(String[] args)及sbtStartup(ClassLoader containerClassLoader, List<URL> applicationLibs)
用来初始化ClassLoader.初始化ClassLoader完成后,
调用startup(ClassLoader containerCl, List<ClassLoader> applicationCls).
2.startup 方法.
调用com.github.dapeng.api.ContainerFactory类的CreateContainer 方法创建容器.
然后再获取已创建的容器,最后调用容器的startup方法完成启动.
  • 2.1.2.容器工厂com.github.dapeng.api.ContainerFactory
利用 JAVA 服务加载动态加载容器并实例化.
  • 2.1.3.大鹏容器接口com.github.dapeng.api.Container
大鹏容器的主结构,负责管理容器相关的监听器,插件,应用程序。
所有的组件的注册,卸载动作都应该由Container来负责
方法void startup()用于启动容器.
  • 2.1.4.大鹏容器实现com.github.dapeng.impl.container.DapengContainer
以插件和过滤器的方法实现容器,实现容器的可扩展性.
注意:属性配置soa.run.mode,默认为 plugin
startup()方法实现
1.插件列表
SpringAppLoader 插件
ZookeeperRegistryPlugin 插件
TaskSchedulePlugin 插件
NettyPlguin 插件
MBeanAgentPlugin 插件
以下两个插件只在 Soa.run.mode为 plugin 时执行.
LogbackPlugin 插件
ApiDocPlugin 插件
以上插件构造完成后,执行 start()方法启用插件.
2.过滤器列表
过滤器分成容器过滤器应用过滤器.
LogFilter
HeadFilter
  • 2.1.5.SpringAppLoader 插件
实现方式:加载 Spring 配置文件初始化Spring 容器.Spring 配置文件路径为META-INF/spring/services.xml
使用org.springframework.context.support.ClassPathXmlApplicationContext加载类型为com.github.dapeng.core.definition.SoaServiceDefinition的 Bean.
将前一步得到的 SoaServiceDefinition 列表转换为Map<String,ServiceInfo>
构建DapengApplication
调用Spring的 ApplicationContext的start()方法启动.
接着执行下面各种注册
Map<ProcessorKey, SoaServiceDefinition<?>> serviceDefinitionMap = toSoaServiceDefinitionMap(appInfos, processorMap);
container.registerAppProcessors(serviceDefinitionMap);
container.registerAppMap(toApplicationMap(serviceDefinitionMap, application));
container.registerApplication(application); //fire a zk event
至此 Spring 加载完成启动完成.
  • 2.1.6.ZookeeperRegistryPlugin插件
连接到Zookeeper中心
将每个应用的每个服务向注册中心注册,以便调用者可以通过 Zookeeper 发现.
  • 2.1.7.TaskSchedulePlugin
遍历每个应用的服务,如果服务被施加 ScheduledTask 注解,则调用 runTask(ServiceInfo serviceinfo)方法.

下面我们一起看看 runTask 方法实现.
a.获取服务方法中被施加ScheduledTaskCron注解的方法,获取服务定义.
b.逐个执行以下操作:
b.1.提取方法的 Cron 表达式.
b.2.构建quartz调用的 JobDetail 对象.
b.3.构建CronTriggerImpl 对象,注入Cron 表达式.
b.4.单一调用器构建及启动
b.5.提交任务.
c.任务的具体执行参考 StdSchedulerFactory
  • 2.1.8.NettyPlugin
启动 Netty 监听所有客户端请求,即实现 RPC 调用,具体分析请参考大鹏远程通信分析.
  • 2.1.8.MBeanAgentPlugin
注册 MBean 信息.
  • 2.1.9.LogbackPlugin
启用 Logback 记录日志.
  • 2.1.10.ApiDocPlugin
启动线程监听配置的文档端口,以供 HTTP 访问 API 文档.
posted @ 2018-08-28 10:43  冰冰与铛铛  阅读(420)  评论(0编辑  收藏  举报