feat(接口测试): 添加资源节点轮询方法

This commit is contained in:
fit2-zhao 2023-12-13 13:45:00 +08:00 committed by Craftsman
parent 0adb7ab821
commit e014f34d14
3 changed files with 186 additions and 0 deletions

View File

@ -0,0 +1,31 @@
package io.metersphere.api.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
@Data
@AllArgsConstructor
public class NodeDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 接口测试 性能测试 node节点ip
*/
private String ip;
/**
* 接口测试 性能测试 node节点端口
*/
private String port;
/**
* 资源池最大并发数
*/
private int podThreads;
}

View File

@ -0,0 +1,79 @@
package io.metersphere.api.service;
import io.metersphere.api.dto.NodeDTO;
import io.metersphere.sdk.util.JSON;
import jakarta.annotation.Resource;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class RoundRobinService {
@Resource
private RedisTemplate<String, String> redisTemplate;
/**
* 获取下一个节点
*/
public String getNextNode(String poolId) throws Exception {
// 从列表头部获取下一个节点
String node = redisTemplate.opsForList().leftPop(poolId);
if (StringUtils.isBlank(node)) {
// 重试3次获取
for (int i = 0; i < 3; i++) {
node = redisTemplate.opsForList().leftPop(poolId);
if (StringUtils.isNotBlank(node)) {
break;
}
Thread.sleep(1000);
}
}
if (StringUtils.isNotBlank(node)) {
// 将节点重新放回列表尾部实现轮询
redisTemplate.opsForList().rightPush(poolId, node);
}
return node;
}
/**
* 初始化节点列表
*/
public void initializeNodes(String poolId, List<NodeDTO> nodes) {
// 检查节点是否有变更
Long poolSize = redisTemplate.opsForList().size(poolId);
int size = poolSize != null ? poolSize.intValue() : 0;
if (size == nodes.size()) {
// 对比redis中的节点列表和传入的节点列表是否一致
boolean isSame = true;
for (NodeDTO node : nodes) {
boolean isExist = false;
for (int i = 0; i < size; i++) {
if (JSON.toJSONString(node).equals(redisTemplate.opsForList().index(poolId, i))) {
isExist = true;
break;
}
}
if (!isExist) {
isSame = false;
break;
}
}
if (!isSame) {
// 清空旧的节点列表
redisTemplate.delete(poolId);
// 添加节点到列表
nodes.forEach(n -> redisTemplate.opsForList().rightPush(poolId, JSON.toJSONString(n)));
}
} else {
// 清空旧的节点列表
redisTemplate.delete(poolId);
// 添加节点到列表
nodes.forEach(n -> redisTemplate.opsForList().rightPush(poolId, JSON.toJSONString(n)));
}
}
}

View File

@ -0,0 +1,76 @@
package io.metersphere.api.config;
import io.metersphere.api.dto.NodeDTO;
import io.metersphere.api.service.RoundRobinService;
import io.metersphere.sdk.util.LogUtils;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.LinkedList;
import java.util.List;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@AutoConfigureMockMvc
public class RoundRobinServiceTests {
@Resource
private RoundRobinService roundRobinService;
@Test
@Order(1)
public void testInit() throws Exception {
List<NodeDTO> nodes = new LinkedList<>();
nodes.add(new NodeDTO("172.0.0.1", "8080", 10));
nodes.add(new NodeDTO("172.0.0.2", "8080", 10));
nodes.add(new NodeDTO("172.0.0.3", "8080", 10));
nodes.add(new NodeDTO("172.0.0.4", "8080", 10));
roundRobinService.initializeNodes("test", nodes);
}
@Test
@Order(2)
public void testGetNode() throws Exception {
LogUtils.info(roundRobinService.getNextNode("test"));
LogUtils.info(roundRobinService.getNextNode("test"));
LogUtils.info(roundRobinService.getNextNode("test"));
LogUtils.info(roundRobinService.getNextNode("test"));
LogUtils.info(roundRobinService.getNextNode("test"));
LogUtils.info(roundRobinService.getNextNode("test"));
LogUtils.info(roundRobinService.getNextNode("test"));
}
@Test
@Order(3)
public void testInitAfter() throws Exception {
List<NodeDTO> nodes = new LinkedList<>();
nodes.add(new NodeDTO("172.0.0.1", "8080", 10));
nodes.add(new NodeDTO("172.0.0.2", "8080", 10));
nodes.add(new NodeDTO("172.0.0.3", "8080", 10));
roundRobinService.initializeNodes("test", nodes);
nodes.add(new NodeDTO("172.0.0.3", "8080", 10));
nodes.add(new NodeDTO("172.0.0.7", "8080", 10));
nodes.add(new NodeDTO("172.0.0.6", "8080", 10));
roundRobinService.initializeNodes("test", nodes);
}
@Test
@Order(4)
public void testGetNodeAfter() throws Exception {
LogUtils.info(roundRobinService.getNextNode("test1"));
LogUtils.info(roundRobinService.getNextNode("test"));
LogUtils.info(roundRobinService.getNextNode("test2"));
LogUtils.info(roundRobinService.getNextNode("test"));
LogUtils.info(roundRobinService.getNextNode("test3"));
LogUtils.info(roundRobinService.getNextNode("test"));
LogUtils.info(roundRobinService.getNextNode("test1"));
}
}