Spring Cloud Alibaba-Feign-基礎

一、概要

我們通過RestTemplate調用其它服務的API時,所需要的參數(shù)須在請求的URL中進行拼接,如果參數(shù)少的話或許我們還可以忍受,一旦有多個參數(shù)的話,這時拼接請求字符串就會效率低下,維護起來也比較麻煩
有沒有跟優(yōu)雅的方式來解決這樣的問題,Feign

什么是Feign?

Feign是Netflix開發(fā)的聲明式、模板化的HTTP客戶端, Feign可以幫助我們更快捷、優(yōu)雅地調用HTTP API。
簡單的來說就是一個遠程調用服務的框架/工具,讓開發(fā)者以更少耦合更少代碼更快更兼容的方法進行遠程服務調用

Feign功能

  • 可插拔的注解支持,包括Feign注解和JAX-RS注解;
  • 支持Hystrix和它的Fallback;
  • 支持可插拔的HTTP編碼器和解碼器;
  • 支持Ribbon的負載均衡;
  • 支持HTTP請求和響應的壓縮。

二、基本使用

創(chuàng)建cloud-nacos-feign項目

添加依賴

父pom文件

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>${spring-cloud.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-alibaba-dependencies</artifactId>
      <version>${spring-cloud-alibaba-dependencies.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

子pom文件

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

配置文件

server:
  port: 8090
spring:
  application:
    name: nacos-feign-example
  cloud:
    nacos:
      discovery:
        server-addr: 112.74.42.138:8848

開啟注冊發(fā)現(xiàn)

@SpringBootApplication
@EnableFeignClients
public class NacosFeignApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosFeignApplication.class, args);
    }
}

調用服務

Service層

@FeignClient("nacos-server-provider")
public interface FeignExampleService {
    @RequestMapping(method = RequestMethod.GET, value = "/")
    String getData();
}

Controller層

@RestController
public class FeignExampleController {
    @Resource
    FeignExampleService service;
    @RequestMapping("/")
    public String hello() {
        String s = service.getData();
        return s;
    }
}

三、調試測試

檢查后臺注冊

image

調用服務服務接口

image

四、詳解

@EnableFeignClients

源碼

public @interface EnableFeignClients {
    String[] value() default {};
    String[] basePackages() default {};
    Class<?>[] basePackageClasses() default {};
    Class<?>[] defaultConfiguration() default {};
    Class<?>[] clients() default {};

屬性說明

屬性 說明
String[] value() 包路徑。比如 com.sbc.service,會掃描這個包路徑下帶有 @FeignClient 注解的類并處理
String[] basePackages()
Class<?>[] basePackageClasses() 跟 basePackages 作用一致,basePackages 是個 String 數(shù)組,而 basePackageClasses 是個 Class 數(shù)組,用于掃描這些類對應的 package
Class<?>[] defaultConfiguration() 默認的配置類,對于所有的 Feign Client,這些配置類里的配置都會對它們生效,可以在配置類里構造 feign.codec.Decoder, feign.codec.Encoderfeign.Contract 等bean;
Class<?>[] clients() 注解修飾的類集合,如果指定了該屬性,那么掃描功能相關的屬性就是失效。比如 value、basePackages 和 basePackageClasses

@FeignClient

源碼

public @interface FeignClient {
    @AliasFor("name")
    String value() default "";
    @Deprecated
    String serviceId() default "";
    String contextId() default "";
    @AliasFor("value")
    String name() default "";
    String qualifier() default "";
    String url() default "";
    boolean decode404() default false;
    Class<?>[] configuration() default {};
    Class<?> fallback() default void.class;
    Class<?> fallbackFactory() default void.class;
    String path() default "";
    boolean primary() default true;

屬性說明

屬性 說明
String value() 提供服務的名稱
String name() 跟 value 屬性作用一致
String qualifier() 給 FeignClient 設置 @Qualifier 注解
String url() 絕對路徑,用于替換服務名。優(yōu)先級比服務名高。
boolean decode404() 默認是 false,表示對于一個 http status code 為 404 的請求是否需要進行 decode,默認不進行 decode,當成一個異常處理。設置為true之后,遇到 404 的 response 還是會解析 body
Class<?>[] configuration() 對于單個 FeignClient 的配置,而 @EnableFeignClients 里的 defaultConfiguration 屬性是作用域全局的,針對所有的 FeignClient
Class<?> fallback() 表示 fallback 類,需要實現(xiàn) FeignClient 對應的接口,當調用方法發(fā)生異常的時候會調用這個 Fallback 類對應的 FeignClient 接口方法
Class<?> fallbackFactory() 表示生產 fallback 類的 Factory,可以實現(xiàn) feign.hystrix.FallbackFactory 接口,FallbackFactory 內部會針對一個 Throwable 異常返回一個 Fallback 類進行 fallback 操作
String path() 請求路徑
boolean primary() 默認是 true,表示當前這個 FeignClient 生成的 bean 是否是 primary。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容