dubbo是一个高扩展性的框架,用户可以添加自己的需求。dubbo根据配置动态生成适配类代码,这样就需要在运行的时候去编译加载这个适配类的代码。
以下我们来研究一下dubbo的动态编译
类图:
接口定义:
@SPI("javassist")
public interface Compiler {
/**
* Compile java source code.
*
* @param code Java source code
* @param classLoader TODO
* @return Compiled class
*/
Class<?> compile(String code, ClassLoader classLoader);
}
SPI注解表示如果没有配置,dubbo默认选用javassist编译源代码
code:Java源代码
classLoader:类加载器用来加载编译后的字节码(好像没有使用),在抽象类AbstractCompiler中的compile方法中使用ClassHelper.getCallerClassLoader(getClass())来加载类。
AdaptiveCompiler类是Compiler的适配类,利用SPI机制来查找真正的实现类。
public Class<?> compile(String code, ClassLoader classLoader) {
Compiler compiler;
ExtensionLoader<Compiler> loader = ExtensionLoader.getExtensionLoader(Compiler.class);
String name = DEFAULT_COMPILER; // copy reference
if (name != null && name.length() > 0) {
compiler = loader.getExtension(name);
} else {
compiler = loader.getDefaultExtension();
}
return compiler.compile(code, classLoader);//调用AbstractCompiler中的方法
}
AbstractCompiler:在公用逻辑中,利用正则表达式匹配出源代码中的包名和类名:
PACKAGE_PATTERN = Pattern.compile("package\\s+([$_a-zA-Z][$_a-zA-Z0-9\\.]*);");
CLASS_PATTERN = Pattern.compile("class\\s+([$_a-zA-Z][$_a-zA-Z0-9]*)\\s+");
然后在JVM中查找看看是否存在:Class.forName(className, true, ClassHelper.getCallerClassLoader(getClass()));存在返回,不存在就使用JavassistCompiler或者是JdkCompiler来执行编译。
public Class<?> compile(String code, ClassLoader classLoader) {
code = code.trim();
Matcher matcher = PACKAGE_PATTERN.matcher(code);//包名
String pkg;
if (matcher.find()) {
pkg = matcher.group(1);
} else {
pkg = "";
}
matcher = CLASS_PATTERN.matcher(code);//类名
String cls;
if (matcher.find()) {
cls = matcher.group(1);
} else {
throw new IllegalArgumentException("No such class name in " + code);
}
String className = pkg != null && pkg.length() > 0 ? pkg + "." + cls : cls;
try {
return Class.forName(className, true, ClassHelper.getCallerClassLoader(getClass()));//根据类全路径来查找类
} catch (ClassNotFoundException e) {
if (! code.endsWith("}")) {
throw new IllegalStateException("The java code not endsWith \"}\", code: \n" + code + "\n");
}
try {
return doCompile(className, code);//调用实现类JavassistCompiler或JdkCompiler的doCompile方法来动态编译类
} catch (RuntimeException t) {
throw t;
} catch (Throwable t) {
throw new IllegalStateException("Failed to compile class, cause: " + t.getMessage() + ", class: " + className + ", code: \n" + code + "\n, stack: " + ClassUtils.toString(t));
}
}
}
JavassistCompiler和JdkCompiler真正的实现类:就是利用Javassit和Jdk提供的相关api或者扩展接口实现的。
- 大小: 23.9 KB
分享到:
相关推荐
dubbo-admin安装要点: 1.清空tomcat/webapps/ROOT目录 2.将包解压到tomcat/webapps/ROOT下 3.修改tomcat/webapps/ROOT/WEB-INF/dubbo.properties 文件 dubbo.registry.address dubbo接口服务注册地址: 单机...
【Dubbo-Admin JDK8 编译详解】 Dubbo-Admin 是阿里巴巴开源的分布式服务治理平台,它提供了服务注册、服务发现、服务监控等能力,是Dubbo框架的重要组成部分。在JDK8环境下编译Dubbo-Admin,可以确保与Java 8的...
dubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo...
编译成功后,可以通过`mvn jetty:run`启动dubbo-admin服务。 4. **配置与使用**:dubbo-admin需要与Zookeeper或Nacos等服务注册中心集成,因此你需要在配置文件中设置相关的服务发现地址。此外,还需要配置dubbo-...
5. **配置中心**:Dubbo-admin 可以连接到配置中心(如 ZooKeeper 或 Apollo),从中获取或更新服务的配置信息,实现动态配置。 6. **监控中心**:通过 Dubbo-admin,用户可以实时监控服务的运行状态,如调用次数、...
【标题】"incubator-dubbo-dubbo-2.5.8" 是一个基于Java的开源服务框架,由Apache孵化器项目提供。这个版本是Dubbo的2.5.8稳定版,它包含了Dubbo的核心服务治理功能以及一个专门的管理平台——dubbo-admin。 【描述...
本篇将详细讲解基于dubbo-demo-consumer、dubbo-demo-provider和dubbo-simple-monitor的实例服务,带你深入理解Dubbo的核心概念和操作流程。 首先,我们来看`dubbo-demo-consumer`,它是Dubbo服务的消费者。消费者...
《Apache Incubator Dubbo-OPS Master:深度解析与实践》 Apache Incubator Dubbo-OPS Master 是一套由Dubbo社区开发的管理工具,旨在为Dubbo服务提供全面的运营管理和监控支持。Dubbo,作为一款高性能、轻量级的...
【标题】"dubbo-admin包"是Dubbo框架的一个重要组成部分,主要用作服务治理的管理界面。这个压缩包包含了运行Dubbo管理控制台所需的所有文件,使得开发者和运维人员可以方便地监控、管理和配置Dubbo服务。 【描述】...
dobbo源码dubbo-dubbo-2.7.3.rardobbo源码dubbo-dubbo-2.7.3.rardobbo源码dubbo-dubbo-2.7.3.rardobbo源码dubbo-dubbo-2.7.3.rardobbo源码dubbo-dubbo-2.7.3.rardobbo源码dubbo-dubbo-2.7.3.rardobbo源码dubbo-dubbo...
【标题】"incubator-dubbo-dubbo-2.6.1" 是一个Apache Incubator项目Dubbo的特定版本,这里的2.6.1表示该版本是Dubbo的稳定分支之一。 【描述】提到的"incubator-dubbo-dubbo-2.6.1"表明这是Apache孵化器中的Dubbo...
其中,`dubbo-admin`是Dubbo的核心组件之一,它提供了一个可视化的管理控制台,帮助开发者对服务进行管理和监控。本文将详细解析`dubbo-admin-2.5.4.war`这个版本的后台管理工具,探讨其主要特性和使用方法。 首先...
jmeter的dubbo插件,jmeter-plugins-dubbo-2.7.8-jar-with-dependencies.jar,适用于JMeter5.4.1版本,将解压后的文件jmeter-plugins-dubbo-2.7.8-jar-with-dependencies放在Jmeter安装目录下的\lib\ext文件夹中,...
《Dubbo监控工具详解——基于dubbo-monitor-simple-2.5.8》 在分布式系统开发中,监控是至关重要的一个环节,它可以帮助开发者实时了解服务的运行状态,及时发现并解决问题。Apache Dubbo,作为一款高性能、轻量级...
dubbo-admin打包后的文件,扔到tomcat里就能跑起来!dubbo-admin打包后的文件,扔到tomcat里就能跑起来!dubbo-admin打包后的文件,扔到tomcat里就能跑起来!
dubbo-2.5.6的源代码,在incubator-dubbo-master\dubbo-config\dubbo-config-spring\src\main\resources\META-INF目录下包含dubbo.xsd,也可以参看博客自己编译dubbo-admin.war
这个特定的版本,"dubbo-admin.war",是根据GitHub上的Dubbo源代码编译并打包而成的,确保了其与最新的开发成果同步,并且已经过实际测试,证明是可用的。 【描述】"dubbo-admin包",即dubbo-admin.war文件,它是一...
本文将深入探讨“jmeter-plugins-dubbo-2.7.1-jar-with-dependencies”这一系统压测工具包,它专门针对基于Java的Dubbo服务进行性能测试。了解并熟练掌握这一工具,能帮助我们更好地优化服务性能,提升系统的稳定性...
dubbo官方自带了dubbo-admin及dubbo-simple/dubbo-monitor-simple二个子项目用于服务治理及服务监控。 dubbo-monitor-simple是Alibaba的开源项目,用于监控在dubbo框架下接口暴露,注册情况,也可以看接口的调用...