pojo-provider项目的启动类是PojoProviderMain

查看其代码↓↓↓

github java github java-chassis_微服务

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

github java github java-chassis_ide_02

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

github java github java-chassis_github java_03

github java github java-chassis_ide_04

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


总结以上流程如下图 


github java github java-chassis_ide_05

github java github java-chassis_ide_06

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


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



github java github java-chassis_github java_07

github java github java-chassis_github java_08

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


github java github java-chassis_初始化_09

github java github java-chassis_初始化_10


>

> > >

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

源码如下,可以看到其会获取类路径下config/cse.handler.xml的文件。其实断点进去PaaSResourceUtils.getSortedResources方法可知还会获取类路径下config/cse.*.handler.xml文件。

github java github java-chassis_ide_11

在ProducerProviderManager初始化中,我们可以得到微服务的元数据信息microserviceMeta,并把它添加到RegistryUtils中定义的微服务当中↓

github java github java-chassis_微服务_12

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


github java github java-chassis_github java_13

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

github java github java-chassis_初始化_14

github java github java-chassis_微服务_15

— END—

github java github java-chassis_github java_16