Spring Cloud Feign的兩種使用姿勢(shì)

Profile

概述

最近結(jié)合一些別人的開源項(xiàng)目來學(xué)習(xí)Spring Cloud茴恰,其中關(guān)于服務(wù)消費(fèi)這方面的一個(gè)很便利的工具 Feign讓我記憶頗深。雖然網(wǎng)上的Demo和例子不勝枚舉澡为,但大多比較分散升筏,本文就來集中記錄一下聲明式客戶端 Feign的一些使用姿勢(shì)。

注: 本文首發(fā)于 博客 CodeSheep · 程序羊帆吻,歡迎光臨 小站

下文就結(jié)合例子來記錄這一過程蜕依,代碼在文尾處桅锄。


創(chuàng)建基于 Eureka的服務(wù)注冊(cè)中心

三個(gè)步驟即可搞定:

  • 建工程

創(chuàng)建一個(gè)名為 eureka_server的 SpringBoot工程琉雳,并在pom.xml中添加好對(duì)應(yīng)依賴

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
  • 改主類

修改應(yīng)用主類样眠,添加 @EnableEurekaServer注解

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}
  • 加配置

配置 application.properties 文件如下所示:

spring.application.name=eureka-server
server.port=1111

eureka.instance.hostname=localhost

#默認(rèn)設(shè)置下,服務(wù)注冊(cè)中心自己也會(huì)將自己作為客戶端來嘗試注冊(cè)它自己翠肘,所以我們需要禁用它的客戶端注冊(cè)行為
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
  • 啟動(dòng)服務(wù)注冊(cè)中心

瀏覽器訪問之:

瀏覽器訪問服務(wù)注冊(cè)中心

此時(shí)還沒有任何服務(wù)注冊(cè)上來檐束。


創(chuàng)建服務(wù)提供者

  • 建工程

創(chuàng)建一個(gè)名為 service_provider的 SpringBoot工程,并在pom.xml中添加好對(duì)應(yīng)依賴:

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
  • 改主類

添加 @EnableDiscoveryClient注解

@EnableDiscoveryClient
@SpringBootApplication
public class ServiceProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceProviderApplication.class, args);
    }
}
  • 添加控制器 DateServiceController

提供一個(gè)Restful接口而已束倍,該接口的作用是獲取服務(wù)器上的時(shí)間并返回

@RestController
public class DateServiceController {

    @RequestMapping( value = "/test", method = RequestMethod.GET )
    public String test( @RequestParam String param ){
        return "hello " + param;
    }
}
  • 配置 application.properties文件
spring.application.name=service_provider
server.port=1112
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
  • 啟動(dòng)工程

瀏覽器訪問服務(wù)注冊(cè)中心被丧,我們發(fā)現(xiàn)服務(wù)提供者 service_provider已經(jīng)注冊(cè)到 eureka_server上:

服務(wù)提供者已注冊(cè)上來了

同時(shí)瀏覽器訪問:http://localhost:1112/test?param=www.codesheep.cn盟戏,可以測(cè)試服務(wù)提供 service_provider提供的接口工作正常

測(cè)試發(fā)現(xiàn)服務(wù)提供者的接口工作正常

接下來我們創(chuàng)建服務(wù)消費(fèi)者,是 Feign該登場(chǎng)的時(shí)候了甥桂!


創(chuàng)建基于 Feign的服務(wù)消費(fèi)者

  • 創(chuàng)建一個(gè)名為 service_consumer的 SpringBoot工程柿究,并在pom.xml中添加好對(duì)應(yīng)依賴
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
  • 修改應(yīng)用主類

主要是添加有關(guān) Feign客戶端的一些注解而已

@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class ServiceConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceConsumerApplication.class, args);
    }
}
  • 創(chuàng)建一個(gè) Feign客戶端的接口:DateServiceFeignClientInterface

很明顯其內(nèi)部用 @FeignClient( value = "service-provider" ) 聲明的方式指向了 服務(wù)提供者,而接口方法則實(shí)現(xiàn)了對(duì) 服務(wù)提供者接口的實(shí)際調(diào)用

@FeignClient( value = "service-provider" )
public interface DateServiceFeignClientInterface {

    @GetMapping("/test")
    String consumer( @RequestParam("param") String param );
}
  • 創(chuàng)建控制器:DateServiceFeignController

注意黄选,這是服務(wù)消費(fèi)者提供的 Rest接口

@RestController
@RequestMapping("/consumer")
public class DateServiceFeignController {

    @Resource
    DateServiceFeignClientInterface dateServiceFeignClientInterface;

    @GetMapping("/date")
    public String getDate( @RequestParam String param ) {
        return dateServiceFeignClientInterface.consumer( param );
    }
}
  • 配置 application.properties
spring.application.name=service-consumer
server.port=1113

eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
  • 啟動(dòng)服務(wù)消費(fèi)者

我們先去服務(wù)注冊(cè)中心上看看蝇摸,發(fā)現(xiàn) 服務(wù)消費(fèi)者也注冊(cè)上來了:

服務(wù)消費(fèi)者已注冊(cè)上來

然后我們?yōu)g覽器訪問 服務(wù)消費(fèi)者提供的Rest接口: http://localhost:1113/consumer/date?param=www.codesheep.cn

數(shù)據(jù)成功取回

這樣我們就通過 服務(wù)消費(fèi)者的 Feign客戶端 取到了服務(wù)提供者 給予的接口數(shù)據(jù)。

上面這就是聲明式客戶端 Feign的第一種使用姿勢(shì)办陷,也是常用的手法貌夕,常見于很多Demo

