Spring Boot整合Feign實現RPC調用,并通過Hystrix實現服務降級

feign/openfeign和dubbo是常用的微服務RPC框架,由于feigin內部已經集成ribbon,自帶了負載均衡的功能,當有多個同名的服務注冊到注冊中心時,會根據ribbon默認的負載均衡算法將請求分配到不同的服務。這篇文章就簡單介紹一下怎么使用feign來調用遠程的服務。

首先,需要有一個微服務注冊中心來提供服務注冊與發現,本章就使用nacos作為注冊中心。

Spring Boot整合Nacoshttps://blog.csdn.net/2501_92713943/article/details/150595053


目錄

一、服務提供者

1、創建項目

2、添加依賴

3、修改配置

4、創建接口

二、服務消費者

1、創建項目

2、添加依賴

3、修改配置

4、使用feign

創建接口

使用注解

調用接口

三、開啟Hystrix實現服務降級

1、開啟hystrix

bootstrap.yml

2、創建實現類

FeignServiceImpl.java

3、指定降級類

FeignService.java

4、測試降級功能

創建接口

UserController.java

正常訪問

服務降級


首先,要實現服務間的調用,需要有服務提供者和服務消費者,創建兩個項目,分別用于服務提供者和服務消費者。

一、服務提供者

1、創建項目

在IntelliJ IDEA中創建一個springboot項目provider

?

2、添加依賴

修改pom.xml,添加nacos注冊中心的依賴。

<?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.3.4.RELEASE</version></parent><groupId>cn.edu.sgu.www</groupId><artifactId>provider</artifactId><version>0.0.1-SNAPSHOT</version><description>Spring Boot整合Feign服務提供者項目</description><developers><developer><name>沐雨橙風ιε</name><roles><role>developer</role></roles><timezone>Asia/Shanghai</timezone></developer></developers><scm><url>https://gitee.com/muyu-chengfeng/provider.git</url></scm><properties><java.version>1.8</java.version></properties><dependencies><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><version>2.2.6.RELEASE</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.3.4.RELEASE</version></plugin></plugins></build>
</project>

3、修改配置

將配置文件application.properties重命名為bootstrap.yml,修改配置文件的內容。

server:port: 8088spring:application:name: providercloud:nacos:discovery:register-enabled: trueserver-addr: localhost:8848namespace: 030a5699-7f2f-4107-92a9-752655bda84e

4、創建接口

在項目根包下創建controller包,在controller包下創建一個UserController類,創建一個控制器接口/user/getUserInfo

package cn.edu.sgu.www.provider.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;/*** @author 沐雨橙風ιε* @version 1.0*/
@RestController
@RequestMapping(path = "/user", produces = "application/json;charset=utf-8")
public class UserController {@RequestMapping(value = "/getUserInfo", method = RequestMethod.GET)public Map<String, String> getUserInfo() {Map<String, String> resultMap = new HashMap<>();resultMap.put("age", "18");resultMap.put("name", "沐雨橙風ιε");resultMap.put("phone", "18888888888");resultMap.put("email", "h*****@163.com");return resultMap;}}

二、服務消費者

1、創建項目

在IntelliJ IDEA中創建一個springboot項目consumer

?

2、添加依賴

修改pom.xml,添加feign、nacos注冊中心的依賴。

<?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.3.4.RELEASE</version></parent><groupId>cn.edu.sgu.www</groupId><artifactId>consumer</artifactId><version>0.0.1-SNAPSHOT</version><description>Spring Boot整合Feign服務消費者項目</description><developers><developer><name>沐雨橙風ιε</name><roles><role>developer</role></roles><timezone>Asia/Shanghai</timezone></developer></developers><scm><url>https://gitee.com/muyu-chengfeng/consumer.git</url></scm><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.2.9.RELEASE</version></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2.2.6.RELEASE</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.3.4.RELEASE</version></plugin></plugins></build>
</project>

3、修改配置

將配置文件application.properties重命名為bootstrap.yml,修改配置文件的內容。

server:port: 8089feign:hystrix:enabled: falsespring:application:name: consumercloud:nacos:discovery:register-enabled: trueserver-addr: localhost:8848namespace: 030a5699-7f2f-4107-92a9-752655bda84e

4、使用feign

創建接口

在項目根包下創建feign包,在feign包下創建一個接口FeignService

