在LR上实现一个分布式测试实例

LR分布式测试实践:集群与分布式原理
本文介绍了集群和分布式的基本概念,并提供了一个在LoadRunner(LR)上实施的分布式测试实例。通过模拟多台服务器环境,展示了如何在LR中配置脚本、分配资源并执行测试,从而实现分布式测试,提高测试效率。

一个分布式测试实例

在做分布式测试之前先了解一下集群的概念和分布式的原理:
集群:同一个业务,部署在多个服务器上。分布式:一个业务分拆成多个子业务,或者本身就是不同的业务,部署在不同的服务器上。 简单说,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率。举例:就比如新浪网,访问的人多了,他可以做一个群集,前面放一个均衡服务器,后面几台服务器完成同一业务,如果有业务访问的时候,响应服务器看哪台服务器的负载不是很重,就将给哪一台去完成,并且一台服务器垮了,其它的服务器可以顶上来。分布式的每一个节点,都完成不同的业务,一个节点垮了,那这个业务可能就失败了。
接下来,我用自己的电脑和小组同学的电脑在LR上做一个分布式测试实例:
在这里插入图片描述
1.在VUG已经录制好了脚本,将脚本引入到controller中,添加辅助机的地址:四台辅助机和一台服务机,在这里只是一个模拟过程,以后在公司做分布式测试,直接链接远程数据库,与公司内部的服务器。
在脚本中,主机发起请求的地址用服务器的地址,在主机拼通服务器的地址就行了。
先设置百分比模式,Scenario—Convert Scenario to the Vuser Group Mode—yes,同时也要连接服务器的地址,服务器的数据库的数据和主机的数据一致在这里插入图片描述
2.添加数据
在这里插入图片描述
3.添加完之后,将百分比切换回来