下面我們來實(shí)踐一下關(guān)于 Feign的繼承與實(shí)現(xiàn)機(jī)制,發(fā)現(xiàn)其使用更加靈活( Feign支持接口繼承方式快速生成客戶端民镜,頗有點(diǎn)RPC的意思(關(guān)于RPC的實(shí)踐可以參考我的文章:《RPC框架實(shí)踐之:Google gRPC》啡专、《RPC框架實(shí)踐之:Apache Thrift》) )


抽象出一個(gè)公共的 API服務(wù)

  • 創(chuàng)建一個(gè)普通 Maven項(xiàng)目:service_provider_api

  • 創(chuàng)建一個(gè)公共接口:DateService

public interface DateService {
    @GetMapping("/api/test")
    String consumer( @RequestParam("param") String param );
}

改造之前的 服務(wù)提供者 / 消費(fèi)者項(xiàng)目

  • 在服務(wù)消費(fèi)者 service_consumer項(xiàng)目中添加一個(gè)新的Feign的客戶端接口
@FeignClient( value = "service-provider" )
public interface DateServiceFeignClientInterface2 extends DateService {
}
  • 并且在 service_consumer項(xiàng)目中添加一個(gè)新的控制器 DateServiceFeignController2
@RestController
@RequestMapping("/consumer2")
public class DateServiceFeignController2 {

    @Resource
    DateServiceFeignClientInterface2 dateServiceFeignClientInterface2;

    @GetMapping("/date")
    public String getDate( @RequestParam String param ) {
        return dateServiceFeignClientInterface2.consumer( param );
    }
}
  • 在服務(wù)提供者 service_provider項(xiàng)目中來實(shí)現(xiàn)我們?cè)诠瞐pi項(xiàng)目 service_provider_api中的 DateService接口,賦予實(shí)際邏輯
@RestController
public class DateServiceController2 implements DateService {

    @Override
    public String consumer( @RequestParam String param) {
        Date now = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("今天是"+"yyyy年MM月dd日 E kk點(diǎn)mm分" );
        String nowTime = simpleDateFormat.format( now );
        return "hello again " + param + ", " + nowTime;
    }
}
  • 依次將 eureka_server制圈、service_provider们童、service_consumer 三個(gè)項(xiàng)目分別啟動(dòng)

瀏覽器訪問:http://localhost:1113/consumer2/date?param=www.codesheep.cn

成功實(shí)現(xiàn)服務(wù)調(diào)用

使用 feign的繼承特性時(shí),可以將服務(wù)接口的定義從服務(wù)消費(fèi)者中剝離出去离唐,形成獨(dú)立的api項(xiàng)目從而可以很方便的實(shí)現(xiàn)接口定義和依賴的共享病附,不用再復(fù)制粘貼接口進(jìn)行綁定,當(dāng)然這種做法存在的問題就是可能會(huì)導(dǎo)致服務(wù)提供者和服務(wù)消費(fèi)者間的耦合度增高亥鬓,此時(shí)如果服務(wù)提供者修改了一個(gè)接口定義完沪,服務(wù)消費(fèi)者可能也得跟著變,進(jìn)而帶來一些坑嵌戈。



后 記

由于能力有限覆积,若有錯(cuò)誤或者不當(dāng)之處,還請(qǐng)大家批評(píng)指正熟呛,一起學(xué)習(xí)交流宽档!

本文實(shí)驗(yàn)代碼在此



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市庵朝,隨后出現(xiàn)的幾起案子吗冤,更是在濱河造成了極大的恐慌,老刑警劉巖九府,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件椎瘟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡侄旬,警方通過查閱死者的電腦和手機(jī)肺蔚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來儡羔,“玉大人宣羊,你說我怎么就攤上這事璧诵。” “怎么了仇冯?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵之宿,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我苛坚,道長(zhǎng)澈缺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任炕婶,我火速辦了婚禮姐赡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘柠掂。我一直安慰自己项滑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布涯贞。 她就那樣靜靜地躺著枪狂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宋渔。 梳的紋絲不亂的頭發(fā)上州疾,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音皇拣,去河邊找鬼严蓖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛氧急,可吹牛的內(nèi)容都是我干的颗胡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼吩坝,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼毒姨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起钉寝,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤弧呐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后嵌纲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俘枫,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年疹瘦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了崩哩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巡球。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡言沐,死狀恐怖邓嘹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情险胰,我是刑警寧澤汹押,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站起便,受9級(jí)特大地震影響棚贾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜榆综,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一妙痹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鼻疮,春花似錦怯伊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挪哄,卻和暖如春吧秕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背迹炼。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國打工砸彬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人斯入。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓拿霉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親咱扣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绽淘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)闹伪,斷路器沪铭,智...
    卡卡羅2017閱讀 134,701評(píng)論 18 139
  • ?通過前面兩章對(duì)Spring Cloud Ribbon和Spring Cloud Hystrix的介紹,我們已經(jīng)掌...
    Chandler_玨瑜閱讀 213,201評(píng)論 15 140
  • 1 為什么需要服務(wù)發(fā)現(xiàn) 簡(jiǎn)單來說偏瓤,服務(wù)化的核心就是將傳統(tǒng)的一站式應(yīng)用根據(jù)業(yè)務(wù)拆分成一個(gè)一個(gè)的服務(wù)杀怠,而微服務(wù)在這個(gè)基...
    謙小易閱讀 25,108評(píng)論 4 93
  • jquery ajax成功響應(yīng)后無法賦值給全局變量 另一種方法是先把返回的數(shù)據(jù)賦值給全局變量,然后再ajax請(qǐng)求的...
    趙xiao賽閱讀 640評(píng)論 0 1
  • 9月10日-9月16日,本周是易效能時(shí)間踐行第17周厅克。沒有反思的人生不值得過赔退! 一、健康 本周堅(jiān)持早睡早起第134...
    微笑_f743閱讀 288評(píng)論 0 0