当前位置:   article > 正文

VertX+SQL Server+Restful API配置与性能测试

vertx

1.简介

Vert.x

VertX是一个用于构建高性能可伸缩和响应式应用程序的开发平台。其基于事件驱动和非阻塞的架构,可以轻松地处理高并发的请求。

VertX提供了许多用于构建应用程序的库和工具,包括网络、数据库、分布式计算等。它支持多种编程语言,包括Java、Kotlin、Groovy和JavaScript。

 Restful API

Restful API 是一种设计风格,用于构建网络服务的 API。"RESTful" 代表 "Representational State Transfer",是一种通信协议,用于在不同的计算机系统之间传递和操作资源。RESTful API 的设计原则简单且具有可扩展性,并且具有良好的可读性和可维护性。它使用 HTTP 协议的各种方法(如 GET、POST、PUT、DELETE)来操作资源,通过对 URI(Uniform Resource Identifier)的操作来实现对资源的访问和操作。RESTful API 通常返回数据的表示形式(如 JSON 或 XML),并根据 HTTP 状态码提供响应。通过遵循 RESTful API 的设计原则,可以使 API 更加易于使用和理解,以及更具有可靠性和可扩展性。

 本文主要基于VertX+SQL Server进行一个API的压力测试,与传统MVC架构的API服务进行对比。

具体的功能就是实现读取SQL Server的一张表。

2.VertX API服务实现

整体实现代码

  1. package org.fff.vertx_test;
  2. import io.vertx.core.AbstractVerticle;
  3. import io.vertx.core.Promise;
  4. import io.vertx.core.http.HttpServer;
  5. import io.vertx.core.json.JsonArray;
  6. import io.vertx.core.json.JsonObject;
  7. import io.vertx.ext.web.Route;
  8. import io.vertx.ext.web.Router;
  9. import io.vertx.mssqlclient.MSSQLBuilder;
  10. import io.vertx.mssqlclient.MSSQLConnectOptions;
  11. import io.vertx.sqlclient.Pool;
  12. import io.vertx.sqlclient.PoolOptions;
  13. import io.vertx.sqlclient.Row;
  14. import io.vertx.sqlclient.RowSet;
  15. import java.util.List;
  16. public class MainVerticle extends AbstractVerticle {
  17. @Override
  18. public void start(Promise<Void> startPromise) throws Exception {
  19. HttpServer server = vertx.createHttpServer();
  20. MSSQLConnectOptions connectOptions = new MSSQLConnectOptions()
  21. .setPort(1433)
  22. .setHost("localhost")
  23. .setDatabase("TutorialDB")
  24. .setUser("sa")
  25. .setPassword("123456");
  26. // Pool options
  27. PoolOptions poolOptions = new PoolOptions()
  28. .setMaxSize(100);
  29. // Create the pooled client
  30. Pool client = MSSQLBuilder.pool()
  31. .with(poolOptions)
  32. .connectingTo(connectOptions)
  33. .using(vertx)
  34. .build();
  35. Router router = Router.router(vertx);
  36. Route route1 = router.get("/dbw");
  37. route1.handler(ctx -> {
  38. client
  39. .query("SELECT * FROM DeviceType")
  40. .execute()
  41. .onComplete(ar -> {
  42. if (ar.succeeded()) {
  43. RowSet<Row> result = ar.result();
  44. JsonArray jsonResponse = new JsonArray();
  45. List<String> columnsNames = result.columnsNames();
  46. int columnsNamesSize = columnsNames.size();
  47. for (Row row : result) {
  48. JsonObject obj = new JsonObject();
  49. for(int i = 0; i<columnsNamesSize; i++){
  50. if(row.getValue(i) == null){
  51. obj.put(columnsNames.get(i),"null");
  52. }else{
  53. obj.put(columnsNames.get(i),row.getValue(i).toString());
  54. }
  55. }
  56. jsonResponse.add(obj);
  57. }
  58. ctx.response().putHeader("content-type", "application/json");
  59. // 结束响应并发送 JSON 对象
  60. ctx.response().end(jsonResponse.encode());
  61. }
  62. else {
  63. System.out.println("Failure: " + ar.cause().getMessage());
  64. }
  65. });
  66. });
  67. server.requestHandler(router).listen(8888);
  68. }
  69. }

