1. 程式人生 > >SpringCloud微服務 之Feign(一)

SpringCloud微服務 之Feign(一)

前言

本小節我們將開始學習一下SpringCloud封裝好了的用於實現微服務節點間通訊的工具–Feign

其實關於微服務架構下各個模組(節點)間的通訊方式其實有很多種,個人比較推薦使用的是SpringCloud封裝好了的RESTful API呼叫工具,比如說RestTemplate(在之前的案例中有實用參考:SpringCloud微服務 之Ribbon(一))和Feign

其中個人比較喜歡的是使用Feign,因為Feign是SpringCloud對RestTemplate的高度封裝,同時還整合更多的功能比如Hystrix等優秀工具及其拓展功能,Feign是一個非常不錯的用於實現和保證微服務模組間通訊的工具。下面我們先來簡單瞭解一下Feign。

  • Feign是一個宣告式的Web服務客戶端,是Netflix下的一個用於實現分散式客服端間通訊的工具,SpringCloud
    為服務架構下,SpringCloud對Feign做了進一步封裝,是的Feign的功能能為強大。

  • Feign 具有可插入註釋支援,包括Feign註釋和JAX-RS註釋。Feign還支援可插拔編碼器和解碼器。

  • Spring Cloud在對Feign的封裝過程中增加了對Spring MVC註釋的支援,並使用Spring Web中預設使用的HttpMessageConverters,是的Feign能與Spring生態基本無縫整合。

  • Spring Cloud整合Ribbon和Eureka以在使用Feign時提供負載均衡的http客戶端。

案例

為了更直觀地體驗Feign的強大,我們將通過一些案例來學習Feign。

  • Eureka Server端編寫:(參考前例)。
    在這裡插入圖片描述

  • Eureka Client端服務提供方編寫(參考前例)。

    • 專案結構
      在這裡插入圖片描述

    • CoreCode

      @SpringBootApplication
      @EnableDiscoveryClient
      @EnableFeignClients //開啟FeignClient註解
      public class MicroserviceDealBrokerFeignApplication {
      
      	public static void main(String[] args) {
      		SpringApplication.run(MicroserviceDealBrokerFeignApplication.class,
      				args);
      	}
      }
      
      
      @FeignClient(name = "microservice-deal-cloud")  //宣告服務節點
      public interface FeignConfig {
      
      	//第一個坑:使用Feign的時候,如果引數中帶有@PathVariable形式的引數,則要用value=""標明對應的引數,否則會丟擲IllegalStateException異常
      	@GetMapping("/deal/{id}")
      	public Deal findById(@PathVariable(value="id") Long id);
      }
      
      
      @RestController
      public class BrokerController {
      	
      	@Autowired
      	private FeignConfig feignConfig;
      	
      	@GetMapping("/deal/{id}")
      	public Deal findById(@PathVariable(value="id") Long id) {
      		return this.feignConfig.findById(id);
      	}
      }
      
      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      	<modelVersion>4.0.0</modelVersion>
      
      	<artifactId>microservice-deal-broker-cloud-feign</artifactId>
      	<packaging>jar</packaging>
      
      	<name>microservice-deal-broker-cloud-feign</name>
      	<description>Demo project for Spring Boot</description>
      
      	<parent>
      		<groupId>com.example</groupId>
      		<artifactId>microservice-deal-parent</artifactId>
      		<version>0.0.1-SNAPSHOT</version>
      	</parent>
      
      	<dependencies>
      		<!-- Eureka -->
      		<dependency>
      			<groupId>org.springframework.cloud</groupId>
      			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
      		</dependency>
      	
      		<!-- Feign -->
      		<dependency>
      			<groupId>org.springframework.cloud</groupId>
      			<artifactId>spring-cloud-starter-openfeign</artifactId>
      		</dependency>
      
      
      	</dependencies>
      
      </project>
      
  • Eureka Client端服務提消費編寫(單例項) (參考前例)。

  • 訪問:http://localhost:8082/deal/2
    在這裡插入圖片描述

小結

  • Feign雖好用可實際上應與起來會有表較多的坑…

    • 使用Feign的時候,如果引數中帶有@PathVariable形式的引數,則要用value=""標明對應的引數,否則會丟擲IllegalStateException異常。
    • 在配置檔案中必須做一些宣告(參考以下說明)。
  • 服務消費者若要使用Feign作為宣告式客戶端至少需要做以下三步(以本節案例為例子):

    • 開啟@EnableFeignClients註解,用於宣告該服務節點是一個FeignClient
    • 編寫FeignClient介面用於宣告客戶端URLs。
    • 在配置檔案中宣告開啟一些特性,比如:ribbon:eureka:enabled: true(開啟Eureka中Ribbon均衡負載功能)和hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 5000(配置斷熔器超時時間)。
  • 本節用到的案例:microservice-deal-eureka、microservice-deal-cloud、microservice-deal-broker-cloud-feign