[学习微服务] ServiceComb之Java-Chassis启动流程分析

640?wx_fmt=gif

小蜜蜂又给大家来送干货喽~本篇我们将以官方示例项目pojo-provider来分析Java-Chassis的启动流程。

> > > >

项目网址:

https://github.com/apache/servicecomb-java-chassis/tree/master/samples/pojo-sample/pojo-provider


pojo-provider项目的启动类是PojoProviderMain

查看其代码↓↓↓

640?wx_fmt=png

如上所示,Log4jUtils.init是初始化日志服务。init方法代码如下,默认会从classpath*:config/base/log4j.properties和classpath*:config/log4j.properties两个路径读取log4j配置并合并。

640?wx_fmt=pngBeanUtils.init对微服务进行初始化,init方法代码如下

640?wx_fmt=gif

640?wx_fmt=png

默认会从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();)


总结以上流程如下图 

640?wx_fmt=gif

640?wx_fmt=png

在前面的流程分析中,CseApplicationListener类很关键,相当于Spring框架与ServiceComb的桥梁。在Spring初始化之后触发,初始化ServiceComb自身的配置。


CseApplicationListener最终触发SCBEngine.doInit方法,代码结构如下所示,triggerEvent是一种AOP机制。


640?wx_fmt=gif

640?wx_fmt=png

进一步,在HandlerConfigUtils中,可以看到处理链handler实例的初始化。首先获取了handler处理链的配置信息,然后根据这些配置初始化所有的handler实例。

640?wx_fmt=gif

640?wx_fmt=png


> > > >

那么它会从哪里获取配置呢?

源码如下,可以看到其会获取类路径下config/cse.handler.xml的文件。其实断点进去PaaSResourceUtils.getSortedResources方法可知还会获取类路径下config/cse.*.handler.xml文件。640?wx_fmt=png在ProducerProviderManager初始化中,我们可以得到微服务的元数据信息microserviceMeta,并把它添加到RegistryUtils中定义的微服务当中↓

640?wx_fmt=png

通过断点可知,微服务的元数据主要包括如下的内容:

640?wx_fmt=png

TransportManager.init主要包括如下内容。transport.init()会启动一个异步无阻塞的网络框架vertx。启动成功后将初始化的EndPoint添加到RegistryUtils的微服务实例中。640?wx_fmt=png

640?wx_fmt=png

END640?wx_fmt=png 640?wx_fmt=png

文末小结


本文向社区读者从源码角度分析了Java-Chassis的启动流程。

我们也非常欢迎爱好者们向社区提问和贡献代码。

下章我们将介绍ServiceComb是如何支持Spring Cloud Hystrix的。

如果在阅读代码时有任何疑问想交流,欢迎扫码加入进微信群。

640?wx_fmt=png 640?wx_fmt=png

扫描二维码

关注更多精彩

期待志同道合的朋友们加入

ServiceComb的大门为你们敞开~

用心做开源,不忘初衷

640?wx_fmt=png前期阅读

[学习微服务第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

640?wx_fmt=png 640?wx_fmt=png

了解更多信息请访问: 

官方网站 http://servicecomb.apache.org/ 

Github代码仓库 https://github.com/apache?q=ServiceComb 


640?wx_fmt=gif

请戳“阅读原文”阅读相关源码

并给ServiceComb点个“Star”吧~

640?wx_fmt=gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值