我们运行的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包,可以直接使用,放置于容器目录下即可~
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-Admin JDK8编译 可以直接运行 JDK8+TOMCAT7 欢迎各位老板下载
在dubbo服务运行过程中,上传正确的java代码文件,自动编译生成class并注册到dubbo zk 中,可以正常dubbo invoke来调用。整个过程服务不用重启。我写了个框架并命名为D-Unit。
Dubbo 2.6.2 编译版本,已导入IDEA编译器,需要的可以下下来围观运行其中的demo。
dubbo2.9.0源码jar包及编译jar包:dubbo-2.9.0.jar、dubbo-2.9.0.source.jar。欢迎下载使用。欢迎下载使用。
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
基于阿里巴巴开源rpc框架dubbo2.5.3编译jar包
dubbo-admin-2.5.8 jdk 8 2017年12月18日编译,linux实测可用
dubbo-2.5.6的源代码,在incubator-dubbo-master\dubbo-config\dubbo-config-spring\src\main\resources\META-INF目录下包含dubbo.xsd,也可以参看博客自己编译dubbo-admin.war
dubbo源码编译的dubbo-admin和dubbo-monitor-simple的安装包
dubbox2.8.4编译好的war包,可以直接使用,具体使用方法自己参考百度
dubbo-admin管理控制台安装和使用,所需要的 war ,方便初学者学习下载。 此包解决了如下 异常: org.springframework.beans.NotWritablePropertyException: Invalid property 'URIType' of bean class ...
ant-1.6.2.jar asm-analysis-3.2.jar asm-commons-3.2.jar asm-tree-3.2.jar asm-util-3.2.jar aspectjweaver-1.7.4.jar avalon-framework-4.1.3.jar bsf-api-3.1.jar cache-api-0.4.jar cglib-nodep-2.2.jar ...
dubbo双模块RPC调用,附源码及编译后内容,解压即可用;dubbo.rpc.demo.rar;dubbo双模块RPC调用,附源码及编译后内容,解压即可用;dubbo.rpc.demo.rar;dubbo双模块RPC调用,附源码及编译后内容,解压即可用;...
dubbo的源码,可用于编译dubbo-admin.war文件,配置环境是jdk1.8和tomcat9,亲测通过,相关编译方法在个人博客上。