Skip to content

面试速答(先看这里)

**一句话结论:**Feign 是声明式的 HTTP 客户端, 允许你通过接口定义服务调用,Feign 自动实现 HTTP 请求的细节。

60秒标准回答:

Feign和RestRemplate都是用于在 Java 中进行 HTTP 请求的客户端,经常被拿来对比

RestTemplate是传统的 HTTP 客户端 ,提供了更多的灵活性,但需要手动编写 HTTP 请求的细节(如 URL、请求方法等)。你需要使用代码编写具体的 HTTP 请求,并手动处理响应

Feign 是声明式的 HTTP 客户端, 允许你通过接口定义服务调用,Feign 自动实现 HTTP 请求的细节。这种方式通常与 Spring Cloud 结合使用,可以简化微服务间的调用

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**Feign和RestRemplate都是用于在 Java 中进行 HTTP 请求的客户端,经常被拿来对比。
  • **要点2:**RestTemplate是传统的 HTTP 客户端 ,提供了更多的灵活性,但需要手动编写 HTTP 请求的细节(如 URL、请求方法等)。
  • **要点3:**用Feign的场景中,先通过@FeignClient来声明了一个HTTP服务接口,其中指明了方法、请求方式、url等信息。
  • **要点4:**相比之下,Feign 通过声明式接口定义,并自动处理 HTTP 请求的。
  • **要点5:**但是,Feign只能做内部的调用,因为要有人给你定义API和服务注册的提供。

**记忆锚点:**HTTP → Feign → RestTemplate → RestRemplate → FeignClient → 具直接调用对应的方法

加分表达:

  • 用Feign的场景中,先通过@FeignClient来声明了一个HTTP服务接口,其中指明了方法、请求方式、url等信息。

追问准备:

  • 围绕「HTTP」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「Feign」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「RestTemplate」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

Feign和RestRemplate都是用于在 Java 中进行 HTTP 请求的客户端,经常被拿来对比。

RestTemplate是传统的 HTTP 客户端,提供了更多的灵活性,但需要手动编写 HTTP 请求的细节(如 URL、请求方法等)。你需要使用代码编写具体的 HTTP 请求,并手动处理响应。

java
import org.springframework.web.client.RestTemplate;
import org.springframework.http.ResponseEntity;

public class RestTemplateExample {
    public static void main(String[] args) {
        RestTemplate restTemplate = new RestTemplate();
        String url = "https://api.example.com/data";
        
        // 发送 GET 请求
        ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
        System.out.println(response.getBody());
        
        // 发送 POST 请求
        String requestPayload = "{\"name\": \"John\"}";
        String responsePost = restTemplate.postForObject(url, requestPayload, String.class);
        System.out.println(responsePost);
    }
}

**Feign 是声明式的 HTTP 客户端,**允许你通过接口定义服务调用,Feign 自动实现 HTTP 请求的细节。这种方式通常与 Spring Cloud 结合使用,可以简化微服务间的调用。

用Feign的场景中,先通过@FeignClient来声明了一个HTTP服务接口,其中指明了方法、请求方式、url等信息。

java
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(name = "example-service", url = "https://api.example.com")
public interface ExampleClient {

    @GetMapping("/data")
    String getData();
}

这样在调用的时候,只需要用Feign的工具直接调用对应的方法即可:

java
@RestController
public class TestrController {
 
    @Autowired
    private ExampleClient exampleClient;
     
    @GetMapping("/getData")
    public String getData() {
        return exampleClient.getData();
    }
}

相比之下,Feign 通过声明式接口定义,并自动处理 HTTP 请求的。RestTemplate需要自己手动控制 HTTP 请求。 另外RestTemplate需要手动处理响应状态码、错误信息等。 Feign允许开发者自定义如何处理不同的 HTTP 错误响应。 而且Feign内置支持Ribbon等负载均衡,而RestTemplate需要做额外的配置。

但是,Feign只能做内部的调用,因为要有人给你定义API和服务注册的提供。而别人提供外部的HTTP接口的话,就只能用RestTemplate调用了,所以RestTemplate更加通用一些。