首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

dubbo源码分析二:服务发布(2)

dubbo源码分析二:服务发布(2)

3.核心代码解析      a.DubboProtocol      


public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {    URL url = invoker.getUrl();//获取url信息         // export service.    String key = serviceKey(url);//产生与发布的接口映射的key ,格式例如:com.alibaba.dubbo.demo.DemoService:20882    DubboExporter<T> exporter = new DubboExporter<T>(invoker, key, exporterMap);//创建DubboExporter对象    exporterMap.put(key, exporter);//缓存此对象         //export an stub service for dispaching event    Boolean isStubSupportEvent = url.getParameter(Constants.STUB_EVENT_KEY,Constants.DEFAULT_STUB_EVENT);    Boolean isCallbackservice = url.getParameter(Constants.IS_CALLBACK_SERVICE, false);    if (isStubSupportEvent && !isCallbackservice){        String stubServiceMethods = url.getParameter(Constants.STUB_EVENT_METHODS_KEY);        if (stubServiceMethods == null || stubServiceMethods.length() == 0 ){            if (logger.isWarnEnabled()){                logger.warn(new IllegalStateException("consumer [" +url.getParameter(Constants.INTERFACE_KEY) +                        "], has set stubproxy support event ,but no stub methods founded."));            }        } else {            stubServiceMethodsMap.put(url.getServiceKey(), stubServiceMethods);        }    }     openServer(url);//打开服务         return exporter;} private void openServer(URL url) {    // find server.    String key = url.getAddress();    //client 也可以暴露一个只有server可以调用的服务。    boolean isServer = url.getParameter(Constants.IS_SERVER_KEY,true);    if (isServer) {        ExchangeServer server = serverMap.get(key);        if (server == null) {            serverMap.put(key, createServer(url));//创建新的服务        } else {            //server支持reset,配合override功能使用            server.reset(url);        }    }} private ExchangeServer createServer(URL url) {    //默认开启server关闭时发送readonly事件    url = url.addParameterIfAbsent(Constants.CHANNEL_READONLYEVENT_SENT_KEY, Boolean.TRUE.toString());    //默认开启heartbeat    url = url.addParameterIfAbsent(Constants.HEARTBEAT_KEY, String.valueOf(Constants.DEFAULT_HEARTBEAT));    String str = url.getParameter(Constants.SERVER_KEY, Constants.DEFAULT_REMOTING_SERVER);     if (str != null && str.length() > 0 && ! ExtensionLoader.getExtensionLoader(Transporter.class).hasExtension(str))        throw new RpcException("Unsupported server type: " + str + ", url: " + url);     url = url.addParameter(Constants.CODEC_KEY, Version.isCompatibleVersion() ? COMPATIBLE_CODEC_NAME : DubboCodec.NAME);    ExchangeServer server;    try {        server = Exchangers.bind(url, requestHandler);    } catch (RemotingException e) {        throw new RpcException("Fail to start server(url: " + url + ") " + e.getMessage(), e);    }    str = url.getParameter(Constants.CLIENT_KEY);    if (str != null && str.length() > 0) {        Set<String> supportedTypes = ExtensionLoader.getExtensionLoader(Transporter.class).getSupportedExtensions();        if (!supportedTypes.contains(str)) {            throw new RpcException("Unsupported client type: " + str);        }    }    return server;
返回列表