前几篇文章,我在一个比较浅的层面给大家介绍了elastic的APM功能,对于我而言,在没有具体到真正的在生产环境上去应用,对各种场景进行适配之前,也只是对APM建立了一个基础的认知。在接下去的几篇文章中,我会尽可能的模拟各种我们在现实生产环境上可能遇到的场景来进行测试,看看elastic APM能够满足我们哪些方面的需求。
无嵌套调用的微服务监控
首先,我们先来看一个比较简单的场景,即部署多个进程提供相同的服务,根据简单的负载均衡,来支撑流量。
测试用到以下工具:
- postman, 模拟前端对接口对调用,并发,压测
- nginx,反向代理和负载均衡
后端微服务
之前的文章都是以nodejs和python的服务作为测试样例,这次使用python。
为了快速搭建测试环境,https://start.spring.io/ 上快速创建一个springboot 微服务工程,包含基本的web功能(我们测试restful接口),下载到本地,解压缩,然后maven install一下,下载相关的依赖
编写一个超简单的接口:(这里请自动忽视我使用类静态属性和方法这样的操作。。。)
package com.example.demo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.Random;
@RestController("MyServiceController")
@RequestMapping("/api")
public class MyService
{
public static String serviceName = "service";
@RequestMapping(path = "/service", method = RequestMethod.GET)
@ResponseBody
public String service1()
{
try
{
Random random = new Random( );
Thread.sleep( 1000 * random.nextInt(5) );
System.out.println( "This is " + serviceName );
return "Hello world";
}
catch( InterruptedException e )
{
e.printStackTrace();
}
return "";
}
public static void setServiceName( String serviceName)
{
MyService.serviceName = serviceName;
}
}
该代码在web上通过path: /api/service
提供restful接口的调用,每次调用,我们会在标准输出上显示是哪个接口发生了调用。
注意,这里的Thread.sleep( 1000 * random.nextInt(5) );
是为了让接口有一个不确定的响应时间。
main文件:
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;