上一篇文章,講述瞭如何通過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
中引入需要的依賴內容:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
複製程式碼
開啟Feign
在工程的啟動類中,通過@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);
}
}
複製程式碼
定義介面
通過@FeignClient("服務名")
,來指定呼叫哪個服務。
比如在程式碼中呼叫了eureka-provider
服務的 /
介面,/
就是呼叫:服務提供者專案:spring-cloud-eureka-provider-1
,spring-cloud-eureka-provider-2
,spring-cloud-eureka-provider-3
的 home()
方法,程式碼如下:
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
指定註冊中心地址,配置自己的服務名稱
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/
負載均衡響應
在命令視窗curl http://localhost:9000/hello
,發現Ribbon已經實現負載均衡
或者瀏覽器get
請求http://localhost:9000/hello
F5 重新整理
原始碼下載
GitHub:github.com/souyunku/sp…
Contact
- 作者:鵬磊
- 出處:www.ymq.io
- Email:admin@souyunku.com
- 版權歸作者所有,轉載請註明出處
- Wechat:關注公眾號,搜雲庫,專注於開發技術的研究與知識分享