转载

ServiceComb 之 Java-Chassis 启动流程分析

ServiceComb 之 Java-Chassis 启动流程分析

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

> > > >

项目网址:

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

pojo-provider项目的启动类是PojoProviderMain

查看其代码↓↓↓

ServiceComb 之 Java-Chassis 启动流程分析

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

BeanUtils.init对微服务进行初始化,init方法代码如下

ServiceComb 之 Java-Chassis 启动流程分析

ServiceComb 之 Java-Chassis 启动流程分析

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

总结以上流程如下图  

ServiceComb 之 Java-Chassis 启动流程分析

ServiceComb 之 Java-Chassis 启动流程分析

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

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

ServiceComb 之 Java-Chassis 启动流程分析

ServiceComb 之 Java-Chassis 启动流程分析

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

ServiceComb 之 Java-Chassis 启动流程分析

ServiceComb 之 Java-Chassis 启动流程分析

> > > >

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

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

ServiceComb 之 Java-Chassis 启动流程分析

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

ServiceComb 之 Java-Chassis 启动流程分析

TransportManager.init主要包括如下内容。transport.init()会启动一个异步无阻塞的网络框架vertx。启动成功后将初始化的EndPoint添加到RegistryUtils的微服务实例中。 ServiceComb 之 Java-Chassis 启动流程分析

ServiceComb 之 Java-Chassis 启动流程分析

END

ServiceComb 之 Java-Chassis 启动流程分析

ServiceComb 之 Java-Chassis 启动流程分析

文末小结

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

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

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

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

ServiceComb 之 Java-Chassis 启动流程分析

扫描二维码

关注更多精彩

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

ServiceComb的大门为你们敞开~

用心做开源,不忘初衷

ServiceComb 之 Java-Chassis 启动流程分析

前期阅读

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

ServiceComb 之 Java-Chassis 启动流程分析

了解更多信息请访问: 
官方网站 http://servicecomb.apache.org/ 
Github代码仓库 https://github.com/apache?q=ServiceComb 
ServiceComb 之 Java-Chassis 启动流程分析

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

并给ServiceComb点个“Star”吧~

ServiceComb 之 Java-Chassis 启动流程分析

原文  https://mp.weixin.qq.com/s?__biz=MzUxNTEwNTg5Mg==&mid=2247487091&idx=1&sn=7bdb5d8753db88a618e917e38b86e1a8&chksm=f9bafb78cecd726e2b2300de76a18dfdbbc8b8a108ade22cdd791546cb58479ba9e060a652e1&token=277082404&lang=zh_CN
正文到此结束
Loading...