Java遠(yuǎn)程調(diào)用組件Feign技術(shù)使用詳解
一. 概要
我們知道,現(xiàn)在最火且最有技術(shù)含量的技術(shù)莫過(guò)于SpringCloud微服務(wù)了,所以今天壹哥就帶大家來(lái)學(xué)習(xí)一下微服務(wù)的核心的組件之一,F(xiàn)eign的基本使用及其工作機(jī)制。
二. Feign簡(jiǎn)介
1. 概念
在學(xué)習(xí)Feign的使用之前,我們先來(lái)了解一下什么是Feign。
Feign是Netflix開(kāi)發(fā)的聲明式(目前由Spring在維護(hù))、模板化的HTTP客戶端, Feign可以幫助我們更快捷、優(yōu)雅地調(diào)用HTTP Api。
簡(jiǎn)單地來(lái)說(shuō),F(xiàn)eign就是一個(gè)用于遠(yuǎn)程調(diào)用服務(wù)的框架/工具,讓開(kāi)發(fā)者可以更少耦合、更少代碼、更加快,也更兼容的方法進(jìn)行遠(yuǎn)程服務(wù)調(diào)用。
2. 功能
- Feign可插拔的注解支持,包括Feign注解和JAX-RS注解;
- Feign與Ribbon負(fù)載均衡器、Hystrix或Sentinel熔斷器無(wú)縫集成;
- Feign支持可插拔的HTTP編碼器和解碼器;
- Feign支持HTTP請(qǐng)求和響應(yīng)的壓縮等。
了解了這些基本概念之后,接下來(lái)壹哥就帶大家看看Feign組件是如何實(shí)現(xiàn)遠(yuǎn)程接口調(diào)用的。廢話少說(shuō),我們直接上代碼。
三. 服務(wù)提供者
1. 添加依賴
首先我們?cè)诟窹OM文件中添加核心依賴如下:
<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. 啟動(dòng)類(lèi)
項(xiàng)目的啟動(dòng)類(lèi)代碼如下:
@SpringBootApplication public class NetflixFeignProviderApplication { public static void main(String[] args) { SpringApplication.run(NetflixFeignProviderApplication.class, args); } }
4. 控制層
我們可以編寫(xiě)一個(gè)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) { // 模擬從數(shù)據(jù)中獲取數(shù)據(jù) 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
這里再定義一個(gè)pojo實(shí)體類(lèi)。
@Data @AllArgsConstructor @NoArgsConstructor @Builder public class User implements Serializable { private Integer uid; private String username; private String password; }
四. 服務(wù)消費(fèi)者
1. 添加依賴
消費(fèi)者服務(wù)的核心依賴如下:
<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. 配置文件
消費(fèi)者服務(wù)的application.yml配置文件如下:
server:
port: 8091
spring:
cloud:
nacos:
discovery:
server-addr: 你的注冊(cè)中心IP:8848
application:
name: feign-example-01
3. 啟動(dòng)類(lèi)
消費(fèi)者服務(wù)的啟動(dòng)類(lèi)代碼。
@SpringBootApplication // 開(kāi)啟Feign @EnableFeignClients public class NetflixFeignClientApplication { public static void main(String[] args) { SpringApplication.run(NetflixFeignClientApplication.class, args); } }
這里也需要定義一個(gè)POJO類(lèi),代碼同上,此處略過(guò)。
4. Feign服務(wù)
此處我們需要定義一個(gè)Feign接口類(lèi)。
@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. 控制層
然后我們也需要在消費(fèi)者服務(wù)中定義一個(gè)Controller接口。
@RestController @RequestMapping("/feign") public class FeignController { @Resource UserFeignService userFeignService; /** * 傳遞復(fù)雜的對(duì)象 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); } }
代碼編寫(xiě)完畢后,我們需要將服務(wù)提供者和服務(wù)消費(fèi)者兩個(gè)項(xiàng)目都啟動(dòng)起來(lái),然后進(jìn)行測(cè)試。
五. 測(cè)試
1. 測(cè)試get請(qǐng)求
2. 測(cè)試post請(qǐng)求json數(shù)據(jù)格式
3. 測(cè)試頭部中包含信息
通過(guò)測(cè)試我們就可以發(fā)現(xiàn),測(cè)試我們已經(jīng)實(shí)現(xiàn)了在服務(wù)消費(fèi)者中原創(chuàng)調(diào)用服務(wù)提供者里的接口,從而實(shí)現(xiàn)了接口的遠(yuǎn)程調(diào)用。
到此這篇關(guān)于Java遠(yuǎn)程調(diào)用組件Feign技術(shù)使用詳解的文章就介紹到這了,更多相關(guān)Java Feign內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
jackson序列化和反序列化的應(yīng)用實(shí)踐指南
這篇文章主要給大家介紹了關(guān)于jackson序列化和反序列化的應(yīng)用實(shí)踐指南,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09springboot對(duì)壓縮請(qǐng)求的處理方法
這篇文章主要介紹了springboot對(duì)壓縮請(qǐng)求的處理,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05springboot集成普羅米修斯(Prometheus)的方法
這篇文章主要介紹了springboot集成普羅米修斯(Prometheus)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08mall整合SpringSecurity及JWT實(shí)現(xiàn)認(rèn)證授權(quán)實(shí)戰(zhàn)
這篇文章主要為大家介紹了mall整合SpringSecurity及JWT實(shí)現(xiàn)認(rèn)證授權(quán)實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06在springboot文件中如何創(chuàng)建mapper.xml文件
這篇文章主要介紹了在springboot文件中如何創(chuàng)建mapper.xml文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01Java報(bào)錯(cuò):UnsupportedOperationException in Collection
在Java編程中,UnsupportedOperationException是一種常見(jiàn)的運(yùn)行時(shí)異常,通常在試圖對(duì)不支持的操作執(zhí)行修改時(shí)發(fā)生,它表示當(dāng)前操作不被支持,本文將深入探討UnsupportedOperationException的產(chǎn)生原因,并提供具體的解決方案和最佳實(shí)踐,需要的朋友可以參考下2024-06-06Java中使用數(shù)組實(shí)現(xiàn)棧數(shù)據(jù)結(jié)構(gòu)實(shí)例
這篇文章主要介紹了Java中使用數(shù)組實(shí)現(xiàn)棧數(shù)據(jù)結(jié)構(gòu)實(shí)例,本文先是講解了實(shí)現(xiàn)棧至少應(yīng)該包括以下幾個(gè)方法等知識(shí),然后給出代碼實(shí)例,需要的朋友可以參考下2015-01-01