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團隊譯製,轉載請標明出處

相關文章
相關標籤/搜索