业务系统算法性能测试(算法压测)

怎样对业务系统中某算法或规则引擎压测?

有时会接到针对某业务系统算法或规则引擎的性能测试需求,它们作为jar来供业务系统调用。

一般有以下两种解决方案。

第一种:通过压测业务接口来实现压测。前提条件,业务接口的处理逻辑要调用算法或规则引擎。

         优点:调用的业务链路完整,贴合实际线上接口调用。

         缺点:需要部署完整业务系统,冒烟验证,可能会占用不少机器资源,部署环境时长根据系统复杂度而定。

第二种:把算法或规则引擎封装为一个web项目,通过打包部署后进行接口压测。

         优点:纯压算法或规则引擎,不涉及业务链路,准备时间较少。

         缺点:需要创建一个web项目,额外写一点代码(调用算法或规则引擎),打包及部署web项目。

考虑时间成本因素。笔者采用了第二种方式压测。

具体示例:

前提准备:算法jar包或源码、pom.xml(jar依赖)、接口入参(可能存在多种组合方式)、接口返回结果等。

1)创建一个web项目后,设置pom.xml,把源码或jar引进来项目。

业务系统算法性能测试(算法压测)_第1张图片

2)新建一个servlet类并继承HttpServlet,在doGet()或doPost()方法中调用算法接口或规则引擎。

package com.example.droomsPerf;

import com.xxx.xxx.xxx.DroolsRule;
import com.xxx.xxx.xxx.domain.imp.CalculateDroolsImpl;
import com.xxx.xxx.xxx.domain.imp.ScriptDroolsImpl;
import lombok.SneakyThrows;
import org.drools.core.impl.InternalKnowledgeBase;
import org.drools.core.impl.KnowledgeBaseFactory;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieSession;
import org.kie.internal.builder.KnowledgeBuilder;
import org.kie.internal.builder.KnowledgeBuilderFactory;
import org.kie.internal.io.ResourceFactory;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

public class CalculateDroolsServlet extends HttpServlet {

    private InternalKnowledgeBase kbase;
    //创建算法对象
    {
        //......省略
    }
    private String message;
    private  Map params= new HashMap<>();
    private static BigDecimal leftValue = new BigDecimal("1.256");
    private static BigDecimal rightValue = new BigDecimal("1");
    private static BigDecimal leftResultValue =  new BigDecimal("1.2");
    private static Logger logger = Logger.getLogger(String.valueOf(CalculateDroolsServlet.class));

   //初始化时赋值入参
    public void init() {
        logger.setLevel(Level.INFO);
        message = "CalculateDrools starting";
        logger.info(message);
        params.clear();
        params.put("leftValue",leftValue);
        params.put("action","/");
        params.put("rightValue",rightValue);
        params.put("leftComparator","=");
        params.put("rightComparator","<");
        params.put("leftResultValue",leftResultValue);
        params.put("rightResultValue",null);
        params.put("roundingMode", RoundingMode.HALF_DOWN);
        params.put("returnValueWhenDivideZERO", false);
        params.put("scale",1);
    }


    @SneakyThrows
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {

        //调用算法或规则引擎
        KieSession session = kbase.newKieSession();
        session.insert(params);
        session.destroy();//销毁

        res.setContentType("text/html");
        PrintWriter out = res.getWriter();
        out.println("");
        out.println("

" + message + "

"); out.println(""); }   //如果接口请求方式为post类型,则在doPost()方法中调用算法 public void doPost(HttpServletRequest req,HttpServletResponse res) throws ServletException,IOException{ this.doGet(req,res); } public void destroy() { } }

 3)编辑webapp/WEB-INF/web.xml文件,设置http请求访问路径。

业务系统算法性能测试(算法压测)_第2张图片

4)在IDEA中通过tomcat启动web服务,验证http请求是否成功。

业务系统算法性能测试(算法压测)_第3张图片

访问正常。

业务系统算法性能测试(算法压测)_第4张图片

5)把web项目打包成war包,然后扔到测试服务器上(提前安装好jdk、tomcat)。

war具体放在tomcat路径下的webapps目录下。

业务系统算法性能测试(算法压测)_第5张图片

6)监控tomcat的jvm。需要编辑下catalina.sh文件。

业务系统算法性能测试(算法压测)_第6张图片

业务系统算法性能测试(算法压测)_第7张图片

保存退出后,重启下tomcat(tomcat的bin目录下:   shutdown.sh  、 startup.sh    ),就可以愉快的压测了。(tomcat的线程等设置,自行根据需求修改,在这暂不讨论)

如转载,记得带上CSDN,谢谢!

你可能感兴趣的:(Jmeter,JAVA,java,tomcat,servlet)