dubbo 服务暴露 路径问题

疑问

配置dubbo的时候看到了一个非常奇怪的配置:

  
  
  问题1:端口是否重复?
  问题2:jaxrs不在文档中,协议效果是什么?

开始

spring在容器加载完毕后使用监听者模式推送event

// package com.alibaba.dubbo.config.spring;
// 在解析dubbo-spring.xml的时候已经加载到了spring容器
public class ServiceBean extends ServiceConfig implements InitializingBean, DisposableBean, ApplicationContextAware, ApplicationListener,// 会接受到推送消息
 BeanNameAware

public void onApplicationEvent(ApplicationEvent event) {
        if (ContextRefreshedEvent.class.getName().equals(event.getClass().getName()) && this.isDelay() && !this.isExported() && !this.isUnexported()) {
            if (logger.isInfoEnabled()) {
                logger.info("The service ready on spring started. service: " + this.getInterface());
            }
            this.export();  //调用父类的方法,是父类
        }

    }

然后进入:ServiceConfig

// package com.alibaba.dubbo.config;
public class ServiceConfig extends AbstractServiceConfig
 protected synchronized void doExport() {
       // 这是一个受spring-容器管理的bean,在这个方法里,组装了一个service所需要的
       所有属性
       this.doExportUrls();
    }
private void doExportUrls() {
        List registryURLs = this.loadRegistries(true);
        Iterator var2 = this.protocols.iterator();

        while(var2.hasNext()) {
            ProtocolConfig protocolConfig = (ProtocolConfig)var2.next();
            if (!ExportHandlers.getInstance().doExportUrlsFilter(protocolConfig, registryURLs)) {
                this.doExportUrlsFor1Protocol(protocolConfig, registryURLs);
            }
        }
    }

下面是一个非常长的方法:
private void doExportUrlsFor1Protocol(ProtocolConfig protocolConfig, List registryURLs) {
	 String name = protocolConfig.getName();
        if (name == null || name.length() == 0) {
            name = "dubbo";  // 默认是dubbo,但是我们是jaxrs,所以往下走
        }
// 省略获取ref 远程服务源
port = null;
        Integer port;
        if (!"webservice".equals(protocolConfig.getName()) && !"jaxrs".equals(protocolConfig.getName())) {
            port = protocolConfig.getPort();
        } else {  // 当 是jaxrs 或者webservice协议的时候走这里,因为一个服务,要么使用webservice,要么使用jaxrs,两者端口不冲突
            port = WebContainer.getInstance().getPortHTTP();
            if (null == port) {
                String httpPort = TomcatConfigParse.getTomcat6HttpPort("HTTP/1.1", "http"); // 默认8080
                if (null != httpPort && httpPort.length() > 0) {
                    port = Integer.parseInt(httpPort);
                }
            }

            if (null == port) {
                port = protocolConfig.getPort();
            }
        }

		//无关代码
		Exporter exporter = protocol.export(invoker); // exporter代表一个暴露服务接口
       this.exporters.add(exporter);
}


package com.alibaba.dubbo.rpc.protocol.rest;
public class RestProtocol extends AbstractProxyProtocol

protected  Runnable doExport(T impl, Class type, URL url) throws RpcException {
        String addr = url.getIp() + ":" + url.getPort();
        // 省略无关代码

        JAXRSServerFactoryBean serverFactoryBean = new JAXRSServerFactoryBean();
        String prefix = ConfigUtils.getProperty("dubbo.restful.basepath"); // 这个参数在dubbo.properties文件中能够进行配置
        if (StringUtils.isEmpty(prefix)) {
            prefix = "/rest";
        } else if (prefix.length() == 1) {
            prefix = "";
        }
// 省略创建Endpoint
    }

结论

jaxrs 和webservice不冲突
jaxrs 可以使用rest 协议代替,最终都交给rest协议来完成功能

你可能感兴趣的:(java框架,中间件)