`
woming66
  • 浏览: 58073 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

压力测试JSON-RPC服务

    博客分类:
  • Java
阅读更多
/**
 * 压力测试JSON-RPC服务
 * 
 * @author zhiqiang.zhu
 * @version $Id: LoadRunnerRPCService.java, v 0.1 2011-6-9 下午08:43:11 zhiqiang.zhu Exp $
 */
public class LoadRunnerRPCService {

    /** logger */
    private static final Logger      logger     = Logger.getLogger(LoadRunnerRPCService.class);

    /** 端口号 */
    private static final int         PROT       = 9091;

    /** 最大线程数 */
    private static final int         NTHREADS   = 150;

    /** 线城池 */
    private static final Executor    threadPool = Executors.newFixedThreadPool(NTHREADS);

    /** 异步服务外部接口 */
    private TestXXXXServiceFacade testXXXXServiceFacade ;

    /**
     * Spring初始化方法,启动一个服务端口的守护进程并开启服务
     */
    public void init() {
        try {
            new Thread(new Runnable() {
                public void run() {
                    try {
                        initServer();
                    } catch (Exception e) {
                        logger.error(e);
                        throw new RuntimeException(e);
                    }
                }
            }).start();

            if (logger.isInfoEnabled()) {
                logger.info("====================================");
                logger.info("异步服务接口压力测试服务启动成功!");
                logger.info("====================================");
            }

        } catch (Exception e) {
            logger.error("服务启动失败", e);
        }
    }

    /**
     * 初始化服务
     */
    private void initServer() {
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket();
            serverSocket.bind(new InetSocketAddress(PROT));
        } catch (Exception e) {
            logger.error("服务启动失败", e);
            throw new RuntimeException(e);
        }

        try {
            while (true) {
                final Socket socket = serverSocket.accept();
                threadPool.execute(new Runnable() {
                    public void run() {
                        PrintWriter pw = null;
                        InputStream is = null;
                        try {
                            if (logger.isInfoEnabled()) {
                                logger.info("接受到来自" + socket.getInetAddress().getHostAddress()
                                            + "的请求!");
                            }
                            process(socket);
                            is = socket.getInputStream();
                            pw = new PrintWriter(socket.getOutputStream());
                            pw.print("true\r\n");
                            pw.flush();
                        } catch (Exception e) {
                            logger.error("处理指定的任务时出现异常", e);
                            try {
                                if (socket != null) {
                                    pw = new PrintWriter(socket.getOutputStream());
                                    pw.print("false\r\n");
                                    pw.flush();
                                }
                            } catch (IOException e1) {
                                logger.error("处理指定的任务时出现异常", e);
                            }
                        } finally {
                            if (is != null) {
                                IOUtils.closeQuietly(is);
                            }
                            
                            if (pw != null) {
                                IOUtils.closeQuietly(pw);
                            }
                            
                            if(socket != null) {
                                try {
                                    socket.close();
                                } catch (IOException e) {
                                    logger.error("处理指定的任务时出现异常", e);
                                }
                            }
                        }
                    }
                });
            }
        } catch (Exception e) {
            logger.error("处理任务时出现异常", e);
            throw new RuntimeException(e);
        }
    }

    /**
     * Socket服务处理
     * 
     * @param socket      请求
     * @throws Exception  异常
     */
    private void process(Socket socket) throws Exception {
        ChargeEvent chargeEvent = resolveParam(socket.getInputStream());
        
        if(logger.isInfoEnabled()) {
            logger.info("JSON格式转换ChargeEvent,chargeEvent=" + chargeEvent);
        }
        
        testXXXXServiceFacade.async(chargeEvent);
    }

    /**
     * 解析参数
     * 
     * @param inputStream   Socket输入流
     * @return              
     * @throws Exception
     */
    private ChargeEvent resolveParam(InputStream inputStream) throws Exception {

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int size = -1;
        while ((size = inputStream.read(buffer)) > -1) {
            bos.write(buffer, 0, size);
            String params = new String(bos.toByteArray());
            if (params.endsWith("}")) {
                break;
            }
        }

        String params = new String(bos.toByteArray());
        return splitJson(params);
    }

    /**
     * 解析JSON数据
     * 
     * @param params       JSON数据
     * @return             
     * @throws Exception
     */
    private ChargeEvent splitJson(String params) throws Exception {

        params = params.substring(1);
        params = params.substring(0, params.length() - 1);

        String properties = null;
        if (params.indexOf("[") != -1) {
            properties = params
                .substring(params.substring(0, params.indexOf("[")).lastIndexOf(",") + 1);
            params = params.substring(0, params.substring(0, params.indexOf("[")).lastIndexOf(","));
        }

        String[] arr = params.split(",");

        ChargeEvent chargeEvent = new ChargeEvent();
        for (String s : arr) {
            String[] values = s.split(":");
            values[0] = values[0].trim();
            values[1] = values[1].trim();
            String method = "get" + values[0].substring(0, 1).toUpperCase()
                            + values[0].substring(1);

            Method getMethod = ChargeEvent.class.getMethod(method, new Class[0]);
            Class<?> returnType = getMethod.getReturnType();

            Object value = getValue(values[1], returnType);
            method = "set" + values[0].substring(0, 1).toUpperCase() + values[0].substring(1);

            Method setMethod = ChargeEvent.class.getMethod(method, new Class[] { returnType });
            setMethod.invoke(chargeEvent, new Object[] { value });
        }

        if (properties != null) {
            Map<String, String> props = new HashMap<String, String>();
            properties = properties.substring(properties.indexOf("[") + 1);
            properties = properties.substring(0, properties.indexOf("]"));

            arr = properties.split(",");
            for (String s : arr) {
                String[] values = s.split(":");
                props.put(values[0].trim(), values[1].trim());
            }

            chargeEvent.setProperties(props);
        }

        return chargeEvent;
    }

    /**
     * 取得对应的数据
     * 
     * @param value String形式的值
     * @param clazz 值的类型
     * @return      真正的值
     */
    private Object getValue(String value, Class<?> clazz) {

        if (String.class.equals(clazz)) {
            return value;
        } else if (Money.class.equals(clazz)) {
            return new Money(value);
        } else if (BigDecimal.class.equals(clazz)) {
            return new BigDecimal(value);
        } else if (EventStatusEnum.class.equals(clazz)) {
            return EventStatusEnum.getEventStatusEnum(value);
        } else if (Date.class.equals(clazz)) {
            //yyyyMMddHHmmss
            return DateUtil.parseDateLongFormat(value);
        }

        return null;
    }

}
分享到:
评论

相关推荐

    guide-rpc-framework-master.zip

    这可能包括单元测试、集成测试、压力测试等,以及针对网络延迟、吞吐量和内存占用的性能调优。 通过研究"guide-rpc-framework-master"项目,我们可以获得宝贵的实践经验,提升对RPC框架的理解,为自己的分布式系统...

    Restful压力测试工具Apache Jmeter

    ### 使用JMeter进行RESTful服务压力测试 对于RESTful服务的压力测试,JMeter提供了HTTP Samplers。用户可以创建线程组(代表并发用户),设置请求参数,包括URL、HTTP方法(GET、POST、PUT、DELETE等)以及请求头。...

    rpc-test:测试RPC SERDES

    同时,还应考虑并发请求和压力测试,以模拟实际生产环境中的负载情况。 总的来说,"rpc-test"项目是针对JavaScript环境中RPC SERDES的测试实践,其目的是确保RPC通信的可靠性和效率。通过深入理解和测试这个系统,...

    rpc-demo.zip

    这可能涉及到单元测试、集成测试和压力测试。例如,我们可以使用JUnit进行单元测试,模拟客户端调用服务,检查服务是否正常响应;使用Mockito等工具模拟网络环境,测试异常情况的处理。 总的来说,这个"rpc-demo....

    RPC入门学习笔记

    在实际开发中,对RPC服务的测试至关重要,包括功能测试、性能测试和压力测试。例如,模拟高并发场景,验证服务的稳定性和吞吐量。 总结,RPC是构建分布式系统的关键技术,它简化了跨网络的通信,使开发者可以专注于...

    基于netty轻量的高性能分布式RPC服务框架.zip

    对构建的RPC框架进行压力测试,评估性能瓶颈,可能的优化点包括缓存策略、线程池配置、序列化算法选择等。 在"java0323"这个文件夹中,可能会包含实现这些概念的源代码,例如服务提供者和服务消费者的相关类、...

    sphivedb:SPHiveDB 是一个 SQLite 数据库服务器

    SPHiveDB 是一个 SQLite 数据库服务器。 它使用 JSON-RPC over HTTP 公开网络接口以使用 SQLite 数据库。 它支持通过东京内阁将多个 SQLite 数据库合并... 增加了压力测试工具 锁定失败问题已修复 0.4 版的变化 (06.27

    股票查询的WebService

    常见的Web服务协议包括SOAP、REST、XML-RPC和JSON-RPC。 2. SOAP(Simple Object Access Protocol): SOAP是用于交换结构化信息的协议,基于XML格式。它定义了一种消息结构,使得服务器和客户端可以交换数据。在...

    40_如何设计一个类似dubbo的rpc框架?架构上该如何考虑?.zip

    12. **测试与性能优化**:进行充分的单元测试、集成测试和压力测试,确保框架的稳定性和高性能。优化点包括减少网络延迟、提高并发处理能力等。 以上是设计一个类似Dubbo的RPC框架所需考虑的核心知识点。在实际开发...

    C++ language framework rpc source code implementation.zip

    实现RPC框架后,需要对其进行详尽的测试,包括单元测试、集成测试和压力测试。调试工具如gdb和性能分析工具如gperftools可以帮助找出潜在问题并优化性能。 在"mysource"这个压缩包文件中,包含的就是这样一个C++...

    SDCC2016技术总结

    - **常见RPC框架**:Thrift、XMLRPC、JSON-RPC、RMI、Web Services等。 - **Dubbo框架**:阿里巴巴推出的开源微服务框架,支持多种通信协议和服务发现机制。服务提供者将服务注册到注册中心,消费者通过注册中心...

    网络聊天室

    在IT行业中,网络聊天室是一种常见的在线交流平台,它允许用户通过互联网实时地进行文本、音频或视频对话。...同时,测试也是必不可少的环节,包括单元测试、集成测试和压力测试,以确保软件质量。

    remote procedure call using protobuffer

    8. **测试与调试**:在开发过程中,需要对RPC服务进行充分的测试,包括单元测试、集成测试和压力测试,确保其在各种情况下的正确性和稳定性。同时,利用brpc提供的日志和调试工具,可以方便地定位和解决问题。 综上...

    Dubbo接口UI测试工具

    6. **批量测试**:对于多个接口的测试,工具支持批量操作,一次性发送多个请求,便于进行压力测试和功能验证。 7. **性能监控**:在测试过程中,工具可能会提供一些性能指标,如QPS(每秒查询率)、响应时间等,...

    AJAXRPC 让 javascript 直接调用服务端方法

    7. **数据格式**:虽然名称中包含XML,但现在AJAX更多使用JSON作为数据交换格式,因为JSON更轻量级,解析更快。 8. **安全考虑**:使用AJAXRPC时,需关注跨域问题(CORS)、数据安全、防止XSS和CSRF攻击。 9. **...

    jmeter接口测试dubbo插件 2.8.4.zip

    Apache JMeter,作为一款强大的性能测试工具,广泛应用于接口及负载压力测试。而针对分布式服务框架Dubbo的测试,JMeter提供了相应的插件,便于开发者进行接口测试。本文将详细介绍JMeter接口测试Dubbo插件2.8.4的...

    apache_jemter4.0000

    - JMeter 4.0 支持多种协议测试,包括HTTP(S)、FTP、SMTP、JMS、SOAP/RPC等,允许测试者模拟大量并发用户,模拟实际的负载场景。 - 提供了丰富的测试元素,如线程组、采样器、监听器、断言、定时器等,便于构建...

    rpc:rpc基准

    在`rpc-master`项目中,可能包含一系列测试脚本和工具,用于生成不同负载并测量上述性能指标。此外,还可能有详细的测试报告,分析了各种因素对RPC性能的影响,以及可能的优化建议。通过深入研究这个项目,我们可以...

    stress-plan 是使用golang语言编写的轻量级压测工具,有着易用,从业务场景出发的压测功能 .zip

    stress-plan 是使用golang语言编写的轻量...plan/cmd./stp run -c 10 -n 1000 -u https://www.baidu.com/如果您需要使用post请求测试, 参考如下post 请求(默认 "Content-Type:application/json")./stp run -c 1 -n 1

    最新口红机系统源码下载+自定义支付接口.zip

    6. **测试与调试**:在实际部署前,需要进行详尽的单元测试、集成测试和压力测试,确保支付功能的稳定性和可靠性。 通过以上步骤,我们可以看到,自定义支付接口的实现并不简单,它涵盖了支付流程的各个环节,同时...

Global site tag (gtag.js) - Google Analytics