上一篇文章,講述了如何通過(guò)RestTemplate + Ribbon
去消費(fèi)服務(wù),這篇文章主要講述如何通過(guò)Feign
去消費(fèi)服務(wù)。
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)單。它整合了Ribbon
和Hystrix
,從而不再需要顯式地使用這兩個(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
能干Ribbon
和Hystrix
的事情,但是要用Ribbon
和Hystrix
自帶的注解必須要引入相應(yīng)的jar
包才可以。
導(dǎo)入第三篇文章中的項(xiàng)目:作為服務(wù)注冊(cè)中心
spring-cloud-eureka-service
導(dǎo)入第三篇文章中的項(xiàng)目:作為服務(wù)的提供者
spring-cloud-eureka-provider-1
spring-cloud-eureka-provider-2
spring-cloud-eureka-provider-3
服務(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>
在工程的啟動(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-3
的 home()
方法,代碼如下:
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();
}
寫一個(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
依次啟動(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/
在命令窗口curl http://localhost:9000/hello
,發(fā)現(xiàn)Feign已經(jīng)實(shí)現(xiàn)負(fù)載均衡
或者瀏覽器get
請(qǐng)求http://localhost:9000/hello
F5 刷新
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
Wechat:關(guān)注公眾號(hào),搜云庫(kù)技術(shù)團(tuán)隊(duì),專注于開發(fā)技術(shù)的研究與知識(shí)分享
更多建議: