Feign 客户端是一种通过接口来定义 HTTP 请求的方式。与传统的通过 RestTemplateHttpClient 手动编写 HTTP 请求代码不同,Feign 允许你通过简单的接口方法和注解来描述 HTTP 请求,Spring 会自动将这些接口映射到实际的 HTTP 请求。

可以作为工具类被其他微服务调用,进而写服务间沟通时更方便些。

@EnableFeignClients

添加到某个微服务的启动类上时就会在该微服务springboot应用中启用 Feign 功能。

@EnableFeignClients(basePackages = {"xyz.kbws.ojbackendserviceclient.service"})

它会触发 Feign 客户端的自动配置,使得 Spring Boot 应用能够扫描指定包(basePackage参数)中的接口,并为这些接口生成代理类,代理类会自动处理 HTTP 请求的细节。

Spring 会为这些接口自动创建代理对象,当你调用接口的方法时,Feign 会自动将其转化为对应的 HTTP 请求,发送给远程服务。

@FeignClient

@EnableFeignClients 是用于微服务来启用 Feign 功能,则 @FeignClient 就是写具体客户端的功能来供微服务使用,来指定该接口对应的远程服务名称,以及其他一些配置信息:

@FeignClient(name = "oj-backend-service")  // 指定远程服务名称
public interface BackendServiceClient {
 
    @GetMapping("/api/user/{id}")
    User getUser(@PathVariable("id") Long id);
}

BackendServiceClient 接口是一个 Feign 客户端,@FeignClient(name = "oj-backend-service") 表示它将会调用名为 oj-backend-service 的服务,方法 getUser 则对应了一个 RESTful API 的 GET 请求。

实例:

@FeignClient(name = "oj-backend-question-service", path = "/api/question/inner")  
public interface QuestionFeignClient {  
  
    @GetMapping("/get/id")  
    Question getQuestionById(@RequestParam("questionId") long questionId);  
  
    @GetMapping("/question_submit/get/id")  
    QuestionSubmit getQuestionSubmitById(@RequestParam("questionSubmitId") long questionSubmitId);  
  
    @PostMapping("/question_submit/update")  
    boolean updateQuestionSubmit(@RequestBody QuestionSubmit questionSubmit);  
  
    @PostMapping("/question/save")  
    boolean updateQuestion(@RequestBody Question question);  
  
    @PostMapping("/question/sendMsg")  
    void sendMsg(@RequestBody Notice notice);  
}