[TOC]
上一篇文章,講述了如何通過`RestTemplate + Ribbon`去消費服務,這篇文章主要講述如何通過`Feign`去消費服務。
# Feign簡介
`Feign`是一個聲明式的偽`Http`客戶端,它使得寫`Http`客戶端變得更簡單。
使用`Feign`,只需要創建一個接口并注解,它具有可插拔的注解特性,可使用`Feign` 注解和`JAX-RS`注解,`Feign`支持可插拔的編碼器和解碼器,`Feign`默認集成了`Ribbon`,并和`Eureka`結合,默認實現了負載均衡的效果。
**`Feign` 具有如下特性:**
- 可插拔的注解支持,包括`Feign`注解和`JAX-RS`注解
- 支持可插拔的`HTTP`編碼器和解碼器
- 支持`Hystrix`和它的`Fallback`
- 支持`Ribbon`的負載均衡
- 支持`HTTP`請求和響應的壓縮`Feign`是一個聲明式的`Web Service`客戶端,它的目的就是讓`Web Service`調用更加簡單。它整合了`Ribbon`和`Hystrix`,從而不再需要顯式地使用這兩個組件。`Feign`還提供了`HTTP`請求的模板,通過編寫簡單的接口和注解,就可以定義好`HTTP`請求的參數、格式、地址等信息。接下來,`Feign`會完全代理`HTTP`的請求,我們只需要像調用方法一樣調用它就可以完成服務請求。
簡而言之:`Feign`能干`Ribbon`和`Hystrix`的事情,但是要用`Ribbon`和`Hystrix`自帶的注解必須要引入相應的`jar`包才可以。
# 準備工作
## Eureka Service
**導入第三篇文章中的項目:作為服務注冊中心**
`spring-cloud-eureka-service`
## Eureka Provider
**導入第三篇文章中的項目:作為服務的提供者**
`spring-cloud-eureka-provider-1`
`spring-cloud-eureka-provider-2`
`spring-cloud-eureka-provider-3`
# Feign Consumer
**服務消費者**
## 添加依賴
新建項目 `spring-cloud-feign-consumer` `pom.xml`中引入需要的依賴內容:
```xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
```
## 開啟Feign
在工程的啟動類中,通過`@EnableFeignClients` 注解開啟Feign的功能:
```java
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);
}
}
```
## 定義接口
通過`@FeignClient("服務名")`,來指定調用哪個服務。
比如在代碼中調用了`eureka-provider`服務的 `/` 接口,`/` 就是調用:服務提供者項目:`spring-cloud-eureka-provider-1`,`spring-cloud-eureka-provider-2`,`spring-cloud-eureka-provider-3` 的 `home()` 方法,代碼如下:
```java
package io.ymq.example.feign.consumer;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
/**
* 描述: 指定這個接口所要調用的 提供者服務名稱 "eureka-provider"
*
* @author yanpenglei
* @create 2017-12-06 15:13
**/
@FeignClient("eureka-provider")
public interface HomeClient {
@GetMapping("/")
String consumer();
}
```
## 消費方法
寫一個 `Controller`,消費提供者的 `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;
/**
* 描述:調用提供者的 `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`
指定注冊中心地址,配置自己的服務名稱
```sh
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: feign-consumer
server:
port: 9000
```
# 測試服務
依次啟動項目:
`spring-cloud-eureka-service`
`spring-cloud-eureka-provider-1`
`spring-cloud-eureka-provider-2`
`spring-cloud-eureka-provider-3`
`spring-cloud-feign-consumer`
啟動該工程后,訪問服務注冊中心,查看服務是否都已注冊成功:[http://localhost:8761/](http://localhost:8761/)
![查看各個服務注冊狀態][1]
## 負載均衡響應
**在命令窗口`curl http://localhost:9000/hello`,發現Feign已經實現負載均衡**
或者瀏覽器`get` 請求`http://localhost:9000/hello` F5 刷新
![測試 Feign 負載均衡響應][2]
# 源碼下載
**GitHub:**[https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-feign](https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-feign)
**碼云:**[https://gitee.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-feign](https://gitee.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-feign)
[1]: https://www.souyunku.com/images/2017/SpringCloud/feign/11.png
[2]: https://www.souyunku.com/images/2017/SpringCloud/feign/22.png
- Spring Cloud(一)服務的注冊與發現(Eureka)
- Spring Cloud(二)Consul 服務治理實現
- Spring Cloud(三)服務提供者 Eureka + 服務消費者(rest + Ribbon)
- Spring Cloud(四)服務提供者 Eureka + 服務消費者 Feign
- Spring Cloud(五)斷路器監控(Hystrix Dashboard)
- Spring Cloud(六)服務網關 zuul 快速入門
- Spring Cloud(七)服務網關 Zuul Filter 使用
- Spring Cloud(八)高可用的分布式配置中心 Spring Cloud Config
- Spring Cloud(九)高可用的分布式配置中心 Spring Cloud Config 集成 Eureka 服務
- Spring Cloud(十)高可用的分布式配置中心 Spring Cloud Config 中使用 Refresh
- Spring Cloud(十一)高可用的分布式配置中心 Spring Cloud Bus 消息總線集成(RabbitMQ)