【6】图示:

文章插图
Dubbo服务导出【0】服务导出要做的几件事情:
1. 确定服务的参数2. 确定服务支持的协议3. 构造服务最终的URL4. 将服务URL注册到注册中心去5. 根据服务支持的不同协议,启动不同的Server,用来接收和处理请求6. 因为Dubbo支持动态配置服务参数,所以服务导出时还需要绑定一个监听器Listener来监听服务的参数是否有修改,如果发现有修改 , 则需要重新进行导出【1】核心点记录
ServiceBean的两种暴露服务的方法1.利用InitializingBean接口 , 调用export()方法(没有监听器的情况下才行)2.利用监听ContextRefreshedEvent事件达到服务暴露动态代理生成 Invoker 包装成 wrapperInvokerRegistryProtocol进行注册 DubboProtocol对 Invoker 进行导出,返回一个Exporter
ExchangeServer
【2】ServiceBean是怎么进程服务导出的
//1是利用InitializingBean接口 , 调用export()方法【主要是调用父类的export()方法和发布ServiceBeanExportedEvent事件】//2是利用监听ContextRefreshedEvent事件达到服务暴露public class ServiceBean<T> extends ServiceConfig<T> implements InitializingBean, DisposableBean, ApplicationContextAware, ApplicationListener<ContextRefreshedEvent>, BeanNameAware, ApplicationEventPublisherAware {....@Overridepublic void setApplicationContext(ApplicationContext applicationContext) {this.applicationContext = applicationContext;// 如果某一个Service是通过Spring暴露的,// 那么当需要获取该服务时就要从Spring容器中进行获?。?// 也就是从applicationContext中获?。孕枰補pplicationContext添加到SpringExtensionFactory中去SpringExtensionFactory.addApplicationContext(applicationContext);// 一定要有这一步 , 不然ServiceBean将接收不到ContextRefreshedEvent事件supportedApplicationListener = addApplicationListener(applicationContext, this);}//当接收到监听ContextRefreshedEvent事件时候@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {// 当前服务没有被导出并且没有卸载,才导出服务if (!isExported() && !isUnexported()) {if (logger.isInfoEnabled()) {logger.info("The service ready on spring started. service: " + getInterface());}// 服务导出(服务注册)export();}}@Override@SuppressWarnings({"unchecked", "deprecation"})public void afterPropertiesSet() throws Exception {// 如果@Service中没有配置providerif (getProvider() == null) {// 就从Spring容器中找ProviderConfig类型的BeanMap<String, ProviderConfig> providerConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ProviderConfig.class, false, false);if (providerConfigMap != null && providerConfigMap.size() > 0) {// 从Spring容器中找ProtocolConfig类型的BeanMap<String, ProtocolConfig> protocolConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ProtocolConfig.class, false, false);// 如果存在ProtocolConfig存在 , 并且存在多个ProviderConfigif (CollectionUtils.isEmptyMap(protocolConfigMap) && providerConfigMap.size() > 1) { // backward compatibility// 如果找到多个,取第一个default等于true的ProviderConfigList<ProviderConfig> providerConfigs = new ArrayList<ProviderConfig>();for (ProviderConfig config : providerConfigMap.values()) {if (config.isDefault() != null && config.isDefault()) {providerConfigs.add(config);}}if (!providerConfigs.isEmpty()) {setProviders(providerConfigs);}} else {ProviderConfig providerConfig = null;for (ProviderConfig config : providerConfigMap.values()) {if (config.isDefault() == null || config.isDefault()) {if (providerConfig != null) {throw new IllegalStateException(...);}providerConfig = config;}}if (providerConfig != null) {setProvider(providerConfig);}}}}if (getApplication() == null && (getProvider() == null || getProvider().getApplication() == null)) {Map<String, ApplicationConfig> applicationConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ApplicationConfig.class, false, false);if (applicationConfigMap != null && applicationConfigMap.size() > 0) {ApplicationConfig applicationConfig = null;for (ApplicationConfig config : applicationConfigMap.values()) {if (applicationConfig != null) {throw new IllegalStateException(...);}applicationConfig = config;}if (applicationConfig != null) {setApplication(applicationConfig);}}}if (getModule() == null && (getProvider() == null || getProvider().getModule() == null)) {Map<String, ModuleConfig> moduleConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ModuleConfig.class, false, false);if (moduleConfigMap != null && moduleConfigMap.size() > 0) {ModuleConfig moduleConfig = null;for (ModuleConfig config : moduleConfigMap.values()) {if (config.isDefault() == null || config.isDefault()) {if (moduleConfig != null) {throw new IllegalStateException(...);}moduleConfig = config;}}if (moduleConfig != null) {setModule(moduleConfig);}}}// registryIds代码能看到,但是没找到在哪里能配置if (StringUtils.isEmpty(getRegistryIds())) {if (getApplication() != null && StringUtils.isNotEmpty(getApplication().getRegistryIds())) {setRegistryIds(getApplication().getRegistryIds());}if (getProvider() != null && StringUtils.isNotEmpty(getProvider().getRegistryIds())) {setRegistryIds(getProvider().getRegistryIds());}}if ((CollectionUtils.isEmpty(getRegistries())) && (getProvider() == null || CollectionUtils.isEmpty(getProvider().getRegistries())) && (getApplication() == null || CollectionUtils.isEmpty(getApplication().getRegistries()))) {Map<String, RegistryConfig> registryConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, RegistryConfig.class, false, false);if (CollectionUtils.isNotEmptyMap(registryConfigMap)) {List<RegistryConfig> registryConfigs = new ArrayList<>();if (StringUtils.isNotEmpty(registryIds)) {Arrays.stream(COMMA_SPLIT_PATTERN.split(registryIds)).forEach(id -> {if (registryConfigMap.containsKey(id)) {registryConfigs.add(registryConfigMap.get(id));}});}if (registryConfigs.isEmpty()) {for (RegistryConfig config : registryConfigMap.values()) {if (StringUtils.isEmpty(registryIds) && (config.isDefault() == null || config.isDefault().booleanValue())) {registryConfigs.add(config);}}}if (!registryConfigs.isEmpty()) {super.setRegistries(registryConfigs);}}}if (getMetadataReportConfig() == null) {Map<String, MetadataReportConfig> metadataReportConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, MetadataReportConfig.class, false, false);if (metadataReportConfigMap != null && metadataReportConfigMap.size() == 1) {super.setMetadataReportConfig(metadataReportConfigMap.values().iterator().next());} else if (metadataReportConfigMap != null && metadataReportConfigMap.size() > 1) {throw new IllegalStateException("Multiple MetadataReport configs: " + metadataReportConfigMap);}}if (getConfigCenter() == null) {Map<String, ConfigCenterConfig> configenterMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ConfigCenterConfig.class, false, false);if (configenterMap != null && configenterMap.size() == 1) {super.setConfigCenter(configenterMap.values().iterator().next());} else if (configenterMap != null && configenterMap.size() > 1) {throw new IllegalStateException("Multiple ConfigCenter found:" + configenterMap);}}if (getMonitor() == null&& (getProvider() == null || getProvider().getMonitor() == null)&& (getApplication() == null || getApplication().getMonitor() == null)) {Map<String, MonitorConfig> monitorConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, MonitorConfig.class, false, false);if (monitorConfigMap != null && monitorConfigMap.size() > 0) {MonitorConfig monitorConfig = null;for (MonitorConfig config : monitorConfigMap.values()) {if (config.isDefault() == null || config.isDefault()) {if (monitorConfig != null) {throw new IllegalStateException("Duplicate monitor configs: " + monitorConfig + " and " + config);}monitorConfig = config;}}if (monitorConfig != null) {setMonitor(monitorConfig);}}}if (getMetrics() == null) {Map<String, MetricsConfig> metricsConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, MetricsConfig.class, false, false);if (metricsConfigMap != null && metricsConfigMap.size() > 0) {MetricsConfig metricsConfig = null;for (MetricsConfig config : metricsConfigMap.values()) {if (metricsConfig != null) {throw new IllegalStateException("Duplicate metrics configs: " + metricsConfig + " and " + config);}metricsConfig = config;}if (metricsConfig != null) {setMetrics(metricsConfig);}}}// protocolIds也没看到在哪里配置if (StringUtils.isEmpty(getProtocolIds())) {if (getProvider() != null && StringUtils.isNotEmpty(getProvider().getProtocolIds())) {setProtocolIds(getProvider().getProtocolIds());}}if (CollectionUtils.isEmpty(getProtocols())&& (getProvider() == null || CollectionUtils.isEmpty(getProvider().getProtocols()))) {Map<String, ProtocolConfig> protocolConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ProtocolConfig.class, false, false);if (protocolConfigMap != null && protocolConfigMap.size() > 0) {List<ProtocolConfig> protocolConfigs = new ArrayList<ProtocolConfig>();if (StringUtils.isNotEmpty(getProtocolIds())) {Arrays.stream(COMMA_SPLIT_PATTERN.split(getProtocolIds())).forEach(id -> {if (protocolConfigMap.containsKey(id)) {protocolConfigs.add(protocolConfigMap.get(id));}});}if (protocolConfigs.isEmpty()) {for (ProtocolConfig config : protocolConfigMap.values()) {if (StringUtils.isEmpty(protocolIds)) {protocolConfigs.add(config);}}}if (!protocolConfigs.isEmpty()) {super.setProtocols(protocolConfigs);}}}if (StringUtils.isEmpty(getPath())) {if (StringUtils.isNotEmpty(beanName)&& StringUtils.isNotEmpty(getInterface())&& beanName.startsWith(getInterface())) {setPath(beanName);}}//没有监听事件才做暴露服务if (!supportedApplicationListener) {export();}}//服务暴露的核心方法@Overridepublic void export() {super.export();// Publish ServiceBeanExportedEventpublishExportEvent();}private void publishExportEvent() {ServiceBeanExportedEvent exportEvent = new ServiceBeanExportedEvent(this);applicationEventPublisher.publishEvent(exportEvent);}@Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {this.applicationEventPublisher = applicationEventPublisher;}}
推荐阅读
- 四 SpringBoot - 整合Mybatis,逆向工程,JPA
- 华为手环6怎么样_华为手环6功能详解
- logback.xml详解
- iptables使用详解
- 一篇文章带你掌握主流办公框架——SpringBoot
- RAID5 IO处理之条带读代码详解
- RAID5 IO处理之写请求代码详解
- RAID5 IO处理之重构代码详解
- RAID5 IO处理之replace代码详解
- Spring的同一个服务为什么会加载多次?