Spring Cloud(四)服務(wù)提供者 Eureka + 服務(wù)消費(fèi)者 Feign

2019-04-17 13:57 更新

上一篇文章,講述了如何通過(guò)RestTemplate + Ribbon去消費(fèi)服務(wù),這篇文章主要講述如何通過(guò)Feign去消費(fèi)服務(wù)。

Feign簡(jiǎn)介

Feign是一個(gè)聲明式的偽Http客戶端,它使得寫Http客戶端變得更簡(jiǎn)單。

使用Feign,只需要?jiǎng)?chuàng)建一個(gè)接口并注解,它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解,Feign支持可插拔的編碼器和解碼器,Feign默認(rèn)集成了Ribbon,并和Eureka結(jié)合,默認(rèn)實(shí)現(xiàn)了負(fù)載均衡的效果。

Feign 具有如下特性:

  • 可插拔的注解支持,包括Feign注解和JAX-RS注解
  • 支持可插拔的HTTP編碼器和解碼器
  • 支持Hystrix和它的Fallback
  • 支持Ribbon的負(fù)載均衡
  • 支持HTTP請(qǐng)求和響應(yīng)的壓縮Feign是一個(gè)聲明式的Web Service客戶端,它的目的就是讓Web Service調(diào)用更加簡(jiǎn)單。它整合了RibbonHystrix,從而不再需要顯式地使用這兩個(gè)組件。Feign還提供了HTTP請(qǐng)求的模板,通過(guò)編寫簡(jiǎn)單的接口和注解,就可以定義好HTTP請(qǐng)求的參數(shù)、格式、地址等信息。接下來(lái),Feign會(huì)完全代理HTTP的請(qǐng)求,我們只需要像調(diào)用方法一樣調(diào)用它就可以完成服務(wù)請(qǐng)求。

簡(jiǎn)而言之:Feign能干RibbonHystrix的事情,但是要用RibbonHystrix自帶的注解必須要引入相應(yīng)的jar包才可以。

準(zhǔn)備工作

Eureka Service

導(dǎo)入第三篇文章中的項(xiàng)目:作為服務(wù)注冊(cè)中心

spring-cloud-eureka-service

Eureka Provider

導(dǎo)入第三篇文章中的項(xiàng)目:作為服務(wù)的提供者

spring-cloud-eureka-provider-1
spring-cloud-eureka-provider-2
spring-cloud-eureka-provider-3

Feign Consumer

服務(wù)消費(fèi)者

添加依賴

新建項(xiàng)目 spring-cloud-feign-consumer pom.xml中引入需要的依賴內(nèi)容:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

開啟Feign

在工程的啟動(dòng)類中,通過(guò)@EnableFeignClients 注解開啟Feign的功能:

package io.ymq.example.feign.consumer;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;


@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class FeignConsumerApplication {


    public static void main(String[] args) {
        SpringApplication.run(FeignConsumerApplication.class, args);
    }
}

定義接口

通過(guò)@FeignClient("服務(wù)名"),來(lái)指定調(diào)用哪個(gè)服務(wù)。
比如在代碼中調(diào)用了eureka-provider服務(wù)的 / 接口,/ 就是調(diào)用:服務(wù)提供者項(xiàng)目:spring-cloud-eureka-provider-1,spring-cloud-eureka-provider-2,spring-cloud-eureka-provider-3home() 方法,代碼如下:

package io.ymq.example.feign.consumer;


import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;


/**
 * 描述: 指定這個(gè)接口所要調(diào)用的 提供者服務(wù)名稱 "eureka-provider"
 *
 * @author yanpenglei
 * @create 2017-12-06 15:13
 **/
@FeignClient("eureka-provider")
public interface  HomeClient {


    @GetMapping("/")
    String consumer();
}

消費(fèi)方法

寫一個(gè) Controller,消費(fèi)提供者的 home 方法

package io.ymq.example.feign.consumer;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;


/**
 * 描述:調(diào)用提供者的 `home` 方法
 *
 * @author yanpenglei
 * @create 2017-12-06 15:26
 **/
@RestController
public class ConsumerController {


    @Autowired
    private HomeClient homeClient;


    @GetMapping(value = "/hello")
    public String hello() {
        return  homeClient.consumer();
    }
}

添加配置

完整配置 application.yml

指定注冊(cè)中心地址,配置自己的服務(wù)名稱

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/


spring:
  application:
    name: feign-consumer


server:
  port: 9000

測(cè)試服務(wù)

依次啟動(dòng)項(xiàng)目:

spring-cloud-eureka-service
spring-cloud-eureka-provider-1
spring-cloud-eureka-provider-2
spring-cloud-eureka-provider-3
spring-cloud-feign-consumer

啟動(dòng)該工程后,訪問服務(wù)注冊(cè)中心,查看服務(wù)是否都已注冊(cè)成功:http://localhost:8761/

查看各個(gè)服務(wù)注冊(cè)狀態(tài)

負(fù)載均衡響應(yīng)

在命令窗口curl http://localhost:9000/hello,發(fā)現(xiàn)Feign已經(jīng)實(shí)現(xiàn)負(fù)載均衡

或者瀏覽器get 請(qǐng)求http://localhost:9000/hello F5 刷新

測(cè)試 Feign 負(fù)載均衡響應(yīng)

源碼下載

GitHub:https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-feign

碼云:https://gitee.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-feign

Contact

  • 作者:鵬磊
  • 出處:http://www.souyunku.com
  • Email:admin@souyunku.com
  • 版權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)注明出處
  • Wechat:關(guān)注公眾號(hào),搜云庫(kù)技術(shù)團(tuán)隊(duì),專注于開發(fā)技術(shù)的研究與知識(shí)分享

    關(guān)注公眾號(hào)-搜云庫(kù)

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)