WebClient和RestTemplate

本文探讨了Spring框架中的RestTemplate与WebClient在处理HTTP请求时的阻塞与非阻塞模式,通过实例展示了两者在请求响应速度上的区别,以及WebClient如何利用异步任务处理机制提高效率。

RestTemplate是阻塞性客户端,每个事件都为一个线程,客户端在收到服务器响应前会一直被阻塞
WebClient是非阻塞性客户端,每个事件都为一个任务,Spring Reactive框架对任务进行队列处理,仅在收到响应时才执行对应的任务

Java实现

服务

 @GetMapping("/getAll")
    public Person server(String name) throws InterruptedException {
        System.out.println("Enter Server");
        Thread.sleep(2000);
        Person person = new Person(name, 25);
        System.out.println("Server finished");
        return person;
}

进入服务时打印服务开始,睡眠2秒且做一个无意义的操作模拟服务器处理数据,服务返回前打印服务结束

RestTemplate

@GetMapping("/RT")
    public String getRT() {
        System.out.println("Enter RTController+++++++++");
        RestTemplate restTemplate = new RestTemplate();
        Person person = restTemplate.getForObject("http://localhost:8080/getAll?name={name}", Person.class, "skye1");
        System.out.println("RTController Finished+++++++");
        return "true";
}

开始启用方法时打印进入方法,getForObject返回对象,getForEntity返回包含响应体的整个对象,离开方法时打印方法结束

WebClient

    @GetMapping("/WC")
    public String getWC() throws InterruptedException {
        System.out.println("Enter WCController--------");
        WebClient webClient = WebClient.builder()
                .baseUrl("http://localhost:8080")
                .build();
        webClient.get().uri(uriBuilder -> {
            uriBuilder = uriBuilder.path("/getAll");
            uriBuilder = uriBuilder.queryParam("name", "skye2");
            return uriBuilder.build();
        })
                .retrieve()
                .bodyToMono(Person.class).subscribe();
        System.out.println("WC finished---------");
        System.out.println("main thread sleep to wait for WC return");
        Thread.sleep(10000);
        System.out.println("wake up");
        return "true";
}

进入方法时打印进入方法,build webclient,发起get请求,使用subscribe异步获取响应(block则是同步阻塞式获取响应)
结束方法时打印方法结束,为了防止主线程关闭导致服务不执行,主线程睡眠10秒

控制台信息

RestTemplate

Enter RTController+++++++++
Enter Server
Server finished
RTController Finished+++++++

运行时可以明显感觉到停顿了2秒

WebClient

Enter WCController--------
WC finished---------
main thread sleep to wait for WC return
Enter Server
Server finished
wake up

先结束主方法,在主线程睡眠等待时,进入服务,10秒后唤醒

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

skye111321

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

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

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

打赏作者

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

抵扣说明:

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

余额充值