一、概要
我們通過RestTemplate調(diào)用其它服務(wù)的API時(shí),所需要的參數(shù)須在請(qǐng)求的URL中進(jìn)行拼接罪佳,如果參數(shù)少的話或許我們還可以忍受,一旦有多個(gè)參數(shù)的話黑低,這時(shí)拼接請(qǐng)求字符串就會(huì)效率低下,維護(hù)起來也比較麻煩
有沒有跟優(yōu)雅的方式來解決這樣的問題赘艳,Feign
什么是Feign?
Feign是Netflix開發(fā)的聲明式、模板化的HTTP客戶端克握, Feign可以幫助我們更快捷蕾管、優(yōu)雅地調(diào)用HTTP API。
簡(jiǎn)單的來說就是一個(gè)遠(yuǎn)程調(diào)用服務(wù)的框架/工具菩暗,讓開發(fā)者以更少耦合更少代碼更快更兼容的方法進(jìn)行遠(yuǎn)程服務(wù)調(diào)用
Feign功能
- 可插拔的注解支持掰曾,包括Feign注解和JAX-RS注解;
- 支持Hystrix和它的Fallback;
- 支持可插拔的HTTP編碼器和解碼器;
- 支持Ribbon的負(fù)載均衡;
- 支持HTTP請(qǐng)求和響應(yīng)的壓縮。
二停团、基本使用
創(chuàng)建cloud-nacos-feign項(xiàng)目
添加依賴
父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
開啟注冊(cè)發(fā)現(xiàn)
@SpringBootApplication
@EnableFeignClients
public class NacosFeignApplication {
public static void main(String[] args) {
SpringApplication.run(NacosFeignApplication.class, args);
}
}
調(diào)用服務(wù)
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;
}
}
三旷坦、調(diào)試測(cè)試
檢查后臺(tái)注冊(cè)
image
調(diào)用服務(wù)服務(wù)接口
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 秒梅,會(huì)掃描這個(gè)包路徑下帶有 @FeignClient 注解的類并處理 |
String[] basePackages() | |
Class<?>[] basePackageClasses() | 跟 basePackages 作用一致,basePackages 是個(gè) String 數(shù)組舌胶,而 basePackageClasses 是個(gè) Class 數(shù)組捆蜀,用于掃描這些類對(duì)應(yīng)的 package |
Class<?>[] defaultConfiguration() | 默認(rèn)的配置類,對(duì)于所有的 Feign Client辆琅,這些配置類里的配置都會(huì)對(duì)它們生效漱办,可以在配置類里構(gòu)造 feign.codec.Decoder , feign.codec.Encoder 或 feign.Contract 等bean; |
Class<?>[] clients() | 注解修飾的類集合,如果指定了該屬性婉烟,那么掃描功能相關(guān)的屬性就是失效娩井。比如 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() | 提供服務(wù)的名稱 |
String name() | 跟 value 屬性作用一致 |
String qualifier() | 給 FeignClient 設(shè)置 @Qualifier 注解 |
String url() | 絕對(duì)路徑似袁,用于替換服務(wù)名洞辣。優(yōu)先級(jí)比服務(wù)名高。 |
boolean decode404() | 默認(rèn)是 false昙衅,表示對(duì)于一個(gè) http status code 為 404 的請(qǐng)求是否需要進(jìn)行 decode扬霜,默認(rèn)不進(jìn)行 decode,當(dāng)成一個(gè)異常處理而涉。設(shè)置為true之后著瓶,遇到 404 的 response 還是會(huì)解析 body |
Class<?>[] configuration() | 對(duì)于單個(gè) FeignClient 的配置,而 @EnableFeignClients 里的 defaultConfiguration 屬性是作用域全局的啼县,針對(duì)所有的 FeignClient |
Class<?> fallback() | 表示 fallback 類材原,需要實(shí)現(xiàn) FeignClient 對(duì)應(yīng)的接口沸久,當(dāng)調(diào)用方法發(fā)生異常的時(shí)候會(huì)調(diào)用這個(gè) Fallback 類對(duì)應(yīng)的 FeignClient 接口方法 |
Class<?> fallbackFactory() | 表示生產(chǎn) fallback 類的 Factory,可以實(shí)現(xiàn) feign.hystrix.FallbackFactory 接口余蟹,FallbackFactory 內(nèi)部會(huì)針對(duì)一個(gè) Throwable 異常返回一個(gè) Fallback 類進(jìn)行 fallback 操作 |
String path() | 請(qǐng)求路徑 |
boolean primary() | 默認(rèn)是 true卷胯,表示當(dāng)前這個(gè) FeignClient 生成的 bean 是否是 primary。 |