package cn.edu.sgu.www.consumer.feign;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;import java.util.Map;/*** @author 沐雨橙風ιε* @version 1.0*/
@FeignClient("provider")
public interface FeignService {@RequestMapping(value = "/user/getUserInfo", method = RequestMethod.GET)Map<String, String> getUserInfo();
}

@FeignClient("provider")指定注冊到nacos的服務名,需要調用哪個服務的接口,就寫哪個。

直接把要調用的控制器接口的方法簽名連同@RequestMapping注解復制過來,然后修改一下請求路徑,在前面添加控制器類上指定的路徑/user

使用注解

這時候@Autowired會報錯,找不到FeignService的bean,因為沒有在啟動類上面添加@EnableFeignClients注解

package cn.edu.sgu.www.consumer;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;/*** @author 沐雨橙風ιε* @version 1.0*/
@EnableFeignClients
@SpringBootApplication
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}}

調用接口

依次啟動nacos服務器和provider項目,在測試類上調用FeignService的RPC接口方法。

package cn.edu.sgu.www.consumer;import cn.edu.sgu.www.consumer.feign.FeignService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.Map;/*** @author 沐雨橙風ιε* @version 1.0*/
@SpringBootTest
class ConsumerTests {@Autowiredprivate FeignService feignService;@Testvoid test() {Map<String, String> userInfo = feignService.getUserInfo();System.out.println(userInfo);}}

查看測試類運行結果,成功獲取并打印出了provider服務的/user/getUserInfo接口的返回值。

?

三、開啟Hystrix實現服務降級

1、開啟hystrix

bootstrap.yml

在comsumer項目的bootstrap.yml文件中添加以下配置

feign:hystrix:enabled: true

?完整的bootstrap.yml文件內容

server:port: 8089feign:hystrix:enabled: falsespring:application:name: consumercloud:nacos:discovery:register-enabled: trueserver-addr: localhost:8848namespace: 030a5699-7f2f-4107-92a9-752655bda84e

2、創建實現類

然后創建一個FeignService的實現類,交給spring管理。

FeignServiceImpl.java

package cn.edu.sgu.www.consumer.feign;import org.springframework.stereotype.Component;import java.util.HashMap;
import java.util.Map;/*** @author 沐雨橙風ιε* @version 1.0*/
@Component
public class FeignServiceImpl implements FeignService {@Overridepublic Map<String, String> getUserInfo() {Map<String, String> resultMap = new HashMap<>();resultMap.put("code", "404");resultMap.put("message", "服務請求失敗,已經執行降級方法!");return resultMap;}}

3、指定降級類

最后,在FeiginService接口的的@FeiginCilent注解上指定fallback=FeignServiceImpl.class

@FeignClient(value = "provider", fallback = FeignServiceImpl.class)

FeignService.java

package cn.edu.sgu.www.consumer.feign;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;import java.util.Map;/*** @author 沐雨橙風ιε* @version 1.0*/
@FeignClient(value = "provider", fallback = FeignServiceImpl.class)
public interface FeignService {@RequestMapping(value = "/user/getUserInfo", method = RequestMethod.GET)Map<String, String> getUserInfo();
}

4、測試降級功能

創建接口

UserController.java

把UserController.java從provider項目中連同controller包復制過來,修改接口的代碼,調用FeignService的方法。

package cn.edu.sgu.www.consumer.controller;import cn.edu.sgu.www.consumer.feign.FeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;import java.util.Map;/*** @author 沐雨橙風ιε* @version 1.0*/
@RestController
@RequestMapping(path = "/user", produces = "application/json;charset=utf-8")
public class UserController {private final FeignService feignService;@Autowiredpublic UserController(FeignService feignService) {this.feignService = feignService;}@RequestMapping(value = "/getUserInfo", method = RequestMethod.GET)public Map<String, String> getUserInfo() {return feignService.getUserInfo();}}

正常訪問

啟動consumer項目,在瀏覽器地址欄輸入以下網址。

http://localhost:8089/user/getUserInfo

可以看到正常返回了數據。

?

服務降級

接著關掉provider項目,刷新頁面,成功執行降級方法,返回了錯誤提示。

?


好了,springboot整合feign的介紹到這里了,

文章代碼已上傳到Gitee,可按需獲取~


服務提供者

