SpringCloud 集成 OpenFeign 实战指南

在微服务架构中,服务间的通信是至关重要的。SpringCloud作为一个功能强大的微服务框架,为我们提供了多种服务间通信的方式。其中,OpenFeign是一个声明式的Web服务客户端,它使得编写Web服务客户端变得更加简单。本文将详细介绍如何在SpringCloud项目中集成和使用OpenFeign。

一、引言

在微服务架构中,服务间的调用是不可避免的。传统的HTTP客户端调用方式需要手动处理请求和响应,代码冗长且容易出错。而OpenFeign则提供了一种声明式的方式,通过简单的接口注解就可以实现服务间的调用,大大简化了开发过程。

二、引入OpenFeign依赖

首先,我们需要在Spring Boot项目的pom.xml文件中引入OpenFeign的依赖。

<dependency>  
    <groupId>org.springframework.cloud</groupId>  
    <artifactId>spring-cloud-starter-openfeign</artifactId>  
</dependency>

三、定义Feign客户端接口

远程服务 Controller

@RestController
@RequestMapping("/provider")
public class ProviderController extends BaseController {
    
	
	@GetMapping("/endpoint")  
    String getData(@RequestParam("param") String param){
		//方法实现
		String result = "方法实现...";
		return result;
	}
	
}

接下来,我们需要定义一个Feign客户端接口,用于声明要调用的远程服务的API。

@FeignClient(name = "service-provider", url = "http://localhost:8081")  
public interface ProviderClient {  
  
    @GetMapping("/provider/endpoint")  
    String getProviderData(@RequestParam("param") String param);  
}

在上面的代码中,@FeignClient注解用于标识这是一个Feign客户端,name属性用于指定服务名称(在使用服务发现时使用),url属性用于直接指定服务地址(在不使用服务发现时使用)。接口中的方法使用了Spring MVC的注解来定义远程服务的API路径和请求方式。

@FeignClient 主要属性与功能

  • name/value
    用于指定FeignClient的名称,这个名称将会被注册到服务发现中心,并用于服务的发现。
    在Spring容器中创建FeignClient的Bean时,默认使用类名的简单名称 作为Bean的名称,但可以通过name/value属性进行自定义。
  • url
    用于直接指定Feign客户端调用的地址
    如果配置了url属性,那么Feign客户端将直接使用该地址进行请求,而不是通过服务发现组件查找服务地址。
    url属性的优先级比name属性高。
  • path
    用于指定Feign客户端的每个方法的基础路径。
    这个路径将被添加到每个方法调用的URL中,从而避免了在每个方法中都指定完整的URL路径。
  • configuration
    允许指定一个配置类,用于自定义Feign客户端的配置。
    通过这个配置类,可以自定义Feign的Encoder(编码器)、Decoder(解码器)、LogLevel(日志级别)、Contract(契约)等属性。
  • contextId
    用于指定Feign客户端的上下文ID。
    在一个应用中可能存在多个Feign客户端,通过contextId可以为每个客户端指定一个唯一的上下文ID。
    这有助于在Spring容器中区分不同的Feign客户端Bean。
  • decode404
    布尔值,默认是false。
    表示对于一个HTTP状态码为404的请求是否需要进行解码。
    默认为false时,表示不进行解码,将404状态码当作一个异常处理。
    设置为true后,遇到HTTP状态码为404的Response时,还是会解析请求的body。
  • fallback/fallbackFactory
    用于指定当Feign客户端请求失败时的回退处理逻辑。
    • fallback参数可以直接指定回退处理的类,该类需要实现FeignClient对应的接口。
    • fallbackFactory则是一个工厂类,用于创建回退处理类的实例。factory类可以获取异常信息,因此更推荐使用fallbackFactory来定义容错类。

例如:

  • Feign客户端接口
@FeignClient(contextId = "providerClient", value = "provider-client", fallbackFactory = ProviderClientFallbackFactory.class)
public interface ProviderClient {  
  
    @GetMapping("/provider/endpoint")  
    String getProviderData(@RequestParam("param") String param);  
}
  • 回调方法
@Component
public class ProviderClientFallbackFactory implements FallbackFactory<ProviderClient> {
    private static final Logger log = LoggerFactory.getLogger(ProviderClientFallbackFactory.class);

    @Override
    public ProviderClient create(Throwable throwable) {
        log.error("日志服务调用失败:{}", throwable.getMessage());
        return new ProviderClient() {
            @Override
            public String getProviderData(String param){
				return null;
			}
        };

    }
}

四、启用Feign客户端

在Spring Boot的启动类上添加@EnableFeignClients注解,以启用Feign客户端功能。

@SpringBootApplication  
@EnableFeignClients  
public class ConsumerApplication {  
  
    public static void main(String[] args) {  
        SpringApplication.run(ConsumerApplication.class, args);  
    }  
}

五、配置服务发现(可选)

