Java中Feign的用法 詳解聲明式調(diào)用

feign 是一個(gè)聲明式的 web 服務(wù)客戶端,它允許開發(fā)者像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程服務(wù)。1. feign 的核心優(yōu)勢在于聲明式調(diào)用,通過定義接口并使用注解即可自動(dòng)生成實(shí)現(xiàn)類;2. 使用 feign 需要添加依賴、啟用 feign 客戶端并注入 feign 接口;3. 常用注解包括 @feignclient、@getmapping、@postmapping、@pathvariable、@requestbody 等;4. feign 支持配置日志級(jí)別、超時(shí)設(shè)置以及自定義配置類;5. feign 可集成 hystrix 或 resilience4j 實(shí)現(xiàn)服務(wù)降級(jí)與熔斷;6. 支持請(qǐng)求重試機(jī)制,可通過 spring retry 自定義重試策略;7. 文件上傳需添加額外依賴并使用 @requestpart 注解;8. 最佳實(shí)踐包括保持接口簡潔、使用 dto、處理異常、配置日志監(jiān)控、版本控制和進(jìn)行契約測試。

Java中Feign的用法 詳解聲明式調(diào)用

Feign,簡單來說,就是讓你可以像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程服務(wù)。它幫你處理了服務(wù)發(fā)現(xiàn)、請(qǐng)求構(gòu)建、序列化/反序列化等繁瑣的事情,讓你的代碼更簡潔易懂。聲明式調(diào)用是Feign的核心優(yōu)勢,你只需要定義一個(gè)接口,F(xiàn)eign 就會(huì)自動(dòng)生成實(shí)現(xiàn)類。

Java中Feign的用法 詳解聲明式調(diào)用

Feign的核心用法在于定義接口,并用注解來聲明遠(yuǎn)程服務(wù)的相關(guān)信息。

Java中Feign的用法 詳解聲明式調(diào)用

Feign接口的定義

首先,你需要?jiǎng)?chuàng)建一個(gè)接口,這個(gè)接口就代表了你要調(diào)用的遠(yuǎn)程服務(wù)。

立即學(xué)習(xí)Java免費(fèi)學(xué)習(xí)筆記(深入)”;

Java中Feign的用法 詳解聲明式調(diào)用

import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable;  @FeignClient(name = "user-service", url = "${user.service.url}") public interface UserServiceClient {      @GetMapping("/users/{id}")     User getUserById(@PathVariable("id") Long id); }
  • @FeignClient: 這個(gè)注解告訴 spring cloud,這是一個(gè) Feign 客戶端。
    • name: 指定了要調(diào)用的服務(wù)名稱(通常是服務(wù)注冊(cè)中心的名稱)。
    • url: 直接指定服務(wù)的 URL,可以覆蓋服務(wù)發(fā)現(xiàn)機(jī)制。
  • @GetMapping: 聲明了請(qǐng)求的 http 方法和路徑。
  • @PathVariable: 將方法參數(shù)映射到 URL 中的占位符。

如何在spring boot中使用Feign?

  1. 添加依賴: 在 pom.xml 中添加 Spring Cloud OpenFeign 的依賴。

    <dependency>     <groupId>org.springframework.cloud</groupId>     <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
  2. 啟用 Feign: 在 Spring Boot 啟動(dòng)類上添加 @EnableFeignClients 注解。

    import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.openfeign.EnableFeignClients;  @SpringBootApplication @EnableFeignClients public class MyApplication {      public static void main(String[] args) {         SpringApplication.run(MyApplication.class, args);     } }
  3. 注入 Feign 客戶端: 在需要調(diào)用遠(yuǎn)程服務(wù)的地方,直接注入你定義的 Feign 接口。

    import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;  @Service public class MyService {      @Autowired     private UserServiceClient userServiceClient;      public User getUser(Long id) {         return userServiceClient.getUserById(id);     } }

Feign的常用注解有哪些?

除了上面用到的 @FeignClient、@GetMapping 和 @PathVariable,還有一些其他的常用注解:

  • @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping: 對(duì)應(yīng)不同的 HTTP 方法。
  • @RequestBody: 將方法參數(shù)作為請(qǐng)求體發(fā)送。
  • @RequestHeader: 設(shè)置請(qǐng)求頭。
  • @RequestParam: 將方法參數(shù)作為查詢參數(shù)添加到 URL 中。

例如:

@FeignClient(name = "order-service") public interface OrderServiceClient {      @PostMapping("/orders")     Order createOrder(@RequestBody Order order, @RequestHeader("Authorization") String token);      @GetMapping("/orders")     List<Order> getOrders(@RequestParam("userId") Long userId); }

Feign的配置如何進(jìn)行?

