我们运行的Java代码,一般都是编译之后的字节码。Dubbo为了实现基于spi思想的扩展特性,特别是能够灵活添加额外功能,对于扩展或者说是策略的选择这个叫做控制类也好设配类也好的类要能够动态生成。当然对应已知需求如Protocol, ProxyFactory他们的策略选择的设配类代码dubbo直接提供也无妨,但是dubbo作为一个高扩展性的框架,使得用户能够添加自己的需求,根据配置动态生成自己的设配类代码,这样就需要在运行的时候去编译加载这个设配类的代码。下面我们就是来了解下Dubbo的动态编译。
编译接口定义:
@SPI("javassist")
public interface Compiler {
Class<?> compile(String code, ClassLoaderclassLoader);
}
SPI注解表示如果没有配置,dubbo默认选用javassist编译源代码接口方法compile第一个入参code,就是java的源代码接口方法compile第二个入参classLoader,按理是类加载器用来加载编译后的字节码,其实没用到,都是根据当前线程或者调用方的classLoader加载的
@Adaptive
public class AdaptiveCompiler implements Compiler {
private static volatile String DEFAULT_COMPILER;
publicClass<?> compile(String code, ClassLoader classLoader) {
Compiler compiler;
ExtensionLoader<Compiler> loader= ExtensionLoader.getExtensionLoader(Compiler.class);
String name = DEFAULT_COMPILER;// copyreference
if (name !=null && name.length() > 0) {
compiler =loader.getExtension(name);
} else {
compiler =loader.getDefaultExtension();
}
returncompiler.compile(code, classLoader);
}
}
AdaptiveCompiler是Compiler的设配类, 它有类注解@Adaptive表示这个Compile r的设配类不是动态编译生成的。AdaptiveCompiler作用就是策略的选择,根据条件选择何种编译策略来编译动态生成的源代码。
AbstractCompiler为编译的抽象类,抽象出公用逻辑,这里它主要是利用正则匹配出源代码中的包名和类名后先在jvm中Class.forName看下是否存在,如果存在反回,不存在在执行编译与加载。
关于JavassistCompiler和JdkCompiler执行doCompile的过程都是利用Javassit和Jdk提供的相关api或者扩展接口实现的。
相关推荐
dubbo 基于dubbox 2.8.4 编译
dubbo编译好的war包,可以直接使用,放置于容器目录下即可~
【Dubbo-Admin JDK8 编译详解】 Dubbo-Admin 是阿里巴巴开源的分布式服务治理平台,它提供了服务注册、服务发现、服务监控等能力,是Dubbo框架的重要组成部分。在JDK8环境下编译Dubbo-Admin,可以确保与Java 8的...
dubbox编译、环境搭建、服务提供和服务消费 1 1 Dubbo源码构建 1 1.1 资源准备 1 1.2 配置maven设置 1 1.3 在eclipse中构件 3 2 搭dubbo-admin、dubbo-monitor控制台 16 2.1 配置zookeeper 16 2.2 配置dubbo-admin和...
本资源为GitHub下载dubbo 资源后打包的dubbo-admin的war包,本地环境默认安装zookeeper后可放到tomcat下直接运行。
【Dubbo 2.6.1 编译版】是一个重要的开源项目,它是中国阿里巴巴公司贡献的高性能、轻量级的Java服务治理框架。这个版本是2.6.2的编译版本,意味着它包含了从2.6.1到2.6.2的所有更新和改进。对于开发者来说,尤其是...
在dubbo服务运行过程中,上传正确的java代码文件,自动编译生成class并注册到dubbo zk 中,可以正常dubbo invoke来调用。整个过程服务不用重启。我写了个框架并命名为D-Unit。
首先,`dubbo-2.9.0.jar`是编译后的二进制jar包,包含了Dubbo的核心组件和服务接口。这个jar包可以在运行环境中直接使用,供应用调用和部署。它包含了服务提供者(Provider)、服务消费者(Consumer)、注册中心...
3. **配置Maven**:在编译前,可能需要根据个人的开发环境和需求修改Maven的`settings.xml`文件,如设置阿里云的Maven镜像仓库,以提高下载速度。 4. **构建项目**:在源码目录下,执行Maven的`install`命令,将...
本文将深入探讨如何基于Groovy实现Java脚本的动态编译、部署和发布,并且介绍如何通过Groovy脚本直接调用Dubbo接口,从而提高开发效率和灵活性。 Groovy是一种基于Java平台的强大的动态编程语言,它具有简洁的语法...
dubbo 最新2.8.4 打包编译的jar包,,如maven中 需要引入时,可直接拿去使用。不然就得自己构建 阿里的 2.8.4 版本。
dubbo-admin.war运行dubbo监控,dubbo2.8.4丢到本地仓库引用即可,怎么区分Dubbo和Dubbox?provider里只有dubbo协议就是dubbo,包含rest协议,同时service接口直接可以浏览器等rest访问就是dubbox,不再需要...
你现在难道还是学完了dubbo没有登陆过dubbo后台嘛?难道还是不知道如何从官网下载源码包进行编译嘛。这里有现成的。come on baby
**Dubbo-admin 2.5.3 源码编译及阿里巴巴 Dubbo 依赖库与 OpenSesame 类库详解** 在深入探讨 `dubbo-admin 2.5.3` 的源码编译以及 `alibaba-dubbo-dependency` 和 `opensesame` 类库之前,我们首先需要了解这三个...
dubbo-admin-2.5.8 jdk 8 2017年12月18日编译,linux实测可用
例如,`dubbo-monitor`模块实现了服务监控,`dubbo-config`模块则负责服务的动态配置。`dubbo-admin`项目是Dubbo的服务管理工具,通过编译`dubbo-admin.war`并部署到Tomcat 9,可以图形化管理Dubbo服务。 在使用...
dubbo-2.5.6的源代码,在incubator-dubbo-master\dubbo-config\dubbo-config-spring\src\main\resources\META-INF目录下包含dubbo.xsd,也可以参看博客自己编译dubbo-admin.war
3. **版本不兼容**:如果你的Dubbo版本与使用的`dubbo.xsd`版本不匹配,可能会导致解析错误。确认项目的Dubbo依赖版本与`dubbo.xsd`中的元素和属性相匹配。 4. **特殊字符或编码问题**:有时候,XML文件中的特殊...
dubbox2.8.4编译好的war包,可以直接使用,具体使用方法自己参考百度
dubbo-admin管理控制台安装和使用,所需要的 war ,方便初学者学习下载。 此包解决了如下 异常: org.springframework.beans.NotWritablePropertyException: Invalid property 'URIType' of bean class ...