Spring Cloud Alibaba-Feign-基礎(chǔ)

一、概要

我們通過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.Encoderfeign.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。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末威酒,一起剝皮案震驚了整個(gè)濱河市窑睁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌葵孤,老刑警劉巖担钮,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異尤仍,居然都是意外死亡裳朋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門吓著,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人送挑,你說我怎么就攤上這事绑莺。” “怎么了惕耕?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵纺裁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我司澎,道長(zhǎng)欺缘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任挤安,我火速辦了婚禮谚殊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蛤铜。我一直安慰自己嫩絮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布围肥。 她就那樣靜靜地躺著剿干,像睡著了一般。 火紅的嫁衣襯著肌膚如雪穆刻。 梳的紋絲不亂的頭發(fā)上置尔,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音氢伟,去河邊找鬼榜轿。 笑死幽歼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的差导。 我是一名探鬼主播试躏,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼设褐!你這毒婦竟也來了颠蕴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤助析,失蹤者是張志新(化名)和其女友劉穎犀被,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體外冀,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寡键,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雪隧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片西轩。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖脑沿,靈堂內(nèi)的尸體忽然破棺而出藕畔,到底是詐尸還是另有隱情,我是刑警寧澤庄拇,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布注服,位于F島的核電站,受9級(jí)特大地震影響措近,放射性物質(zhì)發(fā)生泄漏溶弟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一瞭郑、第九天 我趴在偏房一處隱蔽的房頂上張望辜御。 院中可真熱鬧,春花似錦屈张、人聲如沸我抠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽菜拓。三九已至,卻和暖如春笛厦,著一層夾襖步出監(jiān)牢的瞬間纳鼎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贱鄙,地道東北人劝贸。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像逗宁,于是被迫代替她去往敵國(guó)和親映九。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容