精华内容
下载资源
问答
  • 1) 当业务处理代码(JAVA请求代码)需要变更时,新的Jar没法统一更新(部署)各个代理端; 2) 全局的序列化参数(即需要唯一取值的参数)无法进行统一同步,因为不同的代理端运行在不同的JVM之上,代码的...

    Jmeter开源性能测试工具某些功能不如某些商业化工具方便,但免费是其巨大优势,况且某些方便的功能也可以通过我们“自食其力”地实现。本文涉及:数据库中BLOB字段的处理;Jmeter与H2 Database在性能测试中的使用;Jmeter分布式测试。

    1、需求背景

    最近因项目性能测试需要,学习了Jmeter这个开源工具。但发现其某些地方确实不如LoadRunner方便。比如如下两个问题:

    1)        当业务处理代码(JAVA请求代码)需要变更时,新的Jar包没法统一更新(部署)到各个代理端;

    2)        全局的序列化参数(即需要唯一取值的参数)无法进行统一同步,因为不同的代理端运行在不同的JVM之上,代码的synchronized仅能在单独的JVM生效。

    对比LoadRunner,第一个问题,脚本代码的任何更新只需要在Controller端刷新一下就可以同步到代理机了;第二个问题,LoadRunner使用参数block就可以全局管理那些需要唯一取值的参数。

    还好,在JAVA类请求中,使用“外挂”数据库可以解决以上两个问题。这里介绍下H2 Database,一个嵌入式开源数据库,不需安装,整个实现环境就一个jar包,文档及下载地址是:http://www.h2database.com/


    2、解决方法

    1)      结构图示

    先画个图说明一下解决方法:



    其中jar包文件以BLOB的形式存放在H2数据库表extjars(batchno,putedtime,filename,content)中。


    2)      Blob对象处理

    Blob对象处理,即服务端文件入库和代理端读取文件的过程和方法。先创建一个表来保存不同版本的jar文件:

    Create table extjars (batchno varchar(26),putedtime varchar(26),filename varchar(260),contentblob);

    Blob入库

    向表中插入BLOB对象时,新的JDBC6已经可以直接插入blob数据,而不像老版本的jdbc需要先insert一个空的blob然后再获取这个对象并写入数据。

    下面是插入Blob字段(这里的blob字段就是存放jar包的)的主要代码:

    /**

         * 将文件以二进制Blob对象放入表中

         * @param batchno

         * @param filename

         */

    public voidinsertAJarFile(Connection conn,String batchno,String filename){

                       String curtime =CommonUtil.getCurStringTime();

                       String sqlInsert ="insert into extjars(batchno,putedtime,filename,content)values(?,?,?,?)";                

                       Connection conn = null;           

                       try {

                                //创建一个blob对象

                                Blob blob =conn.createBlob();

                                //打开输入文件流

                                InputStream is = newFileInputStream(new File(filename));

    //设置流写入开始位置

                OutputStream out =blob.setBinaryStream(1); 

                                //设置缓冲大小10Mb

                byte[] temp = newbyte[1024000]; 

                int length; 

                                //开始写入

                while ((length = is.read(temp)) !=-1) { 

                      out.write(temp, 0, length); 

                } 

                is.close();

                out.flush();

                out.close();

                //插入普通字段和blob字段

                PreparedStatement pstmt =conn.prepareStatement(sqlInsert); 

                pstmt.setString(1, batchno); 

                pstmt.setString(2, curtime);

                pstmt.setString(3, filename); 

                pstmt.setBlob(4, blob);

                pstmt.executeUpdate();

                pstmt.close();

                conn.commit();

                //释放blob资源

                blob.free();

                conn.close();

                       } catch (Exception e) {

                                e.printStackTrace();

                       } 

             }

    Blob读取

    插入整个文件到表中后,代理端(Slave)使用下面这段代码读取Jar文件到本地磁盘:

    /**

         * 从表中获取最新版本文件

         * @param conn数据库连接句柄

         * @param jarName要下载文件的名字

         * @param storePath存放路径

         * @return

         */

    public void getLastJarFile(Connetionconn,String jarName,String storePath){               

                       //查询最大版本号的文件信息

                       String sqlSelect = "SELECTbatchno, putedtime,filename,content FROM EXTJARS where PUTEDTIME = (selectmax(putedtime) from extjars)";

                       if(!jarName.equals("")&&null!= jarName){

                                //查询指定文件名最大版本号的记录信息

                                sqlSelect = "SELECTbatchno, putedtime,filename,content FROM EXTJARS where batchno = (SELECTMAX(batchno) FROM EXTJARS where filename like '%"+jarName+"%') andfilename like '%"+jarName+"%'";

                       }       

                       String batchno = "";

                       String putedtime = "";

                       String fullname = "";

                       String filename = "";

                       try {                   

                                Statement stmt = conn.createStatement(); 

                ResultSet rs = stmt.executeQuery(sqlSelect);

                Blob blob = null; 

                while(rs.next()) 

                { 

                         batchno= rs.getString(1);

                         putedtime= rs.getString(2);

                         fullname  = rs.getString(3);

                         if(fullname.indexOf("/")>=0){

                                   filename=fullname.substring(fullname.lastIndexOf("/")+1);

                         }

                                         //获取结果集中的Blob对象

                    blob = rs.getBlob(4); 

                } 

                                //将流形式的blob对象放入byte数组中

                byte[] temp = new byte[(int)blob.length()]; 

                InputStream in = blob.getBinaryStream(); 

                in.read(temp);

                //将缓存的byte写到文件

                storePath = storePath + "/"+ filename;

                File file = new File(storePath); 

                FileOutputStream fout = newFileOutputStream(file); 

                fout.write(temp);

                fout.flush();

                in.close(); 

                fout.close(); 

                blob.free();

                conn.close();

                       } catch (Exception e) {

                                e.printStackTrace();

                       }              

             }

     

    这里将封装的方法打包后放入<jmeterPath>/lib/ext目录下,并在主控端建立一个Java请求的测试计划,专门用于更新代理端的jar包。此过程省略。


    3)      全局序列化参数

    这个问题的解决借鉴LoadRunner里“uniquenumber”的block方式,按VU数量进行分区,每个VU(所有代理机上的)在分区内的数据进行递增。



    分块数据存储结构为:create table xxx_paramName(HOST_VUID varchar(20), BASE_NUMB, varchar(20),LAST_NUMB varchar(20));

    HOST_VUID:表示线程标志(VUID),主键唯一;

    BASE_NUMB:表示分块数据初始值;

    LAST_NUMB:表示分块数据被使用过的最大值(下次的起点);

    这部分代码比较简单,即读取配置文件的初始值(需要参数化的变量,变量的初始值,VU数量),分块入库。

    重点说一下H2数据库在这里的特殊作用:

    启动TCP连接

    启动TCP连接,为客户端(代理机)提供数据获取和更新服务。

    □服务端启动代码如下:

    /**

         * 创建一个H2数据库TCP服务

         * @param port 本地端口

         */

             public static Server startH2TCPServer(Stringport) {

                       Server server = null;

                       try {

                                server = Server.createTcpServer(newString[] { "-tcpPort", port, "-tcpAllowOthers" })

                                                   .start();

                       } catch (SQLException e) {                          

                                e.printStackTrace();

                                throw newRuntimeException(e);

                       }

                       return server;

             }

    □客户端连接代码如下:

    /**

         * 通过TCP方式连接到H2数据库

         * @param ipport

         * @param dbtype

         * @param dbname

         * @returnConnection

         */

             public static Connection createH2TCPConnection(Stringipport,

                                String dbtype,String dbname) {

                       String sourceURL = null;

                       Connection conn = null;

                       try {

                                //注意TCP连接的写法

                                if (dbname.isEmpty()){

                                         sourceURL ="jdbc:h2:tcp://" + ipport + "/mem:" + dbname;

                                } else {

                                         sourceURL ="jdbc:h2:tcp://" + ipport + "/~/" + dbname;

                                }

                                Class.forName("org.h2.Driver");

                                //连接用户和密码要根据约定修改

                                conn =DriverManager.getConnection(sourceURL, "user", "password");

                                CommonUtil.printLog2Console("Databaseconnected successfully!");

                       } catch (Exception e) {

                                e.printStackTrace();

                                return null;

                       }

                       return conn;

             }

    启动WEB连接

    H2数据库另一个极好的功能是可以通过浏览器的方式连接并编辑。

    □服务端启动代码如下:

    /**

         * 启动一个H2 WEB Server,其他客户端可以通过IE访问

         * @param port

         * @return

         */

             public static Server startH2WEBServer(Stringport) {

                       Server server = null;

                       try {

                                server = Server.createWebServer(newString[]{"-webPort",port, "-webAllowOthers" }).start();

                                System.out.println("DatabaseServer(WEB) Startup Success : " + server.getURL());

                       } catch (SQLException e) {

                                System.out.println ("Startthe database error : " + e.toString());

                                e.printStackTrace();

                                throw newRuntimeException(e);

                       }

                       return server;

             }


    □使用IE连接:





    Jmeter中本框架的使用

    下面是Jmeter中使用DeBlock的calss的必须实现的代码:

     

    publicclass YourClassName extends AbstractJavaSamplerClient {

       //VU序号,根据VU数递增

    private static vuid = 0;

    //vuid组成VU(线程)名字

       private String VUName = "";

       //需要在全部线程上同步的序列化变量

       private static int msgid1 = 0;

    //当前线程迭代计数

    private int loops = 0;

    //管理端IP和端口

    private String DOBLOCK_SERVER = "";

      

    public ArgumentsgetDefaultParameters() {

         Argumentsparams = new Arguments();

         params.addArgument("DOBLOCK_SERVER","192.168.219.194:50000");

         returnparams;

    }

     

       public void setupTest(JavaSamplerContextarg0) {

        try {     

           DOBLOCK_SERVER= arg0.getParameter("DOBLOCK_SERVER");

           //连接到服务端

    DeBlock de = newDeBlock(DOBLOCK_SERVER);

            //设置VU标志(线程唯一ID

           VUName= de.setVUName(++vuid);

           //根据VUNAME和参数名msgid1取得开始值, system_tag:与业务系统相关的标志

           Stringstart = de.getBlockBase(system_tag, "msgid1", VUName);

           msgid1 = Integer.parseInt(start);

        } catch (Exception e) {

           e.printStackTrace();

        }

          //其他初始化代码

          .........

       }

      

      

       //迭代中使用msgid1

       public SampleResultrunTest(JavaSamplerContext arg0) {

            //迭代代码

            msgid1++;

            loops++;

       }

      

       //测试结束时调用

       publicvoid teardownTest(JavaSamplerContextarg0) {

       try {

            DeBlockde = new DeBlock(DOBLOCK_SERVER);

            de.updateLastNumb(system_tag,"msgid1", VUName,loops);

       }catch (Exception e) {

            e.printStackTrace();

       }          

       //其他代码

       ...............

       }

    }

     

    本篇完。
    展开全文
  • 该资源是“Java实现的反向代理程序(编译版)”使用的一些公共JAR,主要包含“commons-text-1.4.jar”和“javax.servlet_1.0.0.0_2-5.jar”这两个JAR,共有兴趣的同道人下载。
  • 将java工程打成war部署linux服务器后,在服务器上存在代理的情况下,我们java工程如果存在接口对外有发送http请求时,我们的java代码可能也要相应的有设置对应于服务器上的代理的代码.具体如下 1,linux服务器,一般...

    将java工程打成war部署到linux服务器后,在服务器上存在代理的情况下,我们java工程如果存在接口对外有发送http请求时,我们的java代码可能也要相应的有设置对应于服务器上的代理的代码.具体如下

    1,linux服务器,一般进入到/home/用户名/

    2,使用"vi ."再加按两次Tab键,然后ls可以看到有个.bash_profile文件.或直接使用"vi ~./"再按两次Tab键,然后ls


    或直接

    3,vi .bash_profile


    export 后面http_proxy是代理地址类型,"="后是代理地址:端口号,端口号一般是8080,此外代理有http与https的区别.

    到此,linux上的代理设置好了,下面设置java代码的相应代理.(有时候是不需要写的)

    4,如果遇到java代码有需要对外网发送请求的情况,需要在通讯客户端代码部分加以下代码


    5,打码部分即是和linux上http_proxy后面相应的.


    展开全文
  • webpack+vue-cil 配置接口地址代理以及将项目打包子目录的方法前言很久没有更新关于webpack+vue的内容了。前面承诺过大家告诉大家如何打包子目录的。由于太忙,也忘记了。今天补充两个知识点给大家。将接口配置...

    webpack+vue-cil 配置接口地址代理以及将项目打包到子目录的方法

    前言

    很久没有更新关于webpack+vue的内容了。前面承诺过大家告诉大家如何打包到子目录的。由于太忙,也忘记了。今天补充两个知识点给大家。

    将接口配置到本地代理的方法

    一般来说,我们会在正式环境中讲接口配置到和项目路径是一个域名下的。因此,我们没必要在调用接口的时候使用绝对地址,使用相对地址即可。但是开发环境的话,我们本地跑的是localhost:8080地址,当然要使用包含域名的接口地址了。

    文字描述有点晕,举个栗子

    正式环境

    接口地址 前端页面地址
    /api/** /

    开发环境

    接口地址 前端页面地址
    http://www.xxx.com/api/** http://localhost:8080

    如上,在请求上,我们的开发环境不仅仅面临要把接口的全路径写全的问题,还包括跨域问题等等。

    所以,解决这个问题的方法就出来了,将接口地址通过代理的方式映射到本地,让我们的本地开发也可以使用相对根目录的方式请求接口。

    webpack本身自带了代理功能,我们的vue-cil更是集成了进来,只要经过简单的配置即可。

    我们打开下面路径的文件

    config/index.js

    在其中的dev对象里面找到:

    proxyTable: {},

    这里就是配置代理的地方,我们进行如下设置:

    proxyTable: {
      '/api/**': {
        target: 'http://www.xxx.com', // 你接口的域名
        secure: false,      // 如果是https接口,需要配置这个参数
        changeOrigin: true,     // 如果接口跨域,需要进行这个参数配置
      }
    },

    更多配置参数请参阅:https://github.com/chimurai/http-proxy-middleware#options

    webpack代理设置请参阅:https://webpack.js.org/configuration/dev-server/#devserver-proxy

    如果你看不懂我在说什么,那么是你没有遇到这个问题。给自己的记忆打个点,当遇到这个问题的时候,记得回来看这篇文章

    将项目打包到子目录

    默认配置下,我们的项目只能在根目录下运行,如果真这样的话,那还是非常麻烦的,可能我们需要在一个域名下面跑多个项目。

    通过下面的简单设置,可以将我们打包的文件放在任意地方跑起来。

    同样是config/index.js这个配置文件,我们找到build节点,找到下面的代码:

    assetsPublicPath: '/',

    上面的代码是表示,我们打包出来的路径是相对根目录的。这里,你可能想到了,那就在这里写具体的子目录路径就好了。也不是不行,不过我们一般这么配置

    assetsPublicPath: './',

    加一个英文句号即可。这表示在当前目录下。这样,你随便放在哪里都可以跑起来了。

    上面的说法是错误的。经过测试,在有资源的情况下,这样处理会出问题,正确的做法是,你放在什么目录就应该在这里填写什么目录,才能够正确的编译css中的图片地址。
    例如,你想放在/h5/下面,就应该这样填写assetsPublicPath: '/h5/',
    另外,在windows下面实测编译会出错,会提示没有权限创建文件夹。但是在mac和linux上没有问题。
    这我就不得而知了。

    我的其他webpack+vue文章索引

    《Vue2+VueRouter2+webpack 构建项目实战(一)准备工作》

    《Vue2+VueRouter2+webpack 构建项目实战(二)目录以及文件结构》

    《Vue2+VueRouter2+webpack 构建项目实战(三)配置路由,整俩页面先》

    《Vue2+VueRouter2+webpack 构建项目实战(四)接通api,先渲染个列表》

    《Vue2+VueRouter2+webpack 构建项目实战(五)配置子路由》

    《Vue2+VueRouter2+webpack 构建项目实战(六)修复代码并通过验证,另发布代码》

    《Vue2+VueRouter2+webpack+Axios 构建项目实战(七)重构API文件为使用axios》

    本文由FungLeo原创,允许转载,但转载必须附带首发链接。如果你不带链接,我将采取包括但不限于深深的鄙视你等手段!

    展开全文
  • Cglib实现动态代理

    2020-05-24 16:31:50
    Cglib代理模式基本介绍: ...2)注意,cglib代理的目标对象里要被增强的方法不能是static或者final的,如果是static或者final的则不会被拦截,因为cglib是通过继承目标类实现方法增强,而static或者final的方法是不能

    Cglib代理模式基本介绍:
    Cglib代理也叫子类代理,它是在内存中构建一个子类对象并对其目标方法进行拦截从而实现对目标对象功能扩展。使用Cglib代理需要引入Cglib jar包,Cglib包的底层是通过字节码处理框架ASM来转换字节码并生成新的类。
    1)首先导入cglib jar包

    在这里插入图片描述

    2)注意,cglib代理的目标对象里要被增强的方法不能是static或者final的,如果是static或者final的则不会被拦截到,因为cglib是通过继承目标类实现方法增强,而static或者final的方法是不能被重写的也就不会执行增强的代码。
    还有 cglib代理的目标类更不能是final的,否则会报错,因为不能被继承
    在这里插入图片描述

    3)cglib代码实现如下:

    class TeacherDao {
        public  String teach() {
            System.out.println(" 老师授课中  , 我是cglib代理,不需要实现接口 ");
            return "hello";
        }
    }
    
    class ProxyFactory implements MethodInterceptor {
        //维护一个目标对象
        private Object target;
        //构造器,传入一个被代理的对象
        public ProxyFactory(Object target){
            this.target = target;
        }
        //返回一个代理对象:  是 target 对象的代理对象
        public Object getProxyInstance(){
            //1. 创建一个工具类
            Enhancer enhancer = new Enhancer();
            //2. 设置父类
            enhancer.setSuperclass(target.getClass());
            //3. 设置回调函数
            enhancer.setCallback(this);
            //4. 创建子类对象,即代理对象
            return enhancer.create();
    
        }
        //重写  intercept 方法,会拦截目标对象的方法进行增强
        @Override
        public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
            System.out.println("Cglib代理模式 ~~ 开始");
            Object invoke = method.invoke(target, objects);
            System.out.println("Cglib代理模式 ~~ 提交");
            return invoke;
        }
    }
    
    class Client {
    
        public static void main(String[] args) {
    
            //创建目标对象
            TeacherDao target = new TeacherDao();
            //获取到代理对象,并且将目标对象传递给代理对象
            TeacherDao proxyInstance = (TeacherDao)new ProxyFactory(target).getProxyInstance();
    
            //执行代理对象的方法,触发intecept 方法,从而实现 对目标对象的调用
            String res = proxyInstance.teach();
            System.out.println("res=" + res);
        }
    
    }

    output:

    在这里插入图片描述

    如果们将目标方法改为静态或者final的,输出为:
    在这里插入图片描述

    展开全文
  • 用测试域名在测试tomcat上测试,测试完后停止测试用tomcat,修改配置文件成生产服务的配置,启动测试用tomcat,停止生产用tomcat,同步生成用数据库测试用数据,nginx中把生产用域名后端指向测试用tomcat,...
  • 1.config下index.js 2.mian.js中axios访问路径改成'/api/'(对应的就是上面配置的api) 3.nginx下nginx.conf 4.这样基本就成功了
  • 这种情况应对的是app能够正常打开但所有网络请求失败,抓软件显示请求的状态码多为4或5开头,不使用代理,app网络请求正常 这种情况跟ca双向认证很像,ca双向认证是只能抓CONNECT 请求,看不https请求 首先先...
  • 解决安卓手机抓不到包,流量不走手机代理的问题 安装APP代理机器人授予root权限按照图片进行配置红圈内三个选项即可Host:电脑ip地址端口:按照抓软件设置 一般为8888代理切换:设置好Host与端口之后 点击开启...
  • *************** 3.maven安装本地jar包到仓库方法: mvn install:install-file -Dfile=jar包的绝对位置 -DgroupId=pom文件依赖的groupId -DartifactId=pom文件依赖的artifactId -Dversion=pom文件依赖的version...
  • 如题, nexus 私服 增加了另一个 私服, 但是无法搜 版本中带有 snapshot字样的 jar。 环境情况: 1.老私服: 首先版本中带有 snapshot字样的 jar,是发布在 老私服上的。 老私服中可以搜的版本中带...
  • 现场,配置麻烦,能不能直接打包exe就可以使用了?答案是可以的。 百度查资料,找到了pkg解决方案。 pkg可以将Node.js项目打包为可执行文件,即使在未安装Node.js的设备上也可以运行该可执行文件。 看图我打包的...
  • 现在有这样一个需求,前端代码打包成功好以后,直接扔nginx上项目任然可以正常运行,无需配置baseURL,让nginx代理发送请求。 同样打开config目录下prod.env.js 'use strict' module . exports = { ...
  • 使用Fiddler代理抓

    2020-09-02 20:53:37
    如上设置后就可以抓取Https的了,抓不就重启浏览器和fiddler,还抓不就是证书问题,删掉浏览证书重新在fiddler里安装 HTTPS抓取设置:菜单栏→Tools→Options→HTTPS 如图勾选,点击Actions→Reset All ...
  • 山寨I9300线刷二代

    2013-02-27 17:30:00
    声明:我发的是刷机,不是刷机技术。...刷机步骤和普通安卓系统刷机一样,不会的可以问百度或者移动叔叔网站学习。 特别声明:此我可以用,他可以用不一定你可以用。刷机有风险,考虑清楚在刷!!
  • 如何划分一代三代防火墙

    千次阅读 2017-06-22 08:05:40
    首先说明一下我不是专家,我说的发展史只能从一个很小的角度来谈谈...一代防火墙其实就是一台能做过滤的路由器,我猜想也许是以前设备的性能不高,过滤这样的事情都需要专门用一台设备来做。 一代防火墙最大的问...
  • Fidller 抓工具-手机代理抓

    千次阅读 2016-03-23 11:23:54
    Fiddler功能有很多,但是目前我 个人用到的就是APP的pingback信息抓,也就是设置手机代理,在PC端可以查看操作app返回的接口信息 1.首先下载百度搜就可以 ,很简单,附上个人百度云的链接:...
  • vue的项目中使用axios发送ajax请求,因为跨域,使用了proxy反向代理,开发环境测试没有问题,但是项目打包放生产环境时报404错误,查了一下解决方案,可以后端设置nginx解决,但是我们这个项目服务器没用nginx,...
  • 这次笔记分四个部分介绍,主要是:Fiddler工具的简介、HTTP协议的介绍及工作原理、Fiddler抓以及抓小提示。下面就分别进行介绍。 一、Fiddler工具的简介 Fiddler能够记录所有客户端和服务器的HTTP或者HTTPS...
  • 组队学习任务已经过半,今天想和大家讨论一下Go语言的管理,这个问题曾经困扰我很久。也希望大家能彻底搞清楚Go语言的管理机制。1Go Modules是什么go module是go官方自带的go依赖管理库,在1.13版本正式推荐使用...
  • Android 禁止代理抓

    千次阅读 2019-04-17 19:54:35
    以前一直使用fiddler进行抓测试,有次看到一个apk,想抓看下数据,发现使用fiddler是无法抓取资源请求外的http请求,并且确定他是http请求,但就是抓取不,后来查了下相关资料,看到我们平时使用的http请求...
  • 前言: 项目使用vue-cli直接生成项目,然后使用proxyTable接口代理后, 在本地调用后台接口,一切正常,但是后期打包上线时,发现页面接口报404,后找到解决办法为: 后台修改nginx 代理配置: ...
  • 本文转载自看雪论坛看雪论坛作者ID:ChenSem原文链接:https://mp.weixin.qq.com/s/5C4-NS63JWshfEG3EsN9qQ相关文章推荐:抓分析 | APP 抓不到包怎么办?抓是作为apk分析的首要切入点,获取apk的通信协议的必要...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,653
精华内容 3,461
关键字:

包到代