面试题:SpringBoot调用http服务几种方式
面试官:SpringBoot提供了哪些调用Http服务的方式呢?
我们来盘一盘Spring提供的调用Http服务的方式:
方式一:RestTemplate
RestTemplate默认的底层实现是JDK的HttpURLConnection。当然如果要支持负载均衡可以加上@Loadbalancer注解来实现,这样可以集成到注册中心通过服务名称来调用eureka或nacos上的服务。
方式二:Feign
Feign默认底层实现也是JDK的HttpURLConnection(当然可以换httpclient、okhttp),Feign默认就集成了Ribbon做负载,由于Ribbon的停更,新近的SpringBoot版本已经支掉Ribbon了换成spring自己的Loadbalancer。
方式三:WebClient
spring5后spring就建议使用响应式的WebClient作为Http的请求,WebClient也可以+@Loadbalancer来实现负载均衡。WebClient是响应式的
方式四:HttpInterfaces
SpringBoot3.x增加了@HttpInterfaces注解,它底层默认实现是WebClient当然为了支持负载也S可以自己加一下@Loadbalancer注解。
那问题来了,他们都能实现相同的功能,怎么选择呢?
- RestTemplate 使用 Java Servlet API,是同步、阻塞的方法。
- WebClient 是异步、非阻塞的,在等待响应返回时不会阻塞正在执行的线程。只有当响应就绪时,才会产生通知。相对阻塞的RestTemplate非阻塞的WebClient有一定优势,这也是后面spring官方也在推荐使用的。
感觉还是得看自己项目的需要,如果项目已经有了也能用,就不用去改变了;如果项目上有性能或者响应式的需要,可以考虑换一换,或者新项目尝试用一下新的;如果追求性能到是可以做个测试比较一下,感觉webclient会好点。@HttpInterfaces生态还没起来很多相应的中间件也还没起来,不过WebClient到是可以尝试下。个人感觉一个项目还是会存在以上几种的共存的状态。
不过有这疑问就是spring里有了RestTemplate 、WebClient、Feign这么多http客户端工具为什么还要出一个HttpInterfaces直接让Feign也集成WebClient不就可以了吗?希望知道答案的朋友分享下。