小蜜蜂又给大家来送干货喽~本篇我们将以官方示例项目pojo-provider来分析Java-Chassis的启动流程。
> > > >
项目网址:
https://github.com/apache/servicecomb-java-chassis/tree/master/samples/pojo-sample/pojo-provider
pojo-provider项目的启动类是PojoProviderMain
查看其代码↓↓↓
如上所示,Log4jUtils.init是初始化日志服务。init方法代码如下,默认会从classpath*:config/base/log4j.properties和classpath*:config/log4j.properties两个路径读取log4j配置并合并。
BeanUtils.init对微服务进行初始化,init方法代码如下
默认会从classpath*:META-INF/spring/*.bean.xml路径加载配置文件,并将其传递给Spring框架的ClassPathXmlApplicationContext完成应用上下文加载。
在Spring context加载完成后,通过Spring Framework开源的事件调用机制和反射机制来触发ServiceComb自己的初始化逻辑。类似于观察者模型。
首先我们知道Spring框架的AbstractApplicationContext中的refresh函数是用来加载和刷新spring配置文件。
查看其源码可知道执行了以下步骤:
将配置文件中定义的Spring Bean进行加载;
spring Bean进行注册;
初始化事件广播器;
注册Listener;
初始化其他模型(finishRefresh())。
接着,在finishRefresh方法中通过publishEvent循环通知所有的观察者(ApplicationEvent的子类)的onApplicationEvent方法执行相应的操作,通过它我们可以定位到CseApplicationListener。
通过onApplicationEvent方法可以分析出以下步骤(绝大部分步骤发生在SCBEngine.doInit方法):
首先读取配置文件信息cse.handler.xml (HandlerConfigUtils.init())
然后进行Provider处理,主要是微服务元数据、Schema和契约的处理,并将其添加到RegistryUtils的微服务实例中; (producerProviderManager.init();)
接着启动一个异步无阻塞的网络框架vertx,并将初始化的EndPoint添加到RegistryUtils的微服务实例中; (transportManager.init();)
最后在RegistryUtils中实现微服务在服务管理中心的注册。 (RegistryUtils.run();)
总结以上流程如下图
在前面的流程分析中,CseApplicationListener类很关键,相当于Spring框架与ServiceComb的桥梁。在Spring初始化之后触发,初始化ServiceComb自身的配置。
CseApplicationListener最终触发SCBEngine.doInit方法,代码结构如下所示,triggerEvent是一种AOP机制。
进一步,在HandlerConfigUtils中,可以看到处理链handler实例的初始化。首先获取了handler处理链的配置信息,然后根据这些配置初始化所有的handler实例。
> > > >
源码如下,可以看到其会获取类路径下config/cse.handler.xml的文件。其实断点进去PaaSResourceUtils.getSortedResources方法可知还会获取类路径下config/cse.*.handler.xml文件。 在ProducerProviderManager初始化中,我们可以得到微服务的元数据信息microserviceMeta,并把它添加到RegistryUtils中定义的微服务当中↓
通过断点可知,微服务的元数据主要包括如下的内容:
TransportManager.init主要包括如下内容。transport.init()会启动一个异步无阻塞的网络框架vertx。启动成功后将初始化的EndPoint添加到RegistryUtils的微服务实例中。
— END —
文末小结
本文向社区读者从源码角度 分析 了Java-Chassis的启动流程。
我们也非常欢迎爱好者们向社区提问和贡献代码。
下章我们将介绍 ServiceComb是如何支持Spring Cloud Hystrix的。
如果在阅读代码时有任何疑问想交流,欢迎扫码加入进微信群。
扫描二维码
关注更多精彩
期待志同道合的朋友们加入
ServiceComb的大门为你们敞开~
用心做开源,不忘初衷
前期阅读
[学习微服务第10天]
Service-Center 启动流程分析
[学习微服务第9天]
Service-Center使用入门
[学习微服务-第8天]
ServiceComb内置负载均衡组件handler-loadbalance
[学习微服务第7天]
ServiceComb+SpringCloud Ribbon源码解读
[学习微服务-第6天]
负载均衡之ServiceComb + SpringCloud Ribbon
[学习微服务-第5天]
ServiceComb+Zipkin源码解读
[学习微服务-第4天]
ServiceComb+Zipkin
[学习微服务-第3天]
ServiceComb内置高性能网关服务
[每天学习微服务-源码解读]
ServiceComb+SpringCloud Zuul
[每天学习微服务-网关]
ServiceComb+SpringCloud Zuul
了解更多信息请访问: 官方网站 http://servicecomb.apache.org/ Github代码仓库 https://github.com/apache?q=ServiceComb
请戳 “阅读原文” 阅读相关源码
并给ServiceComb点个“Star”吧~