标题:
dubbo源码分析二:服务发布(2)
[打印本页]
作者:
look_w
时间:
2019-1-11 18:24
标题:
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;
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0