如果使用服务发现(如Eureka、Nacos等),需要在配置文件中指定服务发现的相关信息。
例如,对于Eureka:

eureka:  
  client:  
    service-url:  
      defaultZone: http://localhost:8761/eureka/

对于Nacos:

spring:  
  cloud:  
    nacos:  
      discovery:  
        server-addr: <nacos-server-address>  # Nacos 服务器的地址,例如:127.0.0.1:8848  
        namespace: <optional-namespace>      # 可选的命名空间,用于区分不同的环境或租户  
        cluster-name: <optional-cluster-name> # 可选的集群名称

在使用服务发现时,你可以将@FeignClient注解中的url属性移除,并仅保留name属性。

六、使用Feign客户端

现在,我们可以在Spring Bean中注入Feign客户端,并使用它来调用远程服务。

@Service  
public class ConsumerService {  
  
    @Autowired  
    private ProviderClient providerClient;  
  
    public String getData(String param) {  
        return providerClient.getProviderData(param);  
    }  
}

七、配置与优化

通过配置文件或Java配置类来优化Feign客户端的行为。例如,设置超时时间、重试机制、日志级别等。

feign:  
  client:  
    config:  
      default:  
        connectTimeout: 5000 # 连接超时时间(毫秒)  
        readTimeout: 10000 # 读取超时时间(毫秒)  
        loggerLevel: full # 日志级别

或者通过Java配置类:

@Configuration  
public class FeignConfig {  
  
    @Bean  
    public Request.Options requestOptions() {  
        return new Request.Options(5000, 10000); // 设置连接超时和读取超时时间  
    }  
  
    @Bean  
    public Logger.Level feignLoggerLevel() {  
        return Logger.Level.FULL; // 设置日志级别  
    }  
}

八、处理容错与熔断

为了增强系统的健壮性,可以为Feign客户端配置熔断器。SpringCloud提供了Hystrix和Resilience4j等熔断器实现。这里以Hystrix为例:

首先,在pom.xml中引入Hystrix依赖:

<dependency>  
    <groupId>org.springframework.cloud</groupId>  
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>  
</dependency>

然后,在启动类上启用Hystrix:

@SpringBootApplication  
@EnableFeignClients  
@EnableHystrix  
public class ConsumerApplication {  
    // ...  
}

接着,为Feign客户端配置熔断回退逻辑:

@FeignClient(name = "service-provider", fallback = ProviderClientFallback.class)  
public interface ProviderClient {  
    // ...  
}  
  
@Component  
public class ProviderClientFallback implements ProviderClient {  
  
    @Override  
    public String getProviderData(String param) {  
        // 熔断后的回退逻辑  
        return "Fallback response";  
    }  
}

注意:从Spring Cloud 2020.0(对应Spring Boot 2.4.x)开始,官方已经不再推荐使用Netflix的Hystrix,而是推荐使用Resilience4j等更现代的熔断器库。

九、总结

通过本文的介绍,我们了解了如何在SpringCloud项目中集成和使用OpenFeign进行远程服务调用。OpenFeign提供了一种声明式的方式,大大简化了服务间调用的开发过程。同时,我们也学习了如何配置和优化Feign客户端,以及如何处理容错与熔断。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/890415.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

仿IOS桌面悬浮球(支持拖拽、自动吸附、自动改变透明度与点击、兼容PC端与移动端)

使用 pointerdown/pointermove/pointerup 实现仿IOS桌面悬浮球效果&#xff0c;支持拖拽、指定拖拽选对容器&#xff0c;指定拖拽安全区、自动吸附、自动改变透明度与点击&#xff0c;兼容PC端与移动端。 效果展示 https://code.juejin.cn/pen/7423757568268304421 代码实现 …

计算机网络:数据链路层 —— PPP 点对点协议

文章目录 PPP 帧PPP帧的格式PPP帧的透明传输面向字节的异步链路面向比特的同步链路 PPP帧的差错检测 PPP 的工作状态 点对点协议&#xff08;Point-to-Point Protocol&#xff0c;PPP&#xff09;是目前使用最广泛的点对点数据链路层协议&#xff0c;用于在两个节点之间进行数据…

双目视觉搭配YOLO实现3D测量

一、简介 双目&#xff08;Stereo Vision&#xff09;技术是一种利用两个相机来模拟人眼视觉的技术。通过对两个相机获取到的图像进行分析和匹配&#xff0c;可以计算出物体的深度信息。双目技术可以实现物体的三维重建、距离测量、运动分析等应用。 双目技术的原理是通过两…

