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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 风格的强…