spring cloud之Feign (四)

什麼是Feign

官方解釋: 讀官方文檔,更好的理解

http://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign

聲明性REST客戶端:Feign

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

 

Declarative REST Client: 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.

Example spring boot app

@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnableEurekaClient
@EnableFeignClients
public class Application {

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

}

Feign是一個聲明性的Web服務客戶端。它使編寫Web服務客戶端變得更容易.

只需要創建一個接口,然後在上面添加註解即可。

參考官網: https://github.com/OpenFeign/feign

Feign是怎麼來的

之前大家用ribbon進行負載均衡,功能很強大,甚至可以自己自定義算法

a.大部分的我們都可以介紹,直接調用我們的微服務來進行訪問

//    public static final String REST_URL_PREFIX = "http://localhost:8001";

修改爲

       public static final String REST_URL_PREFIX = "http://SPRINGCLOUD-MODEL-DEPT";

 

b. 我們目前都習慣面向接口編程,比如我們的Dao接口/WebService接口,這個已經是我們的目前規範

       微服務名字獲得調用地址

       就是通過接口+註解,獲得我們的調用服務。

       適應社區其他程序員提出的,還是統一的面向接口編程的套路。----Feign

 

只需要創建一個接口,然後再上面添加註解即可。

@Mapper
Public interface UserDao{

}

 

Feign能幹什麼

Feign旨在使編寫Java Http客戶端變得更容易。

前面在使用Ribbon + Rest Template時,利用Rest Template對HTTP請求的封裝處理,形成了一套模板化的調用方法。但是在實際開發中,由於對服務依賴的調用可能不止一處,往往一個接口會被多處調用,所以通常都會針對每個微服務自行封裝一些客戶端類來包裝這些依賴服務的調用。所以,Feign在此基礎上做了進一步封裝,由他來幫助我們定義和實現服務接口的定義。在Feign的實現下,我們只需要創建一個接口並使用註解的方式來配置它(以前是Dao接口上面標註Mapper註解,現在是一個微服務接口上面標註一個Feign註解即可),即可完成對服務提供方的接口綁定,簡化了使用spring cloud Ribbon時,自動封裝服務調用客戶端的開發量。

 

Feign集成了Ribbon

利用Ribbon維護了SpringServiceCloud-Dept的服務列表信息,並且通過輪詢實現了客戶端的負載均衡。而與Ribbon不同的是,通過feign只需要定義服務綁定接口且以聲明式的方法,優雅而簡單的實現了服務調用

 

Feign使用步驟

第一步:

新建springcloud-model-consumer-dept-feign  (面向接口開發)

參考springcloud-model-consumer-dept-80  (Ribbon+RestTemplate )

複製主體工程結構

創建/修改主啓動類DeptConsumer80_Feign_App

package com.jiangjy.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@EnableEurekaClient  //和eureka整合並使用客戶端
@EnableFeignClients(basePackages = {"com.jiangjy.springcloud"}) //掃描Feign服務的包
@ComponentScan(value = "com.jiangjy.springcloud")
public class DeptConsumer80_Feign_App {

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

   springcloud-model-dept-feign 工程pom.xml,添加對feign的支持

<!-- feign相關jar -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-feign</artifactId>
		</dependency>

第二步:

修改springcloud-model-aip工程

     pom.xml文件
 

<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>
  <!-- 子類裏面顯示聲明纔能有明確的繼承表現,無意外就是父類的默認版本否則自己定義 -->
  <parent>
    <groupId>com.jiangjy.springcloud</groupId>
    <artifactId>springcloud-model</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <!-- 當前Module我自己叫什麼名字 -->
  <artifactId>springcloud-model-api</artifactId>
  
  <!-- 當前Module需要用到的jar包,按自己需求添加,如果父類已經包含了,可以不用寫版本號 -->
	<dependencies>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>
		
		<!-- feign相關jar -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-feign</artifactId>
		</dependency>	
	</dependencies>
  
</project>

 

新建DeptClientService接口並新增註解@FeignClient

詳情:

package com.jiangjy.springcloud.service;

import java.util.List;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.jiangjy.springcloud.pojo.Dept;

@FeignClient(value = "SPRINGCLOUD-MODEL-DEPT")  //面向服務中的註解+接口
public interface DeptClientService {

	@RequestMapping(value = "/dept/getAll",method = RequestMethod.GET)
	public List<Dept> getAll();
	
	@RequestMapping(value = "/dept/getById/{id}", method = RequestMethod.GET)
	public Dept getById(@PathVariable("id") Long id);
	
	@RequestMapping(value = "/dept/add",method = RequestMethod.POST)
	public boolean add(Dept dept);
	
}

 

公共部分:先mvn  clean  ------》 mvn install

springcloud-model-dept-feign 工程 修改/創建controller包中的DeptController_Consumer.java

添加新建的private DeptClientService service; 接口

package com.jiangjy.springcloud.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import com.jiangjy.springcloud.pojo.Dept;
import com.jiangjy.springcloud.service.DeptClientService;

@RestController
public class DeptController_Consumer {
	

	@Autowired
	private DeptClientService service;

	@RequestMapping("/consumer/dept/getAll")
	public List<Dept> getAll(){
		return this.service.getAll();
	}
	
	@RequestMapping("/consumer/dept/getById/{id}")
	public Dept getById(@PathVariable("id") Long id) {
		return this.service.getById(id);
	}
	
	@RequestMapping("/consumer/dept/add")
	public Object add(Dept dept) {
		
		return this.service.add(dept);
	}
}

 

修改/創建主啓動類(見第一步)

 

測試:

啓動3個eureka集羣

啓動3個部門微服務8001/8002/8003

啓動Feign自己啓動

http://localhost/consumer/dept/getAll

Feign自帶負載均衡配置項

小總結:Feign通過接口的方法調用Rest服務(之前是Ribbon+RestTemplate)

該請求發送給Eukeka服務器(http://SRPINGCLOUD-MODEL-DEPT/dept/getAll),

通過Feign直接找到服務接口,由於在進行服務調用的時候融合了Ribbon技術,所以也支持負載均衡作用。

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