上一篇文章,講述了如何通過RestTemplate + Ribbon
去消費服務,這篇文章主要講述如何通過Feign
去消費服務。
Feign
是一個聲明式的偽Http
客戶端,它使得寫Http
客戶端變得更簡單。
使用Feign
,只需要創(chuàng)建一個接口并注解,它具有可插拔的注解特性,可使用Feign
注解和JAX-RS
注解,Feign
支持可插拔的編碼器和解碼器,Feign
默認集成了Ribbon
,并和Eureka
結合,默認實現(xiàn)了負載均衡的效果。
Feign
具有如下特性:
Feign
注解和JAX-RS
注解HTTP
編碼器和解碼器Hystrix
和它的Fallback
Ribbon
的負載均衡HTTP
請求和響應的壓縮Feign
是一個聲明式的Web Service
客戶端,它的目的就是讓Web Service
調(diào)用更加簡單。它整合了Ribbon
和Hystrix
,從而不再需要顯式地使用這兩個組件。Feign
還提供了HTTP
請求的模板,通過編寫簡單的接口和注解,就可以定義好HTTP
請求的參數(shù)、格式、地址等信息。接下來,Feign
會完全代理HTTP
的請求,我們只需要像調(diào)用方法一樣調(diào)用它就可以完成服務請求。
簡而言之:Feign
能干Ribbon
和Hystrix
的事情,但是要用Ribbon
和Hystrix
自帶的注解必須要引入相應的jar
包才可以。
導入第三篇文章中的項目:作為服務注冊中心
spring-cloud-eureka-service
導入第三篇文章中的項目:作為服務的提供者
spring-cloud-eureka-provider-1
spring-cloud-eureka-provider-2
spring-cloud-eureka-provider-3
服務消費者
新建項目 spring-cloud-feign-consumer
pom.xml
中引入需要的依賴內(nèi)容:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
在工程的啟動類中,通過@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("服務名")
,來指定調(diào)用哪個服務。
比如在代碼中調(diào)用了eureka-provider
服務的 /
接口,/
就是調(diào)用:服務提供者項目: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;
/**
* 描述: 指定這個接口所要調(diào)用的 提供者服務名稱 "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;
/**
* 描述:調(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
指定注冊中心地址,配置自己的服務名稱
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
,發(fā)現(xiàn)Feign已經(jīng)實現(xiàn)負載均衡
或者瀏覽器get
請求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:關注公眾號,搜云庫技術團隊,專注于開發(fā)技術的研究與知識分享
更多建議: