SpringCloud(五)Feign——更好用的通信方式

在微服務架構中,我們經常需要和其他服務進行通信實現數據交互,常用的方式有兩種:一是RPC((Romote Procedure Call),另一種是HTTP。SpirngCloud 中,默認是使用HTTP進行微服務間通信,其中最常用的有兩種實現形式也有兩種:一RestTemplate,二是Feign,前者的用法我們在上一篇文章中已經見識過了。接下來我們就來看看feign是怎麼回事呢!

源碼託管地址:https://github.com/cddofficial/SpringCloudRepo

目錄

1 Feign概述

1. Feign簡介

2.與RestTemplate的區別

2 實戰

2.1 複製得到eureka-client-coke-feign

2.2 修改代碼

2.2.1 添加Feign依賴

2.2.2 修改啓動類

2.3 測試

2.3.1 啓動服務

2.3.2 發請求測試

3 參考資料


1 Feign概述

1. Feign簡介

Feign is a declarative web service client. It makes writing web service clients easier. To use Feign create an interface and annotate it. It has pluggable annotation support including Feign annotations and JAX-RS annotations. Feign also supports pluggable encoders and decoders. Spring Cloud adds support for Spring MVC annotations and for using the same HttpMessageConverters used by default in Spring Web. Spring Cloud integrates Ribbon and Eureka to provide a load balanced http client when using Feign.

上面是Spring官網給出的Feign的解釋,官網地址:https://cloud.spring.io/spring-cloud-static/Finchley.SR4/single/spring-cloud.html#netflix-feign-starter 

我用谷歌翻譯過來大概是:

Feign是聲明性Web服務客戶端。它使編寫Web服務客戶端更加容易。要使用Feign,請創建一個接口並對其進行註釋。它具有可插入的註釋支持,包括Feign註釋和JAX-RS註釋。Feign還支持可插拔編碼器和解碼器。Spring Cloud添加了對Spring MVC註釋的支持,並支持使用HttpMessageConvertersSpring Web中默認使用的註釋。當使用Feign時,Spring Cloud集成了Ribbon和Eureka以提供負載平衡的http客戶端。

我們使用Feign組件來調用其他微服務的接口,就如同調用自己服務的接口一樣,這是我使用feign後的體會。

2.與RestTemplate的區別

在SpringWeb裏面,已經原生支持了 RestTemplate。Feign是由netflix支持的。

使用RestTemplate時,URL參數是以編程方式構造的,數據被髮送到其他服務。在更復雜的情況下,我們將不得不RestTemplate深入到更低級別的API提供的甚至是API 的細節。

Feign是Spring Cloud Netflix庫,用於在基於REST的服務調用上提供更高級別的抽象。Spring Cloud Feign在聲明性原則上工作。使用Feign時,我們在客戶端編寫聲明式REST服務接口,並使用這些接口來編寫客戶端程序。開發人員不用擔心這個接口的實現。這將在運行時由Spring動態配置。通過這種聲明性的方法,開發人員不需要深入瞭解由HTTP提供的HTTP級別API的細節的RestTemplate

總之,Feign比RestTemplate更好用,功能更強大。

2 實戰

2.1 複製得到eureka-client-coke-feign

首先複製微服務eureka-client-coke重命名爲eureka-client-coke-feign(至於如何複製這裏不再贅述,請看eureka——實戰中的 “2.4.1 創建可樂微服務” 的 “複製得到eureka-client-coke),我們在這個新複製的微服務上來應用Feign組件來實戰。

導入到STS(Spring Tools Suite4,一種集成了Spirng插件的類似eclipse的IDE工具)中,項目結構如下圖:

2.2 修改代碼

2.2.1 添加Feign依賴

再pom文件中添加feign組件相關依賴,如下圖:

代碼如下:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.7.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>

	<groupId>com.cdd.cloud</groupId>
	<artifactId>eureka-client-coke-feign</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>eureka-server-service-discover</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>
		<!-- feign組件依賴 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-openfeign</artifactId>
		</dependency>

		<!-- eureka client依賴 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>

		<!-- web依賴 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<!-- 連接mysql所需依賴 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>

		<!-- 測試需要依賴 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<!-- 引入spring cloud的依賴,不能少,主要用來管理Spring Cloud生態各組件的版本 -->
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Finchley.SR2</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<!-- 添加spring-boot的maven插件,不能少,打jar包時得用 -->
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

2.2.2 修改啓動類

把啓動類名稱改爲EurekaClientCokeFeignApplication,在該類上打@EnableFeignClients。代碼如下:

package com.cdd.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableEurekaClient  //eureka client 註解
@EnableFeignClients  //啓用feign組件註解
public class EurekaClientCokeFeignApplication {

	public static void main(String[] args) {
		SpringApplication.run(EurekaClientCokeFeignApplication.class, args);
	}
}

2.3 測試

2.3.1 啓動服務

1. 先啓動服務發現微服務eureka-server-service-discover

2. 啓動用戶微服務

(1)修改用戶微服務eureka-client-user的端口爲8002,修改applicatioin.yml文件,截圖如圖(其他地方不變):

啓動用戶微服務,查看控制檯日誌,以8002端口啓動,時間爲下午2:49:01,這個時間點啓動的是端口爲8002用戶微服務實例,截圖如下:

(2)(1)修改用戶微服務eureka-client-user的端口爲8001,修改applicatioin.yml文件,截圖如圖(其他地方不變):

啓動用戶微服務,查看控制檯日誌,以8001端口啓動,時間爲下午2:52:30,這個時間點啓動的是端口爲8001用戶微服務實例,截圖如下:

3 啓動eureka-client-coke-feign微服務。

2.3.2 發請求測試

1. 先查看服務註冊列表

瀏覽器器輸入:http://localhost:8761/ ,響應頁面如下,可以看到可樂微服務一個實例,用戶微服務2個實例都已經註冊上了。

2. 測試feign組件

先清掉控制檯用戶微服務兩個實例的日誌,在瀏覽器中輸入:http://localhost:9001/coke/2,連續刷新4次,響應頁面如下:

再來看用戶微服務兩個實例控制檯打印的日誌信息。

啓動時間爲下午2:49:01的用戶微服務實例端口爲8002,執行處理了2次(打印的sql有兩條),如下圖:

啓動時間爲下午2:52:30的用戶微服務實例端口爲8001,執行處理了2次(打印的sql有兩條),如下圖:

到這裏是不是充分說明實現了微服務間通信,並且也實現了負載均衡,是不是比RestTemplate+Ribbon好用多了呢!

其實上面我們也不必記錄時間,以時間來標誌哪個用戶微服務,其他方法也行(比如配置一個別名什麼的,隨你)。只是讓大家清晰明瞭看到的確實現了微服務間通信和負載均衡。

3 參考資料

feign與RestTemplate的區別:https://www.cnblogs.com/EasonJim/p/8321355.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章