`

java agent实现dubbo灰度发布DEMO

    博客分类:
  • java
 
阅读更多

核心代码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;

    }
}

 

分享到:
评论

相关推荐

    dubbo的简单小demo

    在本Demo中,SpringBoot用于搭建微服务的基础框架,它能与Dubbo无缝结合,实现服务的启动和管理。 【Dubbo-api模块】 在项目中,dubbo-api模块通常包含服务接口定义。这里的服务接口定义了对外提供的服务,如业务...

    dubbo+cloud全链路灰度设计

    dubbo+cloud全链路灰度设计是指在云原生平台下,使用dubbo和cloud技术实现全链路灰度发布的解决方案。该方案旨在解决微服务架构中服务之间的依赖关系错综复杂的问题,通过引流一小部分流量到新版本,可以及时发现...

    DubboRouterDemo:dubbo重写loadbalance实现灰度发布demo

    DubboRouterDemodubbo重写loadbalance实现灰度发布demo项目背景由于项目中使用的是dubbo,2B多租户系统的业务中,客户需要分多版本的需求,以及dubbo服务部署需要灰度的小白鼠,在此背景下故需要dubbo服务的灰度发布...

    Dubbo入门实例Demo

    【Dubbo入门实例Demo】是针对初学者设计的一个实践教程,旨在帮助新手快速理解并掌握Apache Dubbo这一高性能、轻量级的Java RPC框架。在学习过程中,新手往往会在配置、依赖、通信等方面遇到诸多问题,这个Demo就是...

    java-springmvc-dubbo集成demo

    在本项目"java-springmvc-dubbo集成demo"中,主要展示了如何将Spring MVC与阿里巴巴的Dubbo框架进行集成,创建一个完整的微服务架构。这个资源包含三个关键部分:api服务接口定义工程、provider服务提供者工程以及...

    dubbo 简单测试DEMO

    【Dubbo简单测试DEMO详解】 Dubbo,作为阿里巴巴开源的一款高性能、轻量级的Java服务治理框架,它提供了一套完整的服务调用、监控、注册与发现的解决方案。本DEMO旨在帮助初学者快速理解并掌握Dubbo的核心概念和...

    dubbo注解模式demo

    【标题】"dubbo注解模式demo"是一个基于SpringBoot框架,结合Zookeeper注册中心,利用Dubbo的注解方式实现服务消费和服务提供者样例项目。在这个项目中,我们将深入探讨Dubbo的注解模式如何与SpringBoot整合,以及它...

    简单的springboot实现dubbo的demo

    使用springboot2.0.0版本加dubbo-spring-boot-starter实现的demo, https://github.com/alibaba/dubbo-spring-boot-starter

    dubbo-demo

    1. **服务提供者(Provider)**:在"demo"中,"dubbo-service"可能是服务提供者的实现,它包含了业务逻辑并对外暴露服务。服务提供者通过配置服务接口、实现类以及元数据,将服务注册到注册中心,使得其他服务能够...

    灰度系统(基于dubbo、spring扩展实现的接入层灰度、服务层灰度、mq灰度、外部调用灰度,支持多套灰度环境).zip

    在接入层,可以利用springboot的AOP(面向切面编程)特性,结合条件注解来实现灰度路由,对不同用户群体或请求特征执行不同的服务逻辑,从而达到灰度目的。 3. **MQ灰度** 在分布式系统中,消息队列如RabbitMQ、...

    Dubbo-Demo

    【标题】"Dubbo-Demo"是一个基于Dubbo框架的示例项目,旨在为初学者展示如何使用Dubbo构建分布式服务。Dubbo是中国阿里巴巴开源的一款高性能、轻量级的Java RPC框架,它提供了服务治理、负载均衡、容错机制等功能,...

    dubbo的简单demo源码

    【标题】:Dubbo的简单demo源码解析 在分布式服务框架领域,Apache Dubbo是一个广泛应用的开源项目,它提供高性能、轻量级的服务治理方案。这个“dubbo的简单demo源码”是为了帮助初学者理解和实践Dubbo的核心概念...

    dubbo入门的demo

    本Demo旨在帮助初学者理解并掌握Dubbo的基本使用方法,通过结合Zookeeper作为注册中心以及Spring进行依赖注入,实现服务提供者(Provider)和服务消费者(Consumer)的整合。 【描述】"dubbo+zookeeper+spring整合...

    dubbo+zookeeper demo

    总结,通过以上步骤,我们成功地在SpringBoot项目中整合了Dubbo和Zookeeper,利用XML配置方式实现了服务的发布与消费。这只是一个基础的示例,实际使用中,还需要根据具体业务需求进行更复杂的配置和优化。希望这个...

    java1.8 最新dubbo-admin.war

    《Java 1.8与Dubbo Admin:深入理解与应用》 在当今的软件开发领域,Java 1.8作为一款强大的...在实际开发过程中,应熟练掌握Java 1.8的新特性,并充分利用Dubbo Admin的各项功能,以实现高效、可靠的分布式服务架构。

    dubbo-demo + spring+mybaties+mvc

    dubbo框架搭建demo,服务提供方采用spring+Ibatis,服务的消费方主要采用的是MVC,只做一个控制反转,不做任何业务逻辑处理,服务的消费方使用java自动获取zk上单服务,不需要些配置文件

    Dubbo demo

    Dubbo是一个高性能、轻量级的开源Java RPC框架,它提供了服务治理、集群容错、负载均衡等功能,是阿里巴巴贡献给社区的重要分布式服务框架。 【描述】"Dubbo开发demo"是为了简化初学者的学习曲线,让他们能够快速...

    spring dubbo demo

    Spring Dubbo Demo是一个基于Spring和Dubbo框架的简单示例项目,主要用于展示如何在IntelliJ IDEA(简称Idea)开发环境中实现生产者-消费者模式。在这个项目中,我们将探讨Dubbo的核心概念、Spring整合Dubbo的方式...

Global site tag (gtag.js) - Google Analytics