SpringBoot:性能战争

WebFulxRedis的反应式API性能矩阵react

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

在本文中,咱们将:

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

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

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

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

添加如下依赖项:

· spring-boot-starter-web spring

· spring-boot-starter-data-redis docker

· spring-webflux 数据库

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

请参阅pom.xml中的依赖项

第二步:建立域对象

演示项目使用域对象Customer和Account。客户能够拥有多个账号。


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

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

·添加/更新客户bash

· 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中配置app

第四步:建立同步(阻塞) 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团队译制,转载请标明出处

相关文章
相关标签/搜索