核心代码DEMO,仅供参考:
package com.zcm.transform.premain; import javassist.*; import java.io.File; import java.io.IOException; import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.IllegalClassFormatException; import java.lang.instrument.Instrumentation; import java.net.URISyntaxException; import java.net.URL; import java.security.ProtectionDomain; import java.util.*; import java.util.jar.JarFile; /** * 检测方法的执行时间 * * @author 周cm * @myblog xx * @create 2018年4月21日 */ public class DubboTransformer extends BaseTransformer implements ClassFileTransformer { final static String prefix = "\nlong startTime = System.currentTimeMillis();\n"; final static String postfix = "\nlong endTime = System.currentTimeMillis();\n"; // 被处理的方法列表 final static Map<String, List<String>> methodMap = new HashMap<String, List<String>>(); static boolean hasIn = false; ClassLoader dubboTransformClassLoader; String agentOps; Instrumentation inst; public DubboTransformer() { add("com.zcm.service.impl.IDogImpl",ROUTER); add("com.alibaba.dubbo.config.ReferenceConfig", ROUTER); add("com.alibaba.dubbo.config.ApplicationConfig", ROUTER); //add("com.alibaba.dubbo.config.ConsumerConfig", ROUTER); add("com.alibaba.dubbo.config.ServiceConfig", DYNAMIC_GROUP); dubboTransformClassLoader = DubboTransformer.class.getClassLoader(); } public DubboTransformer(String agentOps, Instrumentation inst){ this(); this.agentOps = agentOps; this.inst = inst; try { String filePath = "C:\\Users\\ody\\workspace\\jim-framework-master\\full-link-log\\web\\target\\web-1.2-SNAPSHOT\\WEB-INF\\lib\\dubbo-2.6.0.jar"; String filePath1 = "C:\\Users\\ody\\workspace\\jim-framework-master\\full-link-log\\web\\target\\web-1.2-SNAPSHOT\\WEB-INF\\lib\\javassist-3.20.0-GA.jar"; JarFile jarFile = new JarFile(filePath); //inst.appendToBootstrapClassLoaderSearch(jarFile); //inst.appendToSystemClassLoaderSearch(jarFile); //inst.appendToSystemClassLoaderSearch(new JarFile(filePath1)); //SimpleLoadAJar.addJar(filePath); //SimpleLoadAJar.addJar(filePath1); } catch (IOException e) { e.printStackTrace(); }catch (Exception e){ e.printStackTrace(); } } private void add(String clazzString,String method) { methodMap.put(clazzString, Arrays.asList(method)); } public static final String DYNAMIC_GROUP = "dynamicGroup"; public static final String ROUTER = "router"; @Override public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { className = className.replace("/", "."); if (methodMap.containsKey(className)) {// 判断加载的class的包路径是不是需要监控的类 CtClass ctclass = null; ensureAdditionalJar( loader); try { ctclass = ClassPool.getDefault().get(className);// 使用全称,用于取得字节码类<使用javassist> List<String> methods = methodMap.get(className); if (methods != null){ for (String method : methods){ addAdditionMethod(ctclass,method,method); } } return ctclass.toBytecode(); } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } } return null; } private void ensureAdditionalJar( ClassLoader classLoader) { if ( !hasIn ){ hasIn = true; }else { return ; } if (classLoader == dubboTransformClassLoader){ return; } for (String className : Arrays.asList("com/alibaba/dubbo/config/ApplicationConfig.class","javassist/ClassPool.class")){ URL url = classLoader.getResource(className); if ( url == null){ System.err.println(" can not found dubbo.jar in " + classLoader); continue; } System.out.println(url); inst.appendToSystemClassLoaderSearch(convertUrl2jarFile(url)); } } private JarFile convertUrl2jarFile(URL url) { String filePath = url.getPath(); try { int index = filePath.indexOf("!"); if (index > -1){ filePath = filePath.substring(5,index); return new JarFile(filePath); } File file = new File( url.toURI()); System.out.println(".."); } catch (URISyntaxException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } private CtClass addAdditionMethod(CtClass ctClass , String methodKey , String systemPropertyKey){ String methodName = "get" + methodKey.substring(0,1).toUpperCase() + methodKey.substring(1); CtMethod method = null; try { CtMethod ctmethod = ctClass.getDeclaredMethod(methodName); if (ctmethod != null){ System.err.println(ctClass + " has got " + method); return ctClass ; } }catch (Exception e){ // no method } try { method = new CtMethod(ClassPool.getDefault().get("java.lang.String"), methodName, new CtClass[]{}, ctClass); method.setModifiers(Modifier.PUBLIC); String methodContent = "{return System.getProperty(\"" + systemPropertyKey + "\");}"; //methodContent = "{return System.getProperty(\"hah\");}"; method.setBody(methodContent); ctClass.addMethod(method); }catch (Exception e){ System.err.println(" agent dynamic add method error"); e.printStackTrace(); } return ctClass; } }
相关推荐
在本Demo中,SpringBoot用于搭建微服务的基础框架,它能与Dubbo无缝结合,实现服务的启动和管理。 【Dubbo-api模块】 在项目中,dubbo-api模块通常包含服务接口定义。这里的服务接口定义了对外提供的服务,如业务...
dubbo+cloud全链路灰度设计是指在云原生平台下,使用dubbo和cloud技术实现全链路灰度发布的解决方案。该方案旨在解决微服务架构中服务之间的依赖关系错综复杂的问题,通过引流一小部分流量到新版本,可以及时发现...
DubboRouterDemodubbo重写loadbalance实现灰度发布demo项目背景由于项目中使用的是dubbo,2B多租户系统的业务中,客户需要分多版本的需求,以及dubbo服务部署需要灰度的小白鼠,在此背景下故需要dubbo服务的灰度发布...
【Dubbo入门实例Demo】是针对初学者设计的一个实践教程,旨在帮助新手快速理解并掌握Apache Dubbo这一高性能、轻量级的Java RPC框架。在学习过程中,新手往往会在配置、依赖、通信等方面遇到诸多问题,这个Demo就是...
在本项目"java-springmvc-dubbo集成demo"中,主要展示了如何将Spring MVC与阿里巴巴的Dubbo框架进行集成,创建一个完整的微服务架构。这个资源包含三个关键部分:api服务接口定义工程、provider服务提供者工程以及...
【Dubbo简单测试DEMO详解】 Dubbo,作为阿里巴巴开源的一款高性能、轻量级的Java服务治理框架,它提供了一套完整的服务调用、监控、注册与发现的解决方案。本DEMO旨在帮助初学者快速理解并掌握Dubbo的核心概念和...
【标题】"dubbo注解模式demo"是一个基于SpringBoot框架,结合Zookeeper注册中心,利用Dubbo的注解方式实现服务消费和服务提供者样例项目。在这个项目中,我们将深入探讨Dubbo的注解模式如何与SpringBoot整合,以及它...
使用springboot2.0.0版本加dubbo-spring-boot-starter实现的demo, https://github.com/alibaba/dubbo-spring-boot-starter
1. **服务提供者(Provider)**:在"demo"中,"dubbo-service"可能是服务提供者的实现,它包含了业务逻辑并对外暴露服务。服务提供者通过配置服务接口、实现类以及元数据,将服务注册到注册中心,使得其他服务能够...
在接入层,可以利用springboot的AOP(面向切面编程)特性,结合条件注解来实现灰度路由,对不同用户群体或请求特征执行不同的服务逻辑,从而达到灰度目的。 3. **MQ灰度** 在分布式系统中,消息队列如RabbitMQ、...
【标题】"Dubbo-Demo"是一个基于Dubbo框架的示例项目,旨在为初学者展示如何使用Dubbo构建分布式服务。Dubbo是中国阿里巴巴开源的一款高性能、轻量级的Java RPC框架,它提供了服务治理、负载均衡、容错机制等功能,...
【标题】:Dubbo的简单demo源码解析 在分布式服务框架领域,Apache Dubbo是一个广泛应用的开源项目,它提供高性能、轻量级的服务治理方案。这个“dubbo的简单demo源码”是为了帮助初学者理解和实践Dubbo的核心概念...
本Demo旨在帮助初学者理解并掌握Dubbo的基本使用方法,通过结合Zookeeper作为注册中心以及Spring进行依赖注入,实现服务提供者(Provider)和服务消费者(Consumer)的整合。 【描述】"dubbo+zookeeper+spring整合...
总结,通过以上步骤,我们成功地在SpringBoot项目中整合了Dubbo和Zookeeper,利用XML配置方式实现了服务的发布与消费。这只是一个基础的示例,实际使用中,还需要根据具体业务需求进行更复杂的配置和优化。希望这个...
《Java 1.8与Dubbo Admin:深入理解与应用》 在当今的软件开发领域,Java 1.8作为一款强大的...在实际开发过程中,应熟练掌握Java 1.8的新特性,并充分利用Dubbo Admin的各项功能,以实现高效、可靠的分布式服务架构。
dubbo框架搭建demo,服务提供方采用spring+Ibatis,服务的消费方主要采用的是MVC,只做一个控制反转,不做任何业务逻辑处理,服务的消费方使用java自动获取zk上单服务,不需要些配置文件
Dubbo是一个高性能、轻量级的开源Java RPC框架,它提供了服务治理、集群容错、负载均衡等功能,是阿里巴巴贡献给社区的重要分布式服务框架。 【描述】"Dubbo开发demo"是为了简化初学者的学习曲线,让他们能够快速...
Spring Dubbo Demo是一个基于Spring和Dubbo框架的简单示例项目,主要用于展示如何在IntelliJ IDEA(简称Idea)开发环境中实现生产者-消费者模式。在这个项目中,我们将探讨Dubbo的核心概念、Spring整合Dubbo的方式...