SpringCloud-feign 聲明式服務(wù)調(diào)用

以前學(xué)習(xí)java,一般就一個(gè)后端耐量,都要學(xué)習(xí)如何在容器中運(yùn)行飞蚓,如tomcat,weblogic廊蜒,現(xiàn)在微服務(wù)顛覆了這一切趴拧,一個(gè)系統(tǒng)要被拆分成多個(gè)服務(wù)溅漾,服務(wù)與服務(wù)間需要通信,讓我想到了前端的ajax著榴,java里可沒(méi)js那樣方便添履,一般使用resttemplate,httpclient∧杂郑現(xiàn)在springcloud又帶來(lái)了一種新的服務(wù)調(diào)用方式--feign暮胧。

下面,我們創(chuàng)建一個(gè)工程測(cè)試feign问麸,先啟動(dòng)前面講的注冊(cè)中心往衷,feign客戶(hù)端作為一個(gè)消費(fèi)端,還需要一個(gè)提供端严卖。

創(chuàng)建消費(fèi)端席舍,工程依賴(lài)如下(這里使用boot1.5.x):

dependencyManagement {
    imports {
        mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Edgware.SR4'
    }
}
dependencies {
    compile('org.springframework.boot:spring-boot-starter')
    compile('org.springframework.boot:spring-boot-starter-web')
    compile 'org.slf4j:slf4j-api:1.7.14'
    compile('org.springframework.cloud:spring-cloud-starter-eureka')
    compile('org.springframework.cloud:spring-cloud-starter-feign')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

接著配置端口并注冊(cè)到注冊(cè)中心,如下:

spring.application.name=feign-consumer
# 單機(jī)
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
server.port=8083

啟動(dòng)類(lèi)加上注解妄田,一個(gè)用于服務(wù)發(fā)現(xiàn),一個(gè)用于feign客戶(hù)端驮捍,可通過(guò)EnableFeignClients調(diào)用其他服務(wù)的api疟呐,如下:

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

接著編寫(xiě)service,如下:

@FeignClient(name="HELLO-SERVICE", fallback = HelloServiceFallback.class)
public interface HelloService {
    @RequestMapping("/hello")
    String hello();
    @RequestMapping(value = "/hello1", method = RequestMethod.GET)
    String hello(@RequestParam("name") String name) ;
    @RequestMapping(value = "/hello2", method = RequestMethod.GET)
    User hello(@RequestHeader("name") String name, @RequestHeader("age") Integer age);
    @RequestMapping(value = "/hello3", method = RequestMethod.POST)
    String hello(@RequestBody User user);
}

上面定義一個(gè)feign客戶(hù)端东且,它指定了要消費(fèi)的服務(wù)名以及降級(jí)的處理類(lèi)启具,若調(diào)用service.hello()則會(huì)發(fā)起對(duì)應(yīng)請(qǐng)求:http://HELLO-SERVICE/hello
降級(jí)處理類(lèi)也很簡(jiǎn)單,只需實(shí)現(xiàn)service接口即可珊泳。

@Component
public class HelloServiceFallback implements HelloService {
    @Override
    public String hello() {
        return "error";
    }
    @Override
    public String hello(@RequestParam("name") String name) {
        return "error";
    }
    @Override
    public User hello(@RequestHeader("name") String name, @RequestHeader("age") Integer age) {
        return new User("nothing", 0);
    }
    @Override
    public String hello(@RequestBody User user) {
        return "error";
    }
}

其實(shí)上面的方法鲁冯,實(shí)現(xiàn)比較繁瑣,我們可以用更簡(jiǎn)單的方式色查,如下薯演,

@RequestMapping("/refactor")
public interface HelloService {

    @RequestMapping(value = "/hello1", method = RequestMethod.GET)
    String hello(@RequestParam("name") String name) ;

    @RequestMapping(value = "/hello2", method = RequestMethod.GET)
    User hello(@RequestHeader("name") String name, @RequestHeader("age") Integer age);

    @RequestMapping(value = "/hello3", method = RequestMethod.POST)
    String hello(@RequestBody User user);

}

上面我們重構(gòu)了service接口,將所有requestMapping寫(xiě)入秧了,其實(shí)與上面的變化也不大跨扮,最主要的區(qū)別是它可以被多模塊共享,可以以最簡(jiǎn)方式創(chuàng)建feignClient验毡,下面看下feignClient的實(shí)現(xiàn)衡创,如下:

@FeignClient(value = "HELLO-SERVICE")
public interface RefactorHelloService extends HelloService {
}

這樣是不是很簡(jiǎn)單呢

下面我們編寫(xiě)controller,只需注入上面的服務(wù)即可晶通。

@RestController
public class ConsumerController {

    @Autowired
    HelloService helloService;
    @Autowired
    RefactorHelloService refactorHelloService;

    @RequestMapping(value = "/feign-consumer", method = RequestMethod.GET)
    public String helloConsumer() {
        return helloService.hello();
    }

    @RequestMapping(value = "/feign-consumer2", method = RequestMethod.GET)
    public String helloConsumer2() {
        StringBuilder sb = new StringBuilder();
        sb.append(helloService.hello()).append("\n");
        sb.append(helloService.hello("DIDI")).append("\n");
        sb.append(helloService.hello("DIDI", 30)).append("\n");
        sb.append(helloService.hello(new User("DIDI", 30))).append("\n");
        return sb.toString();
    }

    @RequestMapping(value = "/feign-consumer3", method = RequestMethod.GET)
    public String helloConsumer3() {
        StringBuilder sb = new StringBuilder();
        sb.append(refactorHelloService.hello("MIMI")).append("\n");
        sb.append(refactorHelloService.hello("MIMI", 20)).append("\n");
        sb.append(refactorHelloService.hello(new User("MIMI", 20))).append("\n");
        return sb.toString();
    }

}

上面主要講了消費(fèi)服務(wù)的創(chuàng)建璃氢,提供服務(wù)的創(chuàng)建請(qǐng)參考另一篇文章 SpringCloud-service 服務(wù)提供
學(xué)習(xí)交流,請(qǐng)加群:64691032

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末狮辽,一起剝皮案震驚了整個(gè)濱河市一也,隨后出現(xiàn)的幾起案子巢寡,更是在濱河造成了極大的恐慌,老刑警劉巖塘秦,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讼渊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡尊剔,警方通過(guò)查閱死者的電腦和手機(jī)爪幻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)须误,“玉大人挨稿,你說(shuō)我怎么就攤上這事【┝。” “怎么了奶甘?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)祭椰。 經(jīng)常有香客問(wèn)我臭家,道長(zhǎng),這世上最難降的妖魔是什么方淤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任钉赁,我火速辦了婚禮,結(jié)果婚禮上携茂,老公的妹妹穿的比我還像新娘你踩。我一直安慰自己,他們只是感情好讳苦,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布带膜。 她就那樣靜靜地躺著,像睡著了一般鸳谜。 火紅的嫁衣襯著肌膚如雪膝藕。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,549評(píng)論 1 312
  • 那天咐扭,我揣著相機(jī)與錄音束莫,去河邊找鬼。 笑死草描,一個(gè)胖子當(dāng)著我的面吹牛览绿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播穗慕,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼饿敲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了逛绵?” 一聲冷哼從身側(cè)響起怀各,我...
    開(kāi)封第一講書(shū)人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤倔韭,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后瓢对,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體寿酌,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年硕蛹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了醇疼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡法焰,死狀恐怖秧荆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情埃仪,我是刑警寧澤乙濒,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站卵蛉,受9級(jí)特大地震影響颁股,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜傻丝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一甘有、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧桑滩,春花似錦梧疲、人聲如沸允睹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)缭受。三九已至胁澳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間米者,已是汗流浹背韭畸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蔓搞,地道東北人胰丁。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像喂分,于是被迫代替她去往敵國(guó)和親锦庸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361