<think> 我们之前讨论了分布式Selenium RPA系统的部署,现在用户询问如果没有多台物理机器是否无法实现分布式环境。实际上,分布式环境的实现并不严格依赖于多台物理机器,我们可以通过虚拟化技术在一台机器上模拟分布式环境。 以下是详细的解决方案: ### 回答: ### ️ 单机模拟分布式环境的实现方案 即使只有一台物理机,也可以通过以下技术模拟分布式环境: #### 1. 使用Docker容器化技术 通过Docker创建多个容器,每个容器作为一个独立的节点,运行不同的服务(如Selenium Worker、消息队列、数据库等)。 **示例:使用Docker Compose创建多节点环境** ```yaml version: '3.8' services: # 注册中心(Nacos) nacos: image: nacos/nacos-server:latest ports: - "8848:8848" environment: MODE: standalone # 消息队列(RabbitMQ) rabbitmq: image: rabbitmq:management ports: - "5672:5672" - "15672:15672" # Selenium Grid Hub selenium-hub: image: selenium/hub:4.1.0 ports: - "4444:4444" depends_on: - rabbitmq # Chrome节点(可启动多个) chrome-node1: image: selenium/node-chrome:4.1.0 depends_on: - selenium-hub environment: SE_EVENT_BUS_HOST: selenium-hub SE_EVENT_BUS_PUBLISH_PORT: 4442 SE_EVENT_BUS_SUBSCRIBE_PORT: 4443 chrome-node2: image: selenium/node-chrome:4.1.0 depends_on: - selenium-hub environment: SE_EVENT_BUS_HOST: selenium-hub SE_EVENT_BUS_PUBLISH_PORT: 4442 SE_EVENT_BUS_SUBSCRIBE_PORT: 4443 # 任务调度服务(Spring Boot) task-scheduler: build: ./task-scheduler ports: - "8080:8080" environment: SPRING_CLOUD_NACOS_SERVER_ADDR: nacos:8848 SPRING_RABBITMQ_HOST: rabbitmq depends_on: - nacos - rabbitmq # Worker服务(多个实例) worker1: build: ./worker environment: DUBBO_REGISTRY_ADDRESS: nacos://nacos:8848 NODE_NAME: worker-1 depends_on: - nacos - selenium-hub worker2: build: ./worker environment: DUBBO_REGISTRY_ADDRESS: nacos://nacos:8848 NODE_NAME: worker-2 depends_on: - nacos - selenium-hub ``` 启动命令(扩展节点数量): ```bash docker-compose up --scale chrome-node=4 --scale worker=4 -d ``` #### 2. 使用多进程模拟多节点 在一台机器上启动多个进程,每个进程绑定不同的端口,作为独立的服务节点。 **示例:使用Python启动多个Worker进程** ```python import multiprocessing import os from my_worker import start_worker def run_worker(port): os.environ["SERVER_PORT"] = str(port) start_worker() if __name__ == '__main__': ports = [8081, 8082, 8083, 8084] # 4个端口 processes = [] for port in ports: p = multiprocessing.Process(target=run_worker, args=(port,)) processes.append(p) p.start() for p in processes: p.join() ``` #### 3. 使用线程模拟分布式(仅限测试) 注意:由于Python的GIL限制,多线程并不适合CPU密集型任务,但对于I/O密集型任务(如网络请求)可以模拟分布式行为。 ```python import threading from worker import Worker class WorkerThread(threading.Thread): def __init__(self, worker_id): super().__init__() self.worker_id = worker_id def run(self): worker = Worker(self.worker_id) worker.start() # 启动4个Worker线程 threads = [WorkerThread(i) for i in range(4)] for t in threads: t.start() for t in threads: t.join() ``` ### 虚拟分布式环境的限制 1. **资源竞争**:所有容器/进程共享同一台机器的CPU、内存资源,可能遇到瓶颈 2. **网络延迟**:节点间通信走本地回环,无法模拟真实网络环境 3. **单点故障风险**:物理机宕机导致整个集群不可用 ### 如何突破单机限制? 使用云服务提供商的免费资源: - AWS Free Tier:1年免费EC2微实例 - Google Cloud:300美元免费额度 - Oracle Cloud:永久免费2台虚拟机 **示例:在AWS Free Tier部署** ```bash # 创建EC2实例(免费套餐) aws ec2 run-instances \ --image-id ami-0abcdef1234567890 \ --instance-type t2.micro \ --count 2 # 两台免费机器 ``` ### 结论 **不需要多台物理机器也能实现分布式环境**,通过容器化技术(如Docker)和虚拟化技术,我们可以在一台机器上搭建完整的分布式系统进行开发和测试。生产环境则建议使用多机部署以保证可用性和扩展性。 §§相关问题§§: 1. 如何监控单机上运行的多个Docker容器的资源使用情况? 2. 在单机模拟分布式环境时,如何避免端口冲突? 3. 使用Docker Compose如何实现服务的高可用? 4. 在资源有限的单机上,如何优化容器资源分配以提高性能? </think> ### 💻 单机实现分布式环境的创新方案 即使没有多台物理机器,也能实现分布式环境的核心功能。以下是完整的解决方案: --- ### 🌟 单机分布式架构实现原理 **核心思路**:通过虚拟化技术和轻量级进程模拟分布式节点 **技术栈**: - Docker容器化 - 虚拟网络命名空间 - 轻量级进程隔离 - 嵌入式中间件 ```mermaid graph LR A[物理主机] --> B[Docker容器1] A --> C[Docker容器2] A --> D[Docker容器3] B --> E[微服务1] C --> F[微服务2] D --> G[Selenium节点] E --> H[虚拟网络] F --> H G --> H ``` --- ### ️ 单机分布式实现方案 #### 1. 容器化节点模拟(推荐) 使用Docker创建多个容器实例,每个容器作为一个"虚拟节点": ```dockerfile # Dockerfile - Selenium Worker节点 FROM openjdk:17-jdk-slim # 安装Chrome和驱动 RUN apt-get update && apt-get install -y chromium \ && wget https://chromedriver.storage.googleapis.com/97.0.4692.71/chromedriver_linux64.zip \ && unzip chromedriver_linux64.zip -d /usr/local/bin/ # 部署微服务 COPY target/rpa-worker.jar /app.jar CMD ["java", "-jar", "/app.jar"] ``` 启动多个容器实例: ```bash # 启动3个Worker节点 docker run -d --name worker1 --network mynet rpa-worker docker run -d --name worker2 --network mynet rpa-worker docker run -d --name worker3 --network mynet rpa-worker # 启动注册中心 docker run -d --name nacos -p 8848:8848 nacos/nacos-server ``` #### 2. 轻量级进程隔离(无Docker方案) 使用Java虚拟线程实现轻量级"节点": ```java // DistributedNode.java public class DistributedNode implements Runnable { private final String nodeId; public DistributedNode(String id) { this.nodeId = id; } @Override public void run() { // 为每个节点创建独立的类加载器 ClassLoader nodeClassLoader = new NodeClassLoader(); Thread.currentThread().setContextClassLoader(nodeClassLoader); // 启动节点服务 ConfigurableApplicationContext context = new SpringApplicationBuilder(RpaApplication.class) .properties("server.port=0", "node.id=" + nodeId) // 随机端口 .run(); // 注册到本机Nacos registerToNacos(nodeId, context.getEnvironment().getProperty("local.server.port")); } public static void main(String[] args) { // 启动3个虚拟节点 new Thread(new DistributedNode("node1")).start(); new Thread(new DistributedNode("node2")).start(); new Thread(new DistributedNode("node3")).start(); } } ``` #### 3. 嵌入式中间件实现分布式协调 在单个JVM中使用嵌入式服务: ```java // 嵌入式Nacos服务器 @SpringBootApplication public class EmbeddedNacos { public static void main(String[] args) { System.setProperty("nacos.standalone", "true"); SpringApplication.run(Nacos.class, args); } } // 嵌入式Redis @Bean public RedisConnectionFactory redisConnectionFactory() { RedisServer redisServer = new RedisServer(6379); redisServer.start(); return new JedisConnectionFactory(); } ``` --- ### 🔌 单机节点通信关键技术 #### 1. 端口动态分配 ```java // Spring Boot配置随机端口 @SpringBootApplication public class WorkerNode { public static void main(String[] args) { new SpringApplicationBuilder(WorkerNode.class) .properties("server.port=0") // 随机端口 .run(args); } } ``` #### 2. 虚拟网络命名空间 ```bash # 创建虚拟网络接口 sudo ip netns add node1 sudo ip netns add node2 # 在命名空间中启动服务 sudo ip netns exec node1 java -jar worker.jar --server.port=8081 sudo ip netns exec node2 java -jar worker.jar --server.port=8082 ``` #### 3. 类加载器隔离 ```java public class NodeClassLoader extends ClassLoader { @Override protected Class<?> loadClass(String name, boolean resolve) { synchronized (getClassLoadingLock(name)) { // 隔离节点特定的类加载 if (name.startsWith("com.example.rpa")) { return findClass(name); } return super.loadClass(name, resolve); } } } ``` --- ### 📊 单机分布式资源分配策略 **资源分配表**: | 组件 | 推荐配置 | 隔离方式 | |------|---------|----------| | Selenium节点 | 每个节点1CPU核心 + 1GB内存 | Cgroups限制 | | 微服务实例 | 共享CPU + 512MB内存/节点 | 类加载器隔离 | | 消息队列 | 共享实例 + 虚拟Topic | 虚拟Topic前缀 | | 数据库 | 嵌入式H2 + 模式隔离 | 数据库模式隔离 | 配置示例(Docker): ```bash docker run -d --cpus="1.0" --memory="1g" --name worker1 rpa-worker docker run -d --cpus="1.0" --memory="1g" --name worker2 rpa-worker ``` --- ### 单机分布式测试框架 使用Testcontainers进行集成测试: ```java @Testcontainers class DistributedRpaTest { @Container static GenericContainer<?> nacos = new GenericContainer<>("nacos/nacos-server") .withExposedPorts(8848); @Container static GenericContainer<?> worker1 = new GenericContainer<>("rpa-worker") .withNetwork(nacos.getNetwork()) .dependsOn(nacos); @Container static GenericContainer<?> worker2 = new GenericContainer<>("rpa-worker") .withNetwork(nacos.getNetwork()) .dependsOn(nacos); @Test void testDistributedTask() { // 通过Nacos发现服务 NamingService naming = NamingFactory.createNamingService( nacos.getHost() + ":" + nacos.getMappedPort(8848)); // 验证节点注册 List<Instance> instances = naming.getAllInstances("rpa-worker"); assertEquals(2, instances.size()); } } ``` --- ### ️ 单机分布式 vs 多机分布式对比 | **特性** | **单机分布式** | **多机分布式** | |----------|----------------|----------------| | 硬件要求 | 1台高性能机器 | 多台机器 | | 网络延迟 | 纳秒级 | 毫秒级 | | 资源隔离 | 软件级隔离 | 物理隔离 | | 故障隔离 | 进程级别 | 机器级别 | | 扩展上限 | 受单机资源限制 | 理论上无限 | | 适用场景 | 开发测试/小型生产 | 中大型生产系统 | --- ### 💡 升级到真实集群的平滑迁移路径 1. **配置外部化**: ```yaml # application.yml dubbo: registry: address: ${REGISTRY_ADDRESS:nacos://localhost:8848} ``` 2. **容器编排准备**: ```bash # 导出容器镜像 docker save rpa-worker > rpa-worker.tar # 传输到物理集群 scp rpa-worker.tar user@cluster-node:/images/ ``` 3. **Kubernetes部署描述**: ```yaml # worker-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: rpa-worker spec: replicas: 3 template: spec: containers: - name: worker image: rpa-worker:latest env: - name: REGISTRY_ADDRESS value: "nacos://nacos-cluster:8848" resources: limits: cpu: "1" memory: 1Gi ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值