其实这个博客应该是和上面的2个博客连贯起来的。
仔细想想,初始化->注册中心->服务调用。是不是嘛
我直接说重点了哈。
服务提供者启动的时候,中间会经历很多过程,但是最终会走到这个类的特定方法:
RegistryProtocol.export()
/** * RegistryProtocol * * 注册中心协议实现类。 */ public class RegistryProtocol implements Protocol { public void register(URL registryUrl, URL registedProviderUrl) { // 看到这个类有木有很熟悉的感觉呢?你懂我的意思把,第一篇博客里面截了图的,将服务注册到注册中心 Registry registry = registryFactory.getRegistry(registryUrl); registry.register(registedProviderUrl); } @Override public <T> Exporter<T> export(final Invoker<T> originInvoker) throws RpcException { // 暴露服务 // export invoker final ExporterChangeableWrapper<T> exporter = doLocalExport(originInvoker); // 获得注册中心 URL URL registryUrl = getRegistryUrl(originInvoker); // 获得注册中心对象 // registry provider final Registry registry = getRegistry(originInvoker); // 获得服务提供者 URL final URL registedProviderUrl = getRegistedProviderUrl(originInvoker); //to judge to delay publish whether or not boolean register = registedProviderUrl.getParameter("register", true); // 向注册中心订阅服务消费者 ProviderConsumerRegTable.registerProvider(originInvoker, registryUrl, registedProviderUrl); // 向注册中心注册服务提供者(自己) if (register) { register(registryUrl, registedProviderUrl); ProviderConsumerRegTable.getProviderWrapper(originInvoker).setReg(true); // // 标记向本地注册表的注册服务提供者,已经注册 } // 使用 OverrideListener 对象,订阅配置规则 // Subscribe the override data // FIXME When the provider subscribes, it will affect the scene : a certain JVM exposes the service and call the same service. Because the subscribed is cached key with the name of the service, it causes the subscription information to cover. // 创建订阅配置规则的 URL final URL overrideSubscribeUrl = getSubscribedOverrideUrl(registedProviderUrl); // 创建 OverrideListener 对象,并添加到 `overrideListeners` 中 final OverrideListener overrideSubscribeListener = new OverrideListener(overrideSubscribeUrl, originInvoker); overrideListeners.put(overrideSubscribeUrl, overrideSubscribeListener); // 向注册中心,发起订阅 registry.subscribe(overrideSubscribeUrl, overrideSubscribeListener); //Ensure that a new exporter instance is returned every time export return new DestroyableExporter<T>(exporter, originInvoker, overrideSubscribeUrl, registedProviderUrl); } }