微服务启动注册简要分析
从一张异常图开始分析:生成这个异常很简单,修改微服务契约,微服务启动时就会抛这个异常
启动: 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方法,如下
最重要的一个步骤是找到requestMeta信息,在requestMeta信息创建过程中,触发服务发现,通过一系列复杂的发现过程,最终得到了business微服务信息,包括endpoint和path这些信息。这些信息和一个servicePathManager有非常密切的关系。
因此,单独对servicePathManager生成过程做分析,如下
Provider初始化servicePathManager比较简单,微服务启动,SCBEngine运行起来就会创建Provider的servicePathManager.
Consumer稍微复杂一些,在服务发现触发之后创建的,创建过程通过引擎的事件总线把创建过程串起来。微服务发现过程中,触发CreateMicroserviceVersionEvent事件,事件在总线流动,先到ServiceRegistryListener的onCreateMicroserviceVersion,然后再到RestEngineSchemaListener的onCreateMicroserviceVersion,这两个订阅者做的事情,在上述图中已经加以说明。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。