Spring Cloud(四)服務提供者 Eureka + 服務消費者 Feign

2019-04-17 13:57 更新

上一篇文章,講述了如何通過RestTemplate + Ribbon去消費服務,這篇文章主要講述如何通過Feign去消費服務。

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)用更加簡單。它整合了RibbonHystrix,從而不再需要顯式地使用這兩個組件。Feign還提供了HTTP請求的模板,通過編寫簡單的接口和注解,就可以定義好HTTP請求的參數(shù)、格式、地址等信息。接下來,Feign會完全代理HTTP的請求,我們只需要像調(diào)用方法一樣調(diào)用它就可以完成服務請求。

簡而言之:Feign能干RibbonHystrix的事情,但是要用RibbonHystrix自帶的注解必須要引入相應的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中引入需要的依賴內(nèi)容:

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-feign</artifactId>
  4. </dependency>

開啟Feign

在工程的啟動類中,通過@EnableFeignClients 注解開啟Feign的功能:

  1. package io.ymq.example.feign.consumer;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  5. import org.springframework.cloud.netflix.feign.EnableFeignClients;
  6. @EnableFeignClients
  7. @EnableDiscoveryClient
  8. @SpringBootApplication
  9. public class FeignConsumerApplication {
  10. public static void main(String[] args) {
  11. SpringApplication.run(FeignConsumerApplication.class, args);
  12. }
  13. }

定義接口

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

  1. package io.ymq.example.feign.consumer;
  2. import org.springframework.cloud.netflix.feign.FeignClient;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. /**
  5. * 描述: 指定這個接口所要調(diào)用的 提供者服務名稱 "eureka-provider"
  6. *
  7. * @author yanpenglei
  8. * @create 2017-12-06 15:13
  9. **/
  10. @FeignClient("eureka-provider")
  11. public interface HomeClient {
  12. @GetMapping("/")
  13. String consumer();
  14. }

消費方法

寫一個 Controller,消費提供者的 home 方法

  1. package io.ymq.example.feign.consumer;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. /**
  6. * 描述:調(diào)用提供者的 `home` 方法
  7. *
  8. * @author yanpenglei
  9. * @create 2017-12-06 15:26
  10. **/
  11. @RestController
  12. public class ConsumerController {
  13. @Autowired
  14. private HomeClient homeClient;
  15. @GetMapping(value = "/hello")
  16. public String hello() {
  17. return homeClient.consumer();
  18. }
  19. }

添加配置

完整配置 application.yml

指定注冊中心地址,配置自己的服務名稱

  1. eureka:
  2. client:
  3. serviceUrl:
  4. defaultZone: http://localhost:8761/eureka/
  5. spring:
  6. application:
  7. name: feign-consumer
  8. server:
  9. 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/

查看各個服務注冊狀態(tài)

負載均衡響應

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

或者瀏覽器get 請求http://localhost:9000/hello F5 刷新

測試 Feign 負載均衡響應

源碼下載

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
  • 版權歸作者所有,轉載請注明出處
  • Wechat:關注公眾號,搜云庫技術團隊,專注于開發(fā)技術的研究與知識分享

    關注公眾號-搜云庫

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號