【最新华为OD机试E卷-支持在线评测】英文输入法(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

大数据-158 Apache Kylin 安装配置详解 集群模式启动

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

多态常见面试问题

1、什么是多态&#xff1f; 多态&#xff08;Polymorphism&#xff09;是面向对象编程中的一个重要概念&#xff0c;它允许同一个接口表现出不同的行为。在C中&#xff0c;多态性主要通过虚函数来实现&#xff0c;分为编译时多态&#xff08;静态多态&#xff09;和运行时多态…

Qt事件——鼠标事件

通过label来显示各种事件 鼠标按下事件 //按下显示坐标 void MyLabel::mousePressEvent(QMouseEvent * ev) {int i ev->x();int j ev->y();//判断按下的鼠标键位if (ev->button() Qt::LeftButton) {qDebug() << "LeftButton";}else if (ev->bu…

HAL库常用的函数:

目录 HAL库&#xff1a; 1.GPIO常用函数&#xff1a; 1.HAL_GPIO_ReadPin( ) 2.HAL_GPIO_WritePin( ) 3.HAL_GPIO_TogglePin( ) 4.HAL_GPIO_EXTI_IRQHandler( ) 5.HAL_GPIO_EXTI_Callback( ) 2.UART常用函数&#xff1a; 1.HAL_U…

数通--3

一、动态路由 内部 路由器之间要互联互通&#xff0c;必须遵循相同的协议 企业内部用 IGP&#xff0c;企业之间用BGP RIP&#xff08;已淘汰&#xff0c;不考&#xff09; 距离就是长短&#xff0c;矢量就是方向&#xff0c;即路由的出接口 一台路由器 A 配好RIP&#xff0c;…

JavaWeb 17.过滤器

目录 一、过滤器概述 生活举例&#xff1a;公司前台&#xff0c;停车场安保系统&#xff0c;地铁检票闸机 过滤器开发中应用场景 过滤器工作位置图解 Filter接口API&#xff1a; 二、过滤器过滤过程图解 三、过滤器生命周期 四、过滤器链的使用 工作流程图解 注解方式配置过滤…

map和set(一)

首先模拟一下key形式类 使用的结构是搜索二叉树 结点中有左孩子和右孩子 还有一个存储的值 template <class K>struct BSTnode//搜索二叉树不支持修改 中序遍历是有序的{K _key;BSTnode<K>* _left;BSTnode<K>* _right;BSTnode(const K& key):_key(key…

网络资源模板--Android Studio 实现记事本App

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--基于Android studio 实现的记事本App 二、项目测试环境 三、项目详情 首页 显示笔记列表&#xff1a;使用 ListView 显示从数据库中查询到的笔记内容。搜索功能&#xff…

web-105linux权限提升

rsync未授权本地覆盖 Rsync 是 linux 下一款数据备份工具&#xff0c;默认开启 873 端口 https://vulhub.org/#/environments/rsync/common/ 借助 Linux 默认计划任务调用/etc/cron.hourly&#xff0c;利用 rsync 连接覆盖 前提条件就是需要知道rsync的密码或者存在未授权 -提…

Java微信支付接入(6) - API V3 Native 支付通知API

官方文档&#xff1a;https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_5.shtml 通知规则&#xff1a;用户支付完成后&#xff0c;微信会把相关支付结果和用户信息发送给商户&#xff0c;商户需要接收处理该消息&#xff0c;并返回应答。对后台通知交互时&#xff0c…

如何解决 Vim 中的 “E212: Can‘t open file for writing“ 错误:从编辑到权限管理(sudo)

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

第十五届蓝桥杯C++B组省赛

文章目录 1.握手问题解题思路1&#xff08;组合数学&#xff09;解题思路2&#xff08;暴力枚举&#xff09; 2.小球反弹做题思路 3.好数算法思路&#xff08;暴力解法&#xff09;---不会超时 4.R格式算法思路 5.宝石组合算法思路---唯一分解定理 6.数字接龙算法思路----DFS 7…

TinyOS 点对基站通信

文章目录 一、前言1.1 发包的BlinkToRadio的数据包格式 二、混淆基站源码分析2.1 Makefile2.2 组件连接2.3 主逻辑代码 一、前言 1.1 发包的BlinkToRadio的数据包格式 如下&#xff0c;注意&#xff1a;AM层类型(1byte)即handlerID使可以在组件中修改的。 二、混淆基站源码…

uniapp学习(004-1 组件 Part.2生命周期)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第31p-第p35的内容 文章目录 组件生命周期我们主要使用的三种生命周期setup(创建组件时执行)不可以操作dom节点…

使用 three.js和 shader 实现一个五星红旗 飘扬得着色器

使用 three.js和 shader 实现一个五星红旗 飘扬得着色器 源链接&#xff1a;https://threehub.cn/#/codeMirror?navigationThreeJS&classifyshader&idchinaFlag 国内站点预览&#xff1a;http://threehub.cn github地址: https://github.com/z2586300277/three-ce…

python异常检测 - 随机离群选择Stochastic Outlier Selection (SOS)

python异常检测 - Stochastic Outlier Selection (SOS) 前言 随机离群选择SOS算法全称stochastic outlier selection algorithm. 该算法的作者是jeroen janssens. SOS算法是一种无监督的异常检测算法. 随机离群选择SOS算法原理 随机离群选择SOS算法的输入: 特征矩阵(featu…