7 种提升 SpringBoot 吞吐量神技

点击“终码一生”,关注,置顶公众号 每日技术干货,第一时间送达&#x…

点击“终码一生”,关注,置顶公众号

每日技术干货,第一时间送达!

  • 异步执行

  • 增加内嵌 Tomcat 的最大连接数

  • 使用 @ComponentScan()

  • 默认 Tomcat 容器改为 Undertow

  • 使用 BufferedWriter 进行缓冲

  • Deferred 方式实现异步调用

  • 异步调用可以使用 AsyncHandlerInterceptor 进行拦截

1、异步执行

实现方式二种:

  • 使用异步注解 @aysnc、启动类:添加 @EnableAsync 注解

  • JDK 8 本身有一个非常好用的 Future 类——CompletableFuture

在该示例中,启动一个线程,此时 AskThread 对象还没有拿到它需要的数据,执行到 myRe = re.get() * re.get() 会阻塞。

我们用休眠 1 秒来模拟一个长时间的计算过程,并将计算结果告诉 future 执行结果,AskThread 线程将会继续执行。

CompletableFuture.supplyAsync 方法构造一个 CompletableFuture 实例,在 supplyAsync() 方法中,它会在一个新线程中,执行传入的参数。

在这里它会执行 calc() 方法,这个方法可能是比较慢的,但这并不影响 CompletableFuture 实例的构造速度,supplyAsync() 会立即返回。

而返回的 CompletableFuture 实例就可以作为这次调用的契约,在将来任何场合,用于获得最终的计算结果。

supplyAsync 用于提供返回值的情况,CompletableFuture 还有一个不需要返回值的异步调用方法 runAsync(Runnable runnable),一般我们在优化 Controller 时,使用这个方法比较多。

这两个方法如果在不指定线程池的情况下,都是在 ForkJoinPool.common 线程池中执行,而这个线程池中的所有线程都是 Daemon(守护)线程,所以,当主线程结束时,这些线程无论执行完毕都会退出系统。

核心代码:

异步调用使用 Callable 来实现:

异步调用的方式 WebAsyncTask:

2、增加内嵌 Tomcat 的最大连接数

代码如下:

3、使用 @ComponentScan()

使用 @ComponentScan() 定位扫包比 @SpringBootApplication 扫包更快。

4、默认 Tomcat 容器改为 Undertow

默认 Tomcat 容器改为 Undertow(Jboss 下的服务器,Tomcat 吞吐量 5000,Undertow 吞吐量 8000)

改为:

5、使用 BufferedWriter 进行缓冲

这里不给大家举例,可自行尝试。

6、Deferred 方式实现异步调用

代码如下:

7、异步调用可以使用 AsyncHandlerInterceptor 进行拦截

代码如下:

PS:防止找不到本篇文章,可以收藏点赞,方便翻阅查找哦

本文来自网络,不代表软粉网立场,转载请注明出处:https://www.rfff.net/p/903.html

作者: HUI

发表评论

您的电子邮箱地址不会被公开。

返回顶部