微服务启动注册简要分析

从一张异常图开始分析:生成这个异常很简单,修改微服务契约,微服务启动时就会抛这个异常
image.png

  • 启动: Spring启动加载CseApplicationListener baan,调用注册管理服务的init接口,监听spring事件,事件触发后调用scbEngine.run();然后沿着上述的异常图可知,scbEngine对微服务进行注册;注册过程中发现serviceCenter和本地微服务契约不一样,抛异常。

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
      ...
      RegistrationManager.INSTANCE.init();
      DiscoveryManager.INSTANCE.init();
    }
    
    
    public void onApplicationEvent(ApplicationEvent event) {   
             ...
             scbEngine.run();
             ...
    }
  • ServiceCenterTask。1)注册任务生成,从RegistrationManager.INSTANCE.init();开始,经过RegistryUtils实现对RemoteServiceRegistry的init调用。2)任务执行,经过 RegistrationManager.INSTANCE.run(),最终到RemoteServiceRegistry的run方法,在AbstractServiceRegistry的run中执行

    // 经过RegistryUtils的init调用如下方法
    private static void initializeServiceRegistries(Configuration configuration) {
      ...
      executeOnEachServiceRegistry(ServiceRegistry::init);
      ...
    }
    
    //RemoteServiceRegistry的父类AbstractServiceRegistry创建
    @Override
    public void init() {
      if (srClient == null) {
        srClient = createServiceRegistryClient();
        eventBus.register(srClient);
      }
    
      // 创建ServiceCenterTask
      createServiceCenterTask();
    
      eventBus.register(this);
    
      initCache();
    }
    
    
    // AbstractServiceRegistry的run
    @Override
    public void run() {
      loadStaticConfiguration();
    
      // try register
      // if failed, then retry in thread
      serviceCenterTask.init();
    }
    
    // 注册服务中心任务执行
    public void init() {
      microserviceServiceCenterTask.run();
    }
  • ServiceCenterTask用到设计模式中的组合模式(Composite Design Pattern);MicroserviceServiceCenterTask是封装了其他任务,整体对外表示为一个组合任务。CompositeTask和AbstractRegisterTask 都有run方法,对外暴露一致的方法,方便客户端统一无差别调用; 但是内部处理不不一样,这个内部实现细节对客户端屏蔽,这就是组合模式。

    // MicroserviceServiceCenterTask是组合任务
    public class MicroserviceServiceCenterTask extends CompositeTask {
    public MicroserviceServiceCenterTask(EventBus eventBus, ServiceRegistryConfig serviceRegistryConfig,
        ServiceRegistryClient srClient, Microservice microservice) {
      addTask(new MicroserviceRegisterTask(eventBus, srClient, microservice));
      addTask(new MicroserviceInstanceRegisterTask(eventBus, serviceRegistryConfig, srClient, microservice));
      addTask(new MicroserviceWatchTask(eventBus, serviceRegistryConfig, srClient, microservice));
      addTask(new MicroserviceInstanceHeartbeatTask(eventBus, srClient, microservice));
      addTask(new MicroserviceInstanceStatusSyncTask(eventBus, srClient, microservice));
    }
    }
    
    // MicroserviceRegisterTask等5个任务是原子任务
    public class MicroserviceRegisterTask extends AbstractRegisterTask {
    }

ServicePathManager的生成

通过分析demo-edge例子,微服务consumer作为Consumer角色,调用business(做为Provider角色),调用链最终进入了CseClientHttpRequest的execute方法,如下
image.png

最重要的一个步骤是找到requestMeta信息,在requestMeta信息创建过程中,触发服务发现,通过一系列复杂的发现过程,最终得到了business微服务信息,包括endpoint和path这些信息。这些信息和一个servicePathManager有非常密切的关系。

因此,单独对servicePathManager生成过程做分析,如下

image.png

Provider初始化servicePathManager比较简单,微服务启动,SCBEngine运行起来就会创建Provider的servicePathManager.

Consumer稍微复杂一些,在服务发现触发之后创建的,创建过程通过引擎的事件总线把创建过程串起来。微服务发现过程中,触发CreateMicroserviceVersionEvent事件,事件在总线流动,先到ServiceRegistryListener的onCreateMicroserviceVersion,然后再到RestEngineSchemaListener的onCreateMicroserviceVersion,这两个订阅者做的事情,在上述图中已经加以说明。


ThinkFault
16 声望3 粉丝