Feign 的配置可以通過多種方式進(jìn)行:

  • application.yml/properties: 可以在配置文件中配置 Feign 的全局屬性,例如日志級(jí)別、重試機(jī)制等。

    feign:   client:     config:       default:         loggerLevel: full # 記錄所有請(qǐng)求和響應(yīng)的詳細(xì)信息         connectTimeout: 5000 # 連接超時(shí)時(shí)間         readTimeout: 5000 # 讀取超時(shí)時(shí)間
  • 自定義配置類: 可以創(chuàng)建自定義的配置類,用于覆蓋 Feign 的默認(rèn)配置。

    import feign.Logger; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;  @Configuration public class FeignConfig {      @Bean     Logger.Level feignLoggerLevel() {         return Logger.Level.FULL;     } }

    然后,在 @FeignClient 注解中指定配置類:

    @FeignClient(name = "user-service", configuration = FeignConfig.class) public interface UserServiceClient {     // ... }

Feign如何處理服務(wù)降級(jí)和熔斷?

服務(wù)降級(jí)和熔斷是微服務(wù)架構(gòu)中重要的容錯(cuò)機(jī)制。 Feign 可以與 Hystrix 或 Resilience4j 等框架集成,實(shí)現(xiàn)服務(wù)降級(jí)和熔斷。

  1. 集成 Hystrix: 首先,添加 Hystrix 的依賴。

    <dependency>     <groupId>org.springframework.cloud</groupId>     <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>

    然后在 application.yml 中啟用 Hystrix:

    feign:   hystrix:     enabled: true

    最后,在 @FeignClient 注解中指定 fallback 類:

    import org.springframework.stereotype.Component;  @FeignClient(name = "user-service", fallback = UserServiceClientFallback.class) public interface UserServiceClient {     @GetMapping("/users/{id}")     User getUserById(@PathVariable("id") Long id); }  @Component class UserServiceClientFallback implements UserServiceClient {     @Override     public User getUserById(Long id) {         // 返回默認(rèn)值或執(zhí)行其他降級(jí)邏輯         return new User(id, "Default User", "default@example.com");     } }
  2. 集成 Resilience4j: Resilience4j 是一個(gè)輕量級(jí)的容錯(cuò)庫,也可以與 Feign 集成。 具體步驟可以參考 Resilience4j 的官方文檔。

Feign如何進(jìn)行請(qǐng)求重試?

Feign 默認(rèn)情況下會(huì)進(jìn)行請(qǐng)求重試,可以通過配置來調(diào)整重試策略。

  • 使用 Spring Retry: Spring Retry 提供了更強(qiáng)大的重試機(jī)制,可以與 Feign 集成。 首先,添加 Spring Retry 的依賴。

    <dependency>     <groupId>org.springframework.retry</groupId>     <artifactId>spring-retry</artifactId> </dependency> <dependency>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-aop</artifactId> </dependency>

    然后,創(chuàng)建一個(gè)重試配置類:

    import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.retry.annotation.EnableRetry; import org.springframework.retry.backoff.FixedBackOffPolicy; import org.springframework.retry.policy.SimpleRetryPolicy; import org.springframework.retry.support.RetryTemplate;  @Configuration @EnableRetry public class RetryConfig {      @Bean     public RetryTemplate retryTemplate() {         RetryTemplate retryTemplate = new RetryTemplate();          FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy();         fixedBackOffPolicy.setBackOffPeriod(1000); // 重試間隔 1 秒         retryTemplate.setBackOffPolicy(fixedBackOffPolicy);          SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();         retryPolicy.setMaxAttempts(3); // 最大重試次數(shù)         retryTemplate.setRetryPolicy(retryPolicy);          return retryTemplate;     } }

    最后,在 Feign 客戶端中使用 RetryTemplate:

    import org.springframework.beans.factory.annotation.Autowired; import org.springframework.retry.support.RetryTemplate; import org.springframework.stereotype.Component;  @FeignClient(name = "user-service") public interface UserServiceClient {      @GetMapping("/users/{id}")     User getUserById(@PathVariable("id") Long id); }  @Component class UserServiceClientWrapper {      @Autowired     private UserServiceClient userServiceClient;      @Autowired     private RetryTemplate retryTemplate;      public User getUserByIdWithRetry(Long id) {         return retryTemplate.execute(context -> userServiceClient.getUserById(id));     } }

如何在Feign中處理文件上傳?

Feign 也可以用于文件上傳,需要進(jìn)行一些額外的配置。

  1. 添加依賴: 添加 Spring Cloud OpenFeign 的文件上傳支持依賴。

    <dependency>     <groupId>io.github.openfeign.form</groupId>     <artifactId>feign-form-spring</artifactId>     <version>3.8.0</version> </dependency>
  2. 定義 Feign 接口: 使用 @RequestPart 注解來處理文件上傳。

    import org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.multipart.MultipartFile;  @FeignClient(name = "file-service") public interface FileServiceClient {      @PostMapping(value = "/files/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)     String uploadFile(@RequestPart("file") MultipartFile file); }
  3. 配置 MultipartResolver: 在 Spring Boot 中配置 MultipartResolver。

    import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.multipart.MultipartResolver; import org.springframework.web.multipart.commons.CommonsMultipartResolver;  @Configuration public class MultipartConfig {      @Bean     public MultipartResolver multipartResolver() {         CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();         multipartResolver.setMaxUploadSize(10000000); // 最大上傳大小         return multipartResolver;     } }

Feign的最佳實(shí)踐有哪些?

  • 保持接口簡潔: Feign 接口應(yīng)該只包含必要的遠(yuǎn)程調(diào)用方法,避免過度設(shè)計(jì)。
  • 使用 DTO: 使用數(shù)據(jù)傳輸對(duì)象 (DTO) 來封裝請(qǐng)求和響應(yīng)數(shù)據(jù),避免直接暴露內(nèi)部實(shí)體。
  • 處理異常: 在 Feign 客戶端中處理遠(yuǎn)程調(diào)用可能發(fā)生的異常,例如網(wǎng)絡(luò)錯(cuò)誤、服務(wù)不可用等。
  • 監(jiān)控和日志: 配置 Feign 的日志級(jí)別,以便監(jiān)控遠(yuǎn)程調(diào)用的性能和錯(cuò)誤。
  • 版本控制: 對(duì) Feign 接口進(jìn)行版本控制,以便在遠(yuǎn)程服務(wù)發(fā)生變化時(shí)進(jìn)行兼容。
  • 契約測試: 使用如Spring Cloud Contract等工具進(jìn)行契約測試,確保Feign客戶端和服務(wù)端之間的接口一致性。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊11 分享