【开发经验】为什么gateWay网关要用webFlux代替WebMvc

      看过gateWay源码的都知道,它的底层使用的WebFlux。
     WebFlux会比传统的MVC更快?如果是这样,为什么平时开发不用这个?带着这个疑惑我翻了大把的资料,全是异步编程,全是快,异步等。但是一个机器的资源就这么多,它又是如何更快的呢?如果快的话,为什么平时没人用呢?通过如下这个案例,来说一下我的理解。

测试案例1

设置当前服务工作线程数为1,通过普通的同步写法,请求到接口。

 public static void main(String[] args) {
       // 设置当前工作线程为1.
        System.setProperty("reactor.netty.ioWorkerCount","1");
        SpringApplication.run(GatewayApplication.class, args);
    }
    @GetMapping("/test3")
    public String stringMono3(){
        logger.info("threadName:{}",Thread.currentThread().getName());
        return  "1";
    }
    @GetMapping("/test4")
    public String stringMono4(){
         logger.info("threadName:{}",Thread.currentThread().getName());
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return  "1";
    }

快速的请求test4test3接口(保证先请求test4)日志如下:

2022-11-11 11:23:01.697  INFO 61844 --- [ctor-http-nio-1] c.m.gateway.handler.FollBackController   : threadName:reactor-http-nio-1
2022-11-11 11:23:11.704  INFO 61844 --- [ctor-http-nio-1] c.m.gateway.handler.FollBackController   : threadName:reactor-http-nio-1

        仔细观察日志打印时间,可以看出当只有一个线程的时候,test4通过sleep方法让线程休眠,在休眠期间,该线程不做任何事情,导致请求test3接口时,也会等待很久。

        这样可以想到,在真实场景中,如果有太多的这种阻塞操作,大量的线程在等待,会大量浪费计算机资源。能不能有一种方式,不让其等待呢?好比这个人没事的时候,就去干会别的活呢?

测试案例2

    @GetMapping("/test2")
    public Mono<String> stringMono2(){
        Mono<String> log = WebClient.create().post().uri("http://localhost:8080/test/sleep10").retrieve().bodyToMono(String.class);
        logger.info("threadName:{}",Thread.currentThread().getName());
        return  log;
    }
    @GetMapping("/test3")
    public String stringMono3(){
        logger.info("threadName:{}",Thread.currentThread().getName());
        return  "1";
    }

通过reactor来测试阻塞代码块。

  1. test2接口为请求一个响应时长为10秒的接口。然后打印线程名
  2. test3为直接打印线程名。

快速请求两个接口。日志打印如下:

2022-11-11 16:31:11.611  INFO 27436 --- [ctor-http-nio-1] c.m.gateway.handler.FollBackController   : threadName:reactor-http-nio-1
2022-11-11 16:31:12.797  INFO 27436 --- [ctor-http-nio-1] c.m.gateway.handler.FollBackController   : threadName:reactor-http-nio-1

        从日志打印可以看出,线程1,在执行test/sleep10接口时,还执行了test3的方法。这就是非阻塞的概念。当线程进入等待状态时(如:http接口响应等待),可以做其它的事情。这样就可以用少量的线程做更多的事。

问题:为什么reactor这么好,不用他代替mvc模式呢?

        个人以为,有两点原因。第一,一般我们的服务可以分为io密集型和cpu密集型。reactor模型在IO密集可以发挥出其优势。如网关,细想,gateway网关大部分都是在等待响应然后发挥,线程大把的时间处于等待,因此通过reactor编程可以更好的发挥其性能。第二,reactor学习成本高,不方便调试,用此框架时,需要多并发编程、nio等内容熟悉。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叁滴水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值