Feign
OpenFeign是Netflix 開發的宣告式、模板化的HTTP請求客戶端,可以更加便捷、優雅的呼叫http api
OpenFeign是會根據帶有注解的函式資訊構建出網路請求的模板,在發送網路請求之前,OpenFeign會將函式的引數值設定到這些請求模板中,
feign主要是構建微服務消費端,只要使用OpenFeign提供的注解修飾定義網路請求的介面類,就可以使用該皆苦的實體發送RESTful的網路請求,還可以集成Ribbon和Hystrix,提供負載均衡和斷路器,
英文表意為 “假裝,偽裝,變形”,是一個http請求呼叫的輕量級框架,可以以java介面注解的方式呼叫Http請求,而不用像java中通過封裝HTTP請求報文的方式直接呼叫,通過處理注解,將請求模板化,當實際呼叫的時候,傳入引數,根據引數在應用到請求上,進化轉化為真正的請求,這種請求相對而言比較直觀,Feign封裝了HTTP呼叫流程,面向介面編程,
Feign和OpenFeign的關系
Feign本身不支持Spring MVC的注解,他有一套自己的注解
OpenFeign是Spring Cloud 在Feign的基礎上支持了Spring MVC的注解,如@RequestMapping等等,
OpenFeign的@FeignClient 可以決議Spring MVC的@RequestMapping注解下的介面,并通過動態代理的方式產生實作類,實作類中做負載均衡并呼叫其他服務,
準備
先搭建一個eureka來供這些服務注冊
1. 創建eurekaserver2專案
引入依賴 Eureka管理端依賴 spring-cloud-starter-netflix-eureka-server
代碼如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
在Eurekaserver2Application加上@EnableEurekaServer注解,說明這個一個管理端

在工程的組態檔application.yaml檔案,指定服務名為eurekaServer,主機名為eureka2.com,埠號為:7902
#Tomcat的埠
server:
port: 7902
eureka:
instance:
hostname: eureka2.com
spring:
application:
name: eurekaServer
2. 創建專案User-Provider
先創建一個user-provider 專案,用來寫介面,供呼叫方呼叫,就跟我們普通的SpringMVC寫Controller 對外暴露介面差不多
引入,Eureka的客戶端依賴spring-cloud-starter-netflix-eureka-client、Web依賴spring-boot-starter-web,代碼如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
在工程的組態檔application.yaml檔案,指定服務提供方的服務名為user-provider,埠號為8003,服務注冊地址為http://eureka2.com:7902/eureka/ ,代碼如下:
server:
port: 8003
spring:
application:
name: user-provider
#設定服務注冊中心的URL,用于client和server端交流
eureka:
client:
service-url:
defaultZone: http://eureka2.com:7902/eureka/
創建UserController類,隨便提供一個測驗的介面
package com.wan.userprovider.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Auther: wan
* @Date: 2021/2/24 11:00
* @Description: com.wan.userprovider.controller
* @version: 1.0
*/
@RestController
public class UserController {
//無參get方法
@GetMapping("/getWan")
public String getWan(){
return "Hi wan 呼叫方式為:get!!";
}
//帶參get方法
@GetMapping("/getWanParams")
public String getWanParams(String name){
return "Hello !! 呼叫方式為:get ,引數為:"+name;
}
//無參post方法
@PostMapping("/postWan")
public String postWan(){
return "Hi wan 呼叫方式為:post!!";
}
//帶參post方法
@PostMapping("/postWanParams")
public String postWanParams(String name){
return "Hi wan 呼叫方式為:post,引數為:"+name;
}
}
3. 創建專案user-consumer
創建user-consumer專案使用Feign 來呼叫服務提供方的介面
引入,Eureka的客戶端依賴spring-cloud-starter-netflix-eureka-client、Web依賴spring-boot-starter-web,OpenFeign的依賴spring-cloud-starter-openfeign
有些工具只有openfeign沒有feign,都區別不大,代碼如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--Feign默認所有帶引數的請求都是Post,想要使用指定的提交方式需引入依賴-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
還需要在入口application里面配置一下
在UserConsumerApplication類中加入@EnableFeignClients 注解

在工程的組態檔application.yaml檔案,指定服務呼叫方的服務名為user-consumer,埠號為8004,服務注冊地址為http://eureka2.com:7902/eureka/ ,代碼如下:
server:
port: 8004
spring:
application:
name: user-consumer
#設定服務注冊中心的URL,用于client和server端交流
eureka:
client:
service-url:
defaultZone: http://eureka2.com:7902/eureka/
在創建一個UserAPIService 介面類用來呼叫遠程服務的介面
用Feign訪問服務名稱可以有兩種寫法
1. 下面這種方式帶url的為直接訪問,就是不通過eureka,直接訪問服務,這就和我們平常呼叫介面差不多
@FeignClient(name = "wanFeign",url = "http://localhost:8003")
2. 第二種方式為根據服務名稱訪問,他中間是會走eureka的,通過服務名稱去eureka服務串列中去找,name就是服務提供方的服務名稱,
@FeignClient(name = "user-provider")
然后在定義的介面上寫上映射,映射地址名稱就是你需要呼叫的服務介面名稱
/*
@FeignClient(name = "wanFeign",url = "http://localhost:8003")
如果結合eureka ,在FeignClient 注解中就可以不用寫url,直接name指定服務名稱就可以直接呼叫了
*/
@FeignClient(name = "user-provider")
public interface UserApi2Service {
@GetMapping("/getWan")
public String getWan();
@GetMapping("/getWanParams")
public String getWanParams(@RequestParam("name")String name);
@PostMapping("/postWan")
public String postWan();
@PostMapping("/postWanParams")
public String postWanParams(@RequestParam("name")String name);
}
接下來我們在寫一個MainController,我就不解釋了,直接上代碼了
@RestController
public class MainController {
//服務直連,不通過eureka,直接進行請求
@Autowired
UserApiService userApiService;
//通過eureka服務名稱請求
@Autowired
UserApi2Service userApi2Service;
//服務直連,不通過eureka,直接進行請求
@GetMapping("/getWan")
public String getWan(){
return userApiService.getWan();
}
//通過eureka服務名稱請求-
@GetMapping("/getWan2")
public String getWan2(){
return userApi2Service.getWan();
}
//通過eureka服務名稱請求-帶參請求
@GetMapping("/getWanParams")
public String getWanParams(){
String name="Hi!! wan";
return userApi2Service.getWanParams(name);
}
//通過eureka服務名稱請求-post無參請求
@GetMapping("/postWan")
public String postWan(){
return userApi2Service.postWan();
}
//通過eureka服務名稱請求-post帶參請求
@GetMapping("/postWanParams")
public String postWanParams(){
String name="Hi!! wan";
return userApi2Service.postWanParams(name);
}
}
這樣我們一個簡單的user-consumer(服務呼叫方),user-provider(服務提供方) 就創建好了
下面我們就來測驗一下
把專案都啟動起來
先訪問注冊中心地址,看看服務都注冊上去沒,http://localhost:7902/
發現里面有兩個服務,一個是我們寫的服務呼叫方,一個是我們寫的服務提供方,說明沒問題

接下來我們用請求服務呼叫方用Feign去調服務提供方的介面,服務呼叫方的埠我們配置的是8004,http://localhost:8004/getWan

可以訪問成功,說明我們用Feign去調,成功了,沒啥問題,接下來幾個我就不一一去請求了,有興趣的可以去試一試,
有疑問的小伙伴歡迎留言!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/263803.html
標籤:java
