一、概要
我們通過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.Encoder 或 feign.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。 |