Java遠程調用組件Feign技術使用詳解
一. 概要
我們知道,現在最火且最有技術含量的技術莫過于SpringCloud微服務了,所以今天壹哥就帶大家來學習一下微服務的核心的組件之一,Feign的基本使用及其工作機制。
二. Feign簡介
1. 概念
在學習Feign的使用之前,我們先來了解一下什么是Feign。
Feign是Netflix開發(fā)的聲明式(目前由Spring在維護)、模板化的HTTP客戶端, Feign可以幫助我們更快捷、優(yōu)雅地調用HTTP Api。
簡單地來說,Feign就是一個用于遠程調用服務的框架/工具,讓開發(fā)者可以更少耦合、更少代碼、更加快,也更兼容的方法進行遠程服務調用。
2. 功能
- Feign可插拔的注解支持,包括Feign注解和JAX-RS注解;
- Feign與Ribbon負載均衡器、Hystrix或Sentinel熔斷器無縫集成;
- Feign支持可插拔的HTTP編碼器和解碼器;
- Feign支持HTTP請求和響應的壓縮等。
了解了這些基本概念之后,接下來壹哥就帶大家看看Feign組件是如何實現遠程接口調用的。廢話少說,我們直接上代碼。
三. 服務提供者
1. 添加依賴
首先我們在父POM文件中添加核心依賴如下:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba-dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>然后在子POM文件添加依賴如下:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
2. 配置文件
application.yml文件中添加如下配置:
server:
port: 8090
spring:
application:
name: nacos-feign-example
cloud:
nacos:
discovery:
server-addr: 112.74.42.138:8848
3. 啟動類
項目的啟動類代碼如下:
@SpringBootApplication
public class NetflixFeignProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NetflixFeignProviderApplication.class, args);
}
}4. 控制層
我們可以編寫一個Controller控制器,將Web接口定義如下。
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
/**
* 模擬主鍵自增
*/
private AtomicInteger pk = new AtomicInteger();
@PostMappingpublic User save(@RequestBody User user) {
user.setUid(pk.incrementAndGet());
return user;
}
/**
* @param uid
* @return
*/@GetMapping("/{uid}")
public User user(@PathVariable("uid") int uid) {
return User.builder()
.uid(uid)
.username("admin")
.password("123456")
.build();
}
@GetMapping("/users")
public List<User> users(@RequestHeader("token") String token) {
// 模擬從數據中獲取數據
ArrayList<User> users = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
users.add(User.builder()
.uid(i)
.username(token + i)
.password("123456")
.build());
}
return users;
}
@DeleteMapping()
public int delete(int uid) {
log.info("刪除用戶: {} 成功", uid);
return 1;
}
}5. POJO
這里再定義一個pojo實體類。
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User implements Serializable {
private Integer uid;
private String username;
private String password;
}四. 服務消費者
1. 添加依賴
消費者服務的核心依賴如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>2. 配置文件
消費者服務的application.yml配置文件如下:
server:
port: 8091
spring:
cloud:
nacos:
discovery:
server-addr: 你的注冊中心IP:8848
application:
name: feign-example-01
3. 啟動類
消費者服務的啟動類代碼。
@SpringBootApplication
// 開啟Feign
@EnableFeignClients
public class NetflixFeignClientApplication {
public static void main(String[] args) {
SpringApplication.run(NetflixFeignClientApplication.class, args);
}
}這里也需要定義一個POJO類,代碼同上,此處略過。
4. Feign服務
此處我們需要定義一個Feign接口類。
@FeignClient(value = "test-feign-provider", path = "/user")
public interface UserFeignService {
@PostMapping("/")
User save(@RequestBody User user);
@GetMapping("/{uid}")
User detail(@PathVariable("uid") int uid);
@DeleteMappingUser delete(@RequestParam int uid);
@GetMapping("/users")
List<User> users(@RequestHeader("token") String token);
}5. 控制層
然后我們也需要在消費者服務中定義一個Controller接口。
@RestController
@RequestMapping("/feign")
public class FeignController {
@Resource
UserFeignService userFeignService;
/**
* 傳遞復雜的對象 json格式
* 127.0.0.1:8091/feign/register
*/@PostMapping("/register")
public User register(@RequestBody User user) {
return userFeignService.save(user);
}
/**
* 127.0.0.1:8091/feign/1
*/@GetMapping("/{uid}")
public User detail(@PathVariable int uid) {
return userFeignService.detail(uid);
}
/**
* 127.0.0.1:8091/feign/users
*
*/@GetMapping("/users")
public List<User> users(@RequestHeader String token) {
return userFeignService.users(token);
}
}代碼編寫完畢后,我們需要將服務提供者和服務消費者兩個項目都啟動起來,然后進行測試。
五. 測試
1. 測試get請求

2. 測試post請求json數據格式

3. 測試頭部中包含信息

通過測試我們就可以發(fā)現,測試我們已經實現了在服務消費者中原創(chuàng)調用服務提供者里的接口,從而實現了接口的遠程調用。
到此這篇關于Java遠程調用組件Feign技術使用詳解的文章就介紹到這了,更多相關Java Feign內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
springboot集成普羅米修斯(Prometheus)的方法
這篇文章主要介紹了springboot集成普羅米修斯(Prometheus)的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-08
mall整合SpringSecurity及JWT實現認證授權實戰(zhàn)
這篇文章主要為大家介紹了mall整合SpringSecurity及JWT實現認證授權實戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06
在springboot文件中如何創(chuàng)建mapper.xml文件
這篇文章主要介紹了在springboot文件中如何創(chuàng)建mapper.xml文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
Java報錯:UnsupportedOperationException in Collection
在Java編程中,UnsupportedOperationException是一種常見的運行時異常,通常在試圖對不支持的操作執(zhí)行修改時發(fā)生,它表示當前操作不被支持,本文將深入探討UnsupportedOperationException的產生原因,并提供具體的解決方案和最佳實踐,需要的朋友可以參考下2024-06-06

