SpringBoot:性能战争

1,645 阅读3分钟

WebFulxRedis的反应式API性能矩阵

反应系统旨在应对现代软件系统带来的挑战-与大量用户和高吞吐量相关的挑战。反应系统应具有高响应性、弹性和消息驱动。

在本文中,我们将:

·使用SpringBoot 2.0,WebFlux和Reactive Redis构建一组完全无阻塞的REST API。

·针对传统的非活动API对上述Reactive API进行性能测试

第一步:创建一个Skeleton Reactive WebFlux SpringBoot项目

使用- https://start.spring.io创建一个SpringBoot maven项目

添加以下依赖项:

· spring-boot-starter-web

· spring-boot-starter-data-redis

· spring-webflux

· spring-boot-starter-data-redis-reactive

请参阅pom.xml中的依赖项

第二步:创建域对象

演示项目使用域对象Customer和Account。客户可以拥有多个帐号。


第三步:使用WebFlux创建非阻塞的反应REST API

创建REST控制器CustomerControllerRx,以便提供以下反应性无阻塞API。

·添加/更新客户

· findById

代码片段使用Mono,这是Reactive streams Publisher接口和ReactiveRedisTemplate
和ReactiveValueOperations的实现方式,以非阻塞方式与
Redis交互。

@RestController@RequestMapping("/customers/rx")public class CustomerControllerRx {    @Autowired    private ReactiveRedisTemplate<String, Customer> redisTemplate;    private ReactiveValueOperations<String, Customer> reactiveValueOps;  @PostMapping  public Mono<Boolean> add(@RequestBody Customer customer) {      reactiveValueOps = redisTemplate.opsForValue();      Mono<Boolean> result = reactiveValueOps.set(customer.getExternalId(), customer);
 return result;  }  @GetMapping("/{id}")  public Mono<Customer> findById(@PathVariable("id") String id) {      reactiveValueOps = redisTemplate.opsForValue();      Mono<Customer> fetchedAccount = reactiveValueOps.get(id);      return fetchedAccount;  }}

ReactiveRedisTemplate在RedisConfigRx中配置

第四步:创建同步(阻塞)REST API

创建REST控制器CustomerController,以便为非反应性阻塞API提供服务。我们正在使用
CustomerRepository,它扩展了CurdRepository以与Redis数据库进行交互。

@RestController@RequestMapping("/customers")public class CustomerController {    @Autowired    CustomerRepository repository;    @PostMapping    public Customer add(@RequestBody Customer customer) {        return repository.save(customer);    }    @GetMapping("/{externalId}")    public Customer findById(@PathVariable("externalId") String externalId) {        Customer optCustomer = repository.findByExternalId(externalId);        if (Optional.ofNullable(optCustomer).isPresent())            return optCustomer;        else{            return null;        }    }}// Code for CustomerRepositorypublic interface CustomerRepository extends CrudRepository<Customer, Long> {    Customer findByExternalId(String externalId);    List<Customer> findByAccountsId(Long id);}

第五步:使用Docker连接到Redis

· Redis不正式支持Windows。但是,在UNIX或Windows启动和运行Redis的最简单方法是使用Docker。

·使用以下步骤从docker hub中提取redis映像,并在分离模式下从端口6379开始。

· $ docker pull redis  · $ docker run -d -p 6379:6379 --name redis1 redis· $ docker ps -a            //确保redis启动并运行。

有关Redis连接属性,请参阅application.yml。

第六步:设置JMeter进行测试

·安装Apache JMeter,https://jmeter.apache.org/

·从插件下载站点https://jmeter-plugins.org/安装以下图形插件

o基本图表

o附加图表

上述插件是zip文件,可以解压缩到JMeter安装文件夹的lib文件夹中。安装插件后,可以从
bin文件夹启动JMeter。

下一步是为需要进行基准测试的API创建测试计划。我有以下API测试计划。


上述测试计划可以在JMeter中打开,并配置为不同数量的并发用户-例如5,50,100,400,500
等。现在,JMeter测试用例可以在非UI模式下执行,如下所示。

jmeter -n -t  <TestPLan.jmx> -l <TestPlan.jtl>  -e  -o <output folder>

这里:

  -n在非GUI模式下运行

  -t提供测试文件的名称

  -l输出报告文件的名称

  -e jMeter遵循jmx文件中指定的后处理。

  -o仪表板文件夹。

第七步:基准反应REST API与阻止REST API

从SpringRedisReactiveApplication开始

·通过连接到Docker上的Redis DB,确保应用程序启动时没有错误。

·为测试计划设置用户(线程)和循环(迭代)。

使用JMeter UI打开TestPlan并更改用户(线程)数并设置循环次数,保存测试计划,退出JMeter UI。

·执行测试计划

转到JMeter \ bin文件夹并执行:

jmeter           - n  - t   < path > \ SaveCustomers。jmx  - l  < path > \ SaveCustomers.JTL             - e  - o              < path > \ SaveCustomersOutput - 5U sers

上面的命令将运行SaveCustomers.jmx TestCases创建一个名为SaveCustomersOutput-5Users的报告文件夹。

本人创业团队产品MadPecker,主要做BUG管理、测试管理、应用分发 

网址:www.madpecker.com,有需要的朋友欢迎试用、体验! 

本文为MadPecker团队译制,转载请标明出处