RestTemplate和Feign的区别

RestTemplate和Feign的区别

前言:现在公司项目中用的是 RestTemplate 的调用方式,之前也接触过 Feign 的调用方式,现在就整理下有什么区别,如何选择。

一、基本概念

RestTemplate是Spring框架提供的用于调用REST API的客户端。它是一个线程安全的HTTP客户端,支持GET、POST、PUT、DELETE等HTTP请求,并且支持设置请求头信息。RestTemplate可以使用Java程序直接进行调用。例如,我们可以执行如下代码发送一个GET请求:

RestTemplate restTemplate = new RestTemplate();
String url = "http://localhost:8080/api/books";
ResponseEntity response = restTemplate.getForEntity(url, String.class);
System.out.println(response.getBody());

Feign是Netflix开源的一款HTTP客户端,它是一种声明式、模板化的HTTP客户端。Feign将HTTP请求定义为接口+注解的方式,并在运行时动态生成实现类进行调用。当开发人员调用定义的接口时,Feign会根据接口定义自动构造出HTTP请求,并使用底层的RestTemplate发送请求。一般情况下,我们无需编写底层代码,只需定义接口即可。例如,我们可以定义如下接口进行调用:

@FeignClient(name = "book-service")
public interface BookClient {
    @RequestMapping(method = RequestMethod.GET, value = "/api/books")
    List getBooks();
}

BookClient bookClient = Feign.builder()
                        .encoder(new GsonEncoder())
                        .decoder(new GsonDecoder())
                        .target(BookClient.class, "http://localhost:8080");
List books = bookClient.getBooks();
System.out.println(books);

二、RestTemplate 和 Feign 的实现方式

RestTemplate 是传统的HTTP客户端,它直接使用Java进行请求和响应的处理。因此,在使用时需要编写大量的底层代码,如错误处理、请求重试、超时控制等。RestTemplate可以使用Spring中提供的拦截器对请求和响应进行处理。

Feign 是基于注解的HTTP客户端。它让开发人员使用声明式的方式定义HTTP接口,而不是编写底层代码。Feign会根据接口定义自动生成请求,并使用底层的RestTemplate发送请求。所有底层操作都由Feign自动处理,只需要定义接口即可。同时,Feign也支持配置自定义的请求拦截器和异常处理器。

三、RestTemplate和Feign的使用场景

因为RestTemplate中需要开发人员自己编写底层代码,所以它更适合需要对HTTP请求进行复杂处理的情况,如自定义的请求拦截器、错误处理、请求重试等。同时,RestTemplate在请求和响应的处理上也具有更高的灵活性。

Feign则更适合定义简单且通用的接口。这些接口一般用于调用其他微服务,而无需考虑底层代码的具体实现细节。在微服务架构下,各个微服务之间需要频繁通信,这时Feign的高度抽象化特性就可以为更快的开发提供便利。

四、RestTemplate和Feign的性能对比

对于单次请求而言,RestTemplate和Feign的性能并无显著差异。但是,当我们需要进行高并发请求时,它们的性能表现会受到不同程度的影响。

因为RestTemplate是线程安全的,所以它可以在多线程环境下并发地处理请求,适合低并发的场景。而Feign则需要针对每个请求生成一个新的实例用于请求,每次请求都需要进行类加载和实例化,而这些操作对性能造成一定的影响,所以适合低、中等并发的场景。

五、RestTemplate和Feign的测试用例

RestTemplate测试用例:

@RunWith(SpringRunner.class)
@SpringBootTest
public class RestTemplateTest {

    @Autowired
    private RestTemplate restTemplate;

    @Test
    public void testGetBooks() {
        String url = "http://localhost:8080/api/books";
        ResponseEntity response = restTemplate.getForEntity(url, String.class);
        System.out.println(response.getBody());
    }
}

Feign测试用例:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class FeignTest {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private BookClient bookClient;

    @Test
    public void testGetBooks() throws Exception {
        mockMvc.perform(get("/api/books"))
                .andExpect(status().isOk());

        List books = bookClient.getBooks();
        System.out.println(books);
    }
}

六、总结

本篇文章对RestTemplate和Feign进行了详细的比较。总的来说,RestTemplate需要开发人员编写更多的底层代码,并且具有更高的灵活性;而Feign则提供了更方便的声明式HTTP调用方式,适合定义简单且通用的接口。对于性能而言,这两个HTTP客户端在并发操作上都有一定的性能限制。总体而言,选择哪个HTTP客户端取决于应用场景和需求。

你可能感兴趣的:(rpc,java,微服务,学习)