问题描述
我创建了2个spring-boot服务:慢服务和网关 slow-service 是一种服务,它可以反转字符串,但执行速度非常慢。
@Service
public class SlowReverseService implements ReverseService {
@Override
public String reverse(String message) {
StringBuilder builder = new StringBuilder(message);
try {
TimeUnit.SECONDS.sleep(30);
} catch (InterruptedException e) {
e.printstacktrace();
}
return builder.reverse().toString();
}
}
和控制器:
@RestController
public class SlowController {
private final ReverseService reverseService;
public SlowController(ReverseService reverseService) {
this.reverseService = reverseService;
}
@GetMapping(value = "/reverse/{message}")
public String reverseMessage(@PathVariable("message") String message){
return reverseService.reverse(message);
}
}
网关使用慢速服务并返回异步结果。
@Service
public class AsyncReverseService implements ReverseService {
@Async
@Override
public CompletableFuture<String> reverse(String message) {
RestTemplate restTemplate = new RestTemplate();
return CompletableFuture.completedFuture(
restTemplate.getForObject("http://localhost:8081/reverse/" + message,String.class));
}
}
和控制器:
@RestController
public class GatewayController {
private final ReverseService reverseService;
public GatewayController(ReverseService reverseService) {
this.reverseService = reverseService;
}
@GetMapping(value = "/reverse/{message}")
public CompletableFuture<String> reverseMessage(@PathVariable("message") String message) {
String name = Thread.currentThread().getName();
System.out.println(new Date() + ":" + name);
return reverseService.reverse(message);
}
}
我在网关的属性中设置此参数:server.tomcat.threads.max=2
我尝试向网关发送6个请求,并查看以下日志:
Thu Aug 13 10:59:28 MSK 2020:http-nio-8080-exec-1
Thu Aug 13 10:59:29 MSK 2020:http-nio-8080-exec-2
Thu Aug 13 10:59:58 MSK 2020:http-nio-8080-exec-1
Thu Aug 13 10:59:59 MSK 2020:http-nio-8080-exec-2
Thu Aug 13 11:00:28 MSK 2020:http-nio-8080-exec-1
Thu Aug 13 11:00:29 MSK 2020:http-nio-8080-exec-2
我的网关控制器收到2个请求,并将其发送到慢速服务。慢速服务工作30秒,然后将结果返回到网关。网关可以处理接下来的2个请求。网关每30秒可以处理2个请求。
我期望另一种行为:网关收到2个请求并将其委托给CompletableFuture。并释放线程。并且可以接收接下来的2个请求。连接增加,但我的2个线程始终可用。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)