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.启动流程
- 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
实现方式:加载 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 发现.
遍历每个应用的服务,如果服务被施加 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
启动 Netty 监听所有客户端请求,即实现 RPC 调用,具体分析请参考大鹏远程通信分析.
注册 MBean 信息.
启用 Logback 记录日志.
启动线程监听配置的文档端口,以供 HTTP 访问 API 文档.