spring boot webflux webclient 应该何如正确使用?

opabinia 发布于 2020/07/01 21:47
阅读 219
收藏 0

我再尝试使用webclient,因为restTemplate已经进入维护,但是有些细节不太了解,我写了一个简单的例子:

参考链接: https://spring.io/guides/gs/reactive-rest-service/

代码结构:

 

有一个test的入口  WebClientTestController 

@RestController
@RequestMapping("/test")
public class WebClientTestController {

  private final WebClient webClient;

  public WebClientTestController(WebClient webClient) {
    this.webClient = webClient;
  }

  @GetMapping
  public Mono<Object> main() {

    new SimpleAsyncTaskExecutor()
        .execute(
            () -> {
              for (int i = 0; i <= 65536; ++i) {
                System.out.println(
                    webClient
                            .get()
                            .uri("http://127.0.0.1:8080/hello")
                            .retrieve()
                            .bodyToMono(String.class)
                            .block()
                        + i);
              }
            });

    return Mono.empty();
  }
}

appConfig

@Configuration
public class AppConfig {
  @Bean
  public WebClient webClient(WebClient.Builder builder) throws SSLException {
    final SslContext sslContext =
        SslContextBuilder.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE).build();
    HttpClient httpClient =
        HttpClient.create().secure(sslContextSpec -> sslContextSpec.sslContext(sslContext));

    return builder.clientConnector(new ReactorClientHttpConnector(httpClient)).build();
  }
}

我再window上启动并访问: curl http://127.0.0.1:8080/test

可以得到正常输出:

 

一样的代码,我再linux上测试,得到错误:

请求成功的数量 ≈ ulimit -n

我想知道webclient的使用注意事项以及原理细节,为什么在linux上,这样用会每次请求打开一个sockt直到请求失败?

期望能得到回复,感谢~

加载中
0

System.out.println( webClient .get() .uri("http://127.0.0.1:8080/hello") .retrieve() .bodyToMono(String.class) .block() + i);

改成

webClient
.get()
.uri("http://127.0.0.1:8080/hello")
.retrieve()
.bodyToMono(String.class)
.subscribe(System.out::println)

试试

 

回复 @opabinia : 在reactor体系下是拒绝阻塞的
opabinia
opabinia
回复 @麒 : 谢谢,业务处理我换回restTemplate了,这次主要是想尝试下用这个替换,我要再找找相关webclient使用的原理细节瞅瞅,学习下
回复 @opabinia : 在webflux中用 block 肯定是有问题的,把你原始业务发出来,我看看怎么修改
opabinia
opabinia
尝试是想替换restTemplate,所以应该用block,另外,就算是换成异步订阅,结果是一样的会报错,还会丢数据(因为请求线程结束了),不理解他为什么每次请求开线程,并且不关闭,底层逻辑实现不清楚:sweat:
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部