2.1 数据库连接

根据官方的示例,数据连接的实现为:

  1. import io.vertx.mssqlclient.MSSQLBuilder;
  2. import io.vertx.mssqlclient.MSSQLConnectOptions;
  3. import io.vertx.sqlclient.Pool;
  4. import io.vertx.sqlclient.PoolOptions;
  5. MSSQLConnectOptions connectOptions = new MSSQLConnectOptions()
  6. .setPort(1433)
  7. .setHost("localhost")
  8. .setDatabase("TutorialDB")
  9. .setUser("sa")
  10. .setPassword("123456");
  11. // Pool options
  12. PoolOptions poolOptions = new PoolOptions()
  13. .setMaxSize(100);
  14. // Create the pooled client
  15. Pool client = MSSQLBuilder.pool()
  16. .with(poolOptions)
  17. .connectingTo(connectOptions)
  18. .using(vertx)
  19. .build();

2.2 结合简单响应+请求体处理完成查库

  1. Router router = Router.router(vertx);
  2. Route route1 = router.get("/dbw");
  3. route1.handler(ctx -> {
  4. client
  5. .query("SELECT * FROM DeviceType")
  6. .execute()
  7. .onComplete(ar -> {
  8. if (ar.succeeded()) {
  9. RowSet<Row> result = ar.result();
  10. JsonArray jsonResponse = new JsonArray();
  11. List<String> columnsNames = result.columnsNames();
  12. int columnsNamesSize = columnsNames.size();
  13. for (Row row : result) {
  14. JsonObject obj = new JsonObject();
  15. for(int i = 0; i<columnsNamesSize; i++){
  16. if(row.getValue(i) == null){
  17. obj.put(columnsNames.get(i),"null");
  18. }else{
  19. obj.put(columnsNames.get(i),row.getValue(i).toString());
  20. }
  21. }
  22. jsonResponse.add(obj);
  23. }
  24. ctx.response().putHeader("content-type", "application/json");
  25. // 结束响应并发送 JSON 对象
  26. ctx.response().end(jsonResponse.encode());
  27. }
  28. else {
  29. System.out.println("Failure: " + ar.cause().getMessage());
  30. }
  31. });
  32. });

3.注解式MVC架构API服务实现

Mapper

  1. @Mapper
  2. public interface UserMapperSqlserver {
  3. @Select("SELECT * FROM DeviceType")
  4. List<DeviceTypeDetail> FetchAllInfo();
  5. }

Service

  1. @Service
  2. public class UserServiceImpl implements UserService {
  3. @Autowired
  4. private UserMapperSqlserver userMapperSqlserver;
  5. @Override
  6. public List<DeviceTypeDetail> FetchAllInfo() {
  7. return userMapperSqlserver.FetchAllInfo();
  8. }
  9. }

Controller

  1. @CrossOrigin
  2. @RestController
  3. public class UserContoller {
  4. @Autowired
  5. private UserService userService;
  6. @GetMapping("/getallinfo1")
  7. public List<DeviceTypeDetail> FetchAllInfo1()
  8. {
  9. return userService.FetchAllInfo();
  10. }
  11. }

4.不严谨的Jmeter压力测试

测试参数:

 VertX测试效果:

Samples20000
Average314
Median328
90% Line336
95% Line341
99% Line357
Min3
Maximum386
Error %0.00%
Throughput5971.8/sec
Received KB/sec59455.11
Sent KB/sec711.48

MVC测试效果:

Vertx MVC

Samples20000
Average941
Median1166
90% Line1400
95% Line1459
99% Line4058
Min1
Maximum7459
Error %0.55%
Throughput1980.4/sec
Received KB/sec24589.05
Sent KB/sec259.66

可以看出来VertX 效果还是很强大的吞吐量拉满

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/1009280
推荐阅读
相关标签
  

闽ICP备14008679号