/**
* 压力测试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"项目,我们可以获得宝贵的实践经验,提升对RPC框架的理解,为自己的分布式系统...
### 使用JMeter进行RESTful服务压力测试 对于RESTful服务的压力测试,JMeter提供了HTTP Samplers。用户可以创建线程组(代表并发用户),设置请求参数,包括URL、HTTP方法(GET、POST、PUT、DELETE等)以及请求头。...
同时,还应考虑并发请求和压力测试,以模拟实际生产环境中的负载情况。 总的来说,"rpc-test"项目是针对JavaScript环境中RPC SERDES的测试实践,其目的是确保RPC通信的可靠性和效率。通过深入理解和测试这个系统,...
这可能涉及到单元测试、集成测试和压力测试。例如,我们可以使用JUnit进行单元测试,模拟客户端调用服务,检查服务是否正常响应;使用Mockito等工具模拟网络环境,测试异常情况的处理。 总的来说,这个"rpc-demo....
在实际开发中,对RPC服务的测试至关重要,包括功能测试、性能测试和压力测试。例如,模拟高并发场景,验证服务的稳定性和吞吐量。 总结,RPC是构建分布式系统的关键技术,它简化了跨网络的通信,使开发者可以专注于...
对构建的RPC框架进行压力测试,评估性能瓶颈,可能的优化点包括缓存策略、线程池配置、序列化算法选择等。 在"java0323"这个文件夹中,可能会包含实现这些概念的源代码,例如服务提供者和服务消费者的相关类、...
SPHiveDB 是一个 SQLite 数据库服务器。 它使用 JSON-RPC over HTTP 公开网络接口以使用 SQLite 数据库。 它支持通过东京内阁将多个 SQLite 数据库合并... 增加了压力测试工具 锁定失败问题已修复 0.4 版的变化 (06.27
常见的Web服务协议包括SOAP、REST、XML-RPC和JSON-RPC。 2. SOAP(Simple Object Access Protocol): SOAP是用于交换结构化信息的协议,基于XML格式。它定义了一种消息结构,使得服务器和客户端可以交换数据。在...
12. **测试与性能优化**:进行充分的单元测试、集成测试和压力测试,确保框架的稳定性和高性能。优化点包括减少网络延迟、提高并发处理能力等。 以上是设计一个类似Dubbo的RPC框架所需考虑的核心知识点。在实际开发...
实现RPC框架后,需要对其进行详尽的测试,包括单元测试、集成测试和压力测试。调试工具如gdb和性能分析工具如gperftools可以帮助找出潜在问题并优化性能。 在"mysource"这个压缩包文件中,包含的就是这样一个C++...
- **常见RPC框架**:Thrift、XMLRPC、JSON-RPC、RMI、Web Services等。 - **Dubbo框架**:阿里巴巴推出的开源微服务框架,支持多种通信协议和服务发现机制。服务提供者将服务注册到注册中心,消费者通过注册中心...
在IT行业中,网络聊天室是一种常见的在线交流平台,它允许用户通过互联网实时地进行文本、音频或视频对话。...同时,测试也是必不可少的环节,包括单元测试、集成测试和压力测试,以确保软件质量。
8. **测试与调试**:在开发过程中,需要对RPC服务进行充分的测试,包括单元测试、集成测试和压力测试,确保其在各种情况下的正确性和稳定性。同时,利用brpc提供的日志和调试工具,可以方便地定位和解决问题。 综上...
6. **批量测试**:对于多个接口的测试,工具支持批量操作,一次性发送多个请求,便于进行压力测试和功能验证。 7. **性能监控**:在测试过程中,工具可能会提供一些性能指标,如QPS(每秒查询率)、响应时间等,...
7. **数据格式**:虽然名称中包含XML,但现在AJAX更多使用JSON作为数据交换格式,因为JSON更轻量级,解析更快。 8. **安全考虑**:使用AJAXRPC时,需关注跨域问题(CORS)、数据安全、防止XSS和CSRF攻击。 9. **...
Apache JMeter,作为一款强大的性能测试工具,广泛应用于接口及负载压力测试。而针对分布式服务框架Dubbo的测试,JMeter提供了相应的插件,便于开发者进行接口测试。本文将详细介绍JMeter接口测试Dubbo插件2.8.4的...
- JMeter 4.0 支持多种协议测试,包括HTTP(S)、FTP、SMTP、JMS、SOAP/RPC等,允许测试者模拟大量并发用户,模拟实际的负载场景。 - 提供了丰富的测试元素,如线程组、采样器、监听器、断言、定时器等,便于构建...
在`rpc-master`项目中,可能包含一系列测试脚本和工具,用于生成不同负载并测量上述性能指标。此外,还可能有详细的测试报告,分析了各种因素对RPC性能的影响,以及可能的优化建议。通过深入研究这个项目,我们可以...
6. **测试与调试**:在实际部署前,需要进行详尽的单元测试、集成测试和压力测试,确保支付功能的稳定性和可靠性。 通过以上步骤,我们可以看到,自定义支付接口的实现并不简单,它涵盖了支付流程的各个环节,同时...
JMeter是一款强大的性能测试工具,尤其适用于接口测试,可以进行压力测试、负载测试和功能测试。在本文中,我们将深入探讨接口测试的基本概念、接口分类以及JMeter在接口测试中的应用。 接口测试分类主要包括内部...