dubbo 源码分析汇总
3.1 Dubbo 内核解剖
dubbo 源码分析 1 之 架构原理探索
dubbo 源码分析 2 之 内核 SPI 实现
dubbo 源码分析 3 之 动态编译
dubbo 源码分析 4 之 与 Spring 集成
dubbo 源码分析 5 之 SPI 分析3.2 Dubbo 服务发布原理解剖
dubbo 源码分析 6 之 服务暴露概述
dubbo 源码分析 7 之 服务本地暴露
dubbo 源码分析 8 之 服务远程暴露 (上)
dubbo 源码分析 9 之 服务远程暴露 (中)
dubbo 源码分析 10 之 服务远程暴露 (下)3.3 Dubbo 服务引用原理解剖
dubbo 源码分析 11 之 服务引用
dubbo 源码分析 12 之 Listener & Filter3.4 Dubbo 集群容错的设计解剖
dubbo 源码分析 13 之 集群容错 Invoke
dubbo 源码分析 14 – 集群容错之 Directory
dubbo 源码分析 15 – 集群容错之 Route
dubbo 源码分析 16 – 集群容错之 LoadBalance
dubbo 源码分析 17 – 集群容错总结3.5 Dubbo 服务治理设计解剖
dubbo 源码分析 18 – 服务监控
dubbo 源码分析 19 – 服务治理3.6 Dubbo 网络通信架构解剖
dubbo 源码分析 20 – 远程调用概述
dubbo 源码分析 21 – 远程通信 netty
dubbo 源码分析 22 – consumer 发送与接收原理
dubbo 源码分析 23 – provider 接收与发送原理
dubbo 源码分析 24 – 调用核心 Invoke3.7 Dubbo 网络通信编解码解剖
public class ConsumerApi {
public static void main(String[] args) {
ReferenceConfig<UserService> reference = new ReferenceConfig<>();
reference.setApplication(new ApplicationConfig("api-consumer"));
reference.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
reference.setInterface(UserService.class);
UserService orderService = reference.get();
String username = orderService.getUsername();
System.out.println("result: " + username);
}
}
public class ReferenceConfig<T> extends AbstractReferenceConfig {
public synchronized T get() {
if (destroyed) {
throw new IllegalStateException("Already destroyed!");
}
if (ref == null) {
init();
}
return ref;
}
}
public class ReferenceConfig<T> extends AbstractReferenceConfig {
...
private T createProxy(Map<String, String> map) {
URL tmpUrl = new URL("temp", "localhost", 0, map);
final boolean isJvmRefer;
if (isInjvm() == null) {
if (url != null && url.length() > 0) { // if a url is specified, don't do local reference
isJvmRefer = false;
} else if (InjvmProtocol.getInjvmProtocol().isInjvmRefer(tmpUrl)) {
// by default, reference local service if there is
isJvmRefer = true;
} else {
isJvmRefer = false;
}
} else {
isJvmRefer = isInjvm().booleanValue();
}
if (isJvmRefer) {
URL url = new URL(Constants.LOCAL_PROTOCOL, NetUtils.LOCALHOST, 0, interfaceClass.getName()).addParameters(map);
invoker = refprotocol.refer(interfaceClass, url);
if (logger.isInfoEnabled()) {
logger.info("Using injvm service " + interfaceClass.getName());
}
} else {
if (url != null && url.length() > 0) { // user specified URL, could be peer-to-peer address, or register center's address.
String[] us = Constants.SEMICOLON_SPLIT_PATTERN.split(url);
if (us != null && us.length > 0) {
for (String u : us) {
URL url = URL.valueOf(u);
if (url.getPath() == null || url.getPath().length() == 0) {
url = url.setPath(interfaceName);
}
if (Constants.REGISTRY_PROTOCOL.equals(url.getProtocol())) {
urls.add(url.addParameterAndEncoded(Constants.REFER_KEY, StringUtils.toQueryString(map)));
} else {
urls.add(ClusterUtils.mergeUrl(url, map));
}
}
}
} else { // assemble URL from register center's configuration
List<URL> us = loadRegistries(false);
if (us != null && !us.isEmpty()) {
for (URL u : us) {
URL monitorUrl = loadMonitor(u);
if (monitorUrl != null) {
map.put(Constants.MONITOR_KEY, URL.encode(monitorUrl.toFullString()));
}
urls.add(u.addParameterAndEncoded(Constants.REFER_KEY, StringUtils.toQueryString(map)));
}
}
if (urls.isEmpty()) {
throw new IllegalStateException("No such any registry to reference " + interfaceName + " on the consumer " + NetUtils.getLocalHost() + " use dubbo version " + Version.getVersion() + ", please config <dubbo:registry address=\"...\" /> to your spring config.");
}
}
if (urls.size() == 1) {
invoker = refprotocol.refer(interfaceClass, urls.get(0));
} else {
List<Invoker<?>> invokers = new ArrayList<Invoker<?>>();
URL registryURL = null;
for (URL url : urls) {
invokers.add(refprotocol.refer(interfaceClass, url));
if (Constants.REGISTRY_PROTOCOL.equals(url.getProtocol())) {
registryURL = url; // use last registry url
}
}
if (registryURL != null) { // registry url is available
// use AvailableCluster only when register's cluster is available
URL u = registryURL.addParameter(Constants.CLUSTER_KEY, AvailableCluster.NAME);
invoker = cluster.join(new StaticDirectory(u, invokers));
} else { // not a registry url
invoker = cluster.join(new StaticDirectory(invokers));
}
}
}
Boolean c = check;
if (c == null && consumer != null) {
c = consumer.isCheck();
}
if (c == null) {
c = true; // default true
}
if (c && !invoker.isAvailable()) {
throw new IllegalStateException("Failed to check the status of the service " + interfaceName + ". No provider available for the service " + (group == null ? "" : group + "/") + interfaceName + (version == null ? "" : ":" + version) + " from the url " + invoker.getUrl() + " to the consumer " + NetUtils.getLocalHost() + " use dubbo version " + Version.getVersion());
}
if (logger.isInfoEnabled()) {
logger.info("Refer dubbo service " + interfaceClass.getName() + " from url " + invoker.getUrl());
}
// create service proxy
return (T) proxyFactory.getProxy(invoker);
}
}