Feign 客户端是一种通过接口来定义 HTTP 请求的方式。与传统的通过 RestTemplate
或 HttpClient
手动编写 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);
}