Spring Boot整合Feign服務提供者項目https://gitee.com/muyu-chengfeng/provider.git服務消費者

Spring Boot整合Feign服務消費者項目https://gitee.com/muyu-chengfeng/consumer.git


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/96438.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/96438.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/96438.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java 性能優化實戰(三):并發編程的 4 個優化維度

在多核CPU時代&#xff0c;并發編程是提升Java應用性能的關鍵手段&#xff0c;但不合理的并發設計反而會導致性能下降、死鎖等問題。本文將聚焦并發編程的四個核心優化方向&#xff0c;通過真實案例和代碼對比&#xff0c;帶你掌握既能提升性能又能保證線程安全的實戰技巧。 一…

【秋招筆試】2025.08.19百度秋招機考第一套

?? 點擊直達筆試專欄 ??《大廠筆試突圍》 ?? 春秋招筆試突圍在線OJ ?? 筆試突圍在線刷題 bishipass.com 題目一:花園路徑優化問題 1??:使用棧維護必須保留的觀景點,基于三角不等式判斷 2??:貪心策略,檢查中間點是否為"轉折點" 3??:時間復雜度 …

SmartX 用戶建云實踐|某人壽保險:從開發測試、核心生產到信創轉型,按需推進企業云建設

某人壽保險自 2018 年起開始探索基于 SmartX 超融合架構搭建私有云 IaaS 資源池&#xff0c;先后部署了開發測試業務、生產業務和重要生產業務的 Oracle 數據庫&#xff08;含 RAC&#xff09;&#xff0c;并探索了基于海光芯片的信創云搭建&#xff0c;最終以基于超融合架構的…

通道注意力機制|Channel Attention Neural Network

一、通道注意力機制 論文&#xff1a;ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks 近年來&#xff0c;通道注意力機制在提高深度卷積神經網絡CNN的性能方面顯示出了巨大潛力。然而&#xff0c;大多數現有方法致力于開發更復雜的注意力模塊&a…

構建包含IK插件(中文分詞插件)的Elasticsearch鏡像

#!/bin/bash# 定義變量 ES_VERSION"8.15.3" IMAGE_NAME"elasticsearch-with-ik:${ES_VERSION}" IK_PLUGIN_DIR"./elasticsearch-analysis-ik-${ES_VERSION}" DOCKERFILE_NAME"Dockerfile.es-ik"# 檢查IK插件目錄是否存在 if [ ! -d &q…

Linux虛擬機安裝FTP

文章目錄深入理解FTP&#xff1a;從原理到實戰配置&#xff08;以VSFTP為例&#xff09;一、FTP基礎&#xff1a;你需要知道的核心概念1.1 什么是FTP&#xff1f;1.2 FTP的“雙端口”機制1.3 為什么選擇VSFTP&#xff1f;二、FTP的兩種工作模式&#xff1a;主動與被動2.1 主動模…

開源版CRM客戶關系管理系統源碼包+搭建部署教程

在數字化轉型的浪潮下&#xff0c;客戶關系管理&#xff08;CRM&#xff09;成為企業提升競爭力的關鍵工具。為滿足開發者和企業對個性化 CRM 系統的需求&#xff0c;分享一款開源版 CRM 客戶關系管理系統&#xff0c;其源碼涵蓋前臺、后臺及 Uniapp 源代碼&#xff0c;支持快速…

基于“R語言+遙感“水環境綜合評價方法技術應用——水線提取、水深提取、水溫提、水質提取、水環境遙感等

一&#xff1a;R語言1.1 R語言特點&#xff08;R語言&#xff09;1.2 安裝R&#xff08;R語言&#xff09;1.3 安裝RStudio&#xff08;R語言&#xff09;&#xff08;1&#xff09;下載地址&#xff08;2&#xff09;安裝步驟&#xff08;3&#xff09;軟件配置1.4 第一個程序…

MCP 與 Function Calling 打開真實世界的兩種“母體”方式

AI Agent的互動之言&#xff1a;當人工智能需要獲取實時信息或與外部環境進行交互時&#xff0c;它依賴于特定的技術機制來實現。本文將以通俗易懂的方式&#xff0c;深入解析MCP&#xff08;模型調用協議&#xff09;與函數調用的核心概念&#xff0c;比較二者的異同&#xff…

Ansys Motor-CAD:概述(EMag、THERM、LAB、MECH)

你好&#xff0c;在這篇博客中&#xff0c;我概述了如何使用 Ansys Motor-CAD 模型、模擬、分析和后處理結果來評估電機性能&#xff0c;并幫助您為您的應用選擇優化的電機&#xff0c;并通過電機設計選擇實現成本效益和效率。我介紹了各種可用的電機類型、可供選擇的物理模塊和…

AI + 金融領域 + 落地典型案例

目錄 一、美國銀行智能客服與風控體系 &#xff1a; 1. 推出了虛擬助手 Erica&#xff0c; 2. 構建了先進的風險評估模型&#xff0c; 二、財躍星辰與國泰海通、上海銀行合作項目&#xff1a; 1. 投教 AI 助手、投顧 AI 助手、托管 AI 助手 2. AI 手機銀行&#xff0c;對…

項目管理進階——研發項目組織管理制度

第一條 目的 為規范企業的新技術研發、技術創新工作,加強企業項目開發和技術創新能力,應用高新技術提高企業的整體市場競爭力和經濟效益,實施公司“科技興企”的重要決策,根據公司具體情況,特制定本辦法。 第二條 范圍 本辦法適用于以增強自主創新能力和促進企業高新技…

深度學習:入門簡介

深度學習&#xff08;Deep Learning, DL&#xff09;是機器學習&#xff08;Machine Learning, ML&#xff09;的一個重要分支&#xff0c;核心是通過模擬人類大腦神經元的連接方式&#xff0c;構建多層神經網絡來自動學習數據中的特征和規律&#xff0c;最終實現預測、分類、生…

switch搖桿JoyCon搖桿研究,碳膜搖桿、霍爾電磁搖桿

https://blog.csdn.net/qq_28145393/article/details/125769568 https://zhuanlan.zhihu.com/p/1925522678263056352 插件DIP 碳膜搖桿 6腳&#xff0c;內部兩個滑動變阻器&#xff0c;1個按鍵。 引腳定義如下&#xff1a;1腳AD1、2腳按鍵GND、3腳按鍵、4腳AD2、5腳變阻器GND、…

保護 PDF 格式:禁止轉換為其他格式文件

在日常辦公中&#xff0c;PDF是很常見的文件格式。有時候為了方便編輯&#xff0c;我們會將PDF轉換成其他格式文件&#xff0c;比如Word、PPT等&#xff1b;但有時候出于安全考慮&#xff0c;我們又不希望PDF可以隨意轉換成其他格式文件。那如何禁止轉換格式呢&#xff1f;其實…

docker 打包

目錄 構建docker容器 使用 Dockerfile 構建自定義鏡像 構建docker容器 docker images docker pull pytorch/torchserve:latest-gpu docker imagesdocker run -d --rm --gpus all --name torchserve-dev-bg -u $(id -u):$(id -g) -v /nas:/nas pytorch/torchserve:latest /bi…

云原生俱樂部-k8s知識點歸納(7)

計劃是再更兩篇就完結k8s系列&#xff0c;其中CRD客戶端資源定義會單獨列一篇&#xff0c;或許會講一講operator。不過當前的k8s并沒有細講operator&#xff0c;因為涉及到很多的go語言內容&#xff0c;以及相關的package的方法。這一部分主要就是講一講k8s如何進行監控和升級&…

c語言之進程函數

1. 進程創建#include <sys/types.h>#include <unistd.h>pid_t fork(void);fork 創建一個新進程fork() creates a new process by duplicating the calling process. The new process is referred to as the child process. The calling process is refe…

學習python第12天

今日任務&#xff1a;DataFrameDataFrame的構造pandas.DataFrame(dataNone, indexNone, columnsNone, dtypeNone, copyFalse)參數說明&#xff1a;data&#xff1a;DataFrame 的數據部分&#xff0c;可以是字典、二維數組、Series、DataFrame 或其他可轉換為 DataFrame 的對象。…

C++顯示類型轉換運算符static_cast使用指南

這是一篇關于 static_cast 用法的文章。本文會從基礎概念到常見應用場景全覆蓋&#xff0c;并附上代碼示例以方便理解。C 中的 static_cast 用法詳解 在 C 中&#xff0c;static_cast 是一種顯式類型轉換運算符&#xff0c;主要用于在編譯期進行類型安全的轉換。相比 C 風格的強…