当前位置: 首页 > news >正文

OpenFeign 的实现原理详解

前言

OpenFeign 是一个声明式的 HTTP 客户端,它简化了服务间的 HTTP 调用。通过简单的注解和接口定义,开发者可以轻松调用远程服务,而无需手动编写复杂的 HTTP 请求代码。本文将深入探讨 OpenFeign 的实现原理,并结合源码分析其核心机制,最后通过流程图直观展示其工作流程。


一、OpenFeign 的核心概念

  1. 声明式接口
    使用 OpenFeign 时,开发者只需要定义一个接口,并在方法上添加注解(如 @RequestMapping),OpenFeign 会根据这些注解动态生成 HTTP 请求。

  2. 动态代理
    OpenFeign 的核心是基于 JDK 动态代理实现的。它会在运行时为接口生成代理对象,代理对象负责处理接口方法调用并将其转换为 HTTP 请求。

  3. 编码与解码
    OpenFeign 提供了编码器(Encoder)和解码器(Decoder),用于将 Java 对象序列化为 HTTP 请求体以及反序列化响应内容。

  4. 拦截器
    支持请求拦截器(RequestInterceptor),可以在发送请求前对请求进行修改,如添加认证信息。

  5. 负载均衡
    集成了 Ribbon 或 Spring Cloud LoadBalancer,支持客户端负载均衡。


二、OpenFeign 的工作流程

以下是 OpenFeign 的核心工作流程:

  1. 定义接口
    开发者定义一个带有注解的接口,例如:

    @FeignClient(name = "example-service", url = "http://example.com")
    public interface ExampleClient {@GetMapping("/api/resource/{id}")String getResource(@PathVariable("id") String id);
    }
    
  2. 动态代理生成
    当应用程序启动时,Spring 容器会扫描 @FeignClient 注解的接口,并为其生成动态代理对象。

  3. 方法调用拦截
    当调用接口方法时,动态代理对象会拦截调用,并解析方法签名和注解,生成对应的 HTTP 请求。

  4. 请求执行
    OpenFeign 将生成的 HTTP 请求发送到目标服务,并接收响应。

  5. 响应处理
    响应数据通过解码器转换为 Java 对象并返回给调用方。


三、源码分析

以下是从源码层面分析 OpenFeign 的核心实现:

1. 接口扫描与动态代理生成

在 Spring Boot 应用中,@EnableFeignClients 注解会触发 FeignClientsRegistrar 类的执行。该类负责扫描所有标注了 @FeignClient 的接口,并为其注册 Bean。

public void registerFeignClients(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);scanner.addIncludeFilter(new AnnotationTypeFilter(FeignClient.class));// 扫描 @FeignClient 接口并注册 Bean
}

当接口被扫描到后,Spring 容器会使用 FeignClientFactoryBean 创建动态代理对象。

@Override
public Object getObject() throws Exception {return getTarget();
}<T> T getTarget() {FeignContext context = this.applicationContext.getBean(FeignContext.class);Feign.Builder builder = feign(context);return (T) builder.target(target);
}

最终,Feign.Builder 会生成一个动态代理对象,代理对象的核心逻辑由 ReflectiveFeign 实现。

2. 动态代理的核心逻辑

ReflectiveFeign 是 OpenFeign 的核心类之一,它负责生成代理对象并处理方法调用。以下是关键代码片段:

public <T> T newInstance(Target<T> target) {Map<String, MethodHandler> nameToHandler = targetToHandlersByName.apply(target);InvocationHandler handler = new ReflectiveFeign.FeignInvocationHandler(target, nameToHandler);return (T) Proxy.newProxyInstance(target.type().getClassLoader(), new Class<?>[] {target.type()}, handler);
}
  • InvocationHandler 是动态代理的核心,它会拦截接口方法调用。
  • MethodHandler 负责具体的方法调用逻辑,包括解析注解、构建 HTTP 请求等。

3. 请求构建与执行

当接口方法被调用时,SynchronousMethodHandler 会负责具体的请求构建和执行逻辑:

@Override
public Object invoke(Object[] argv) throws Throwable {RequestTemplate template = buildTemplateFromArgs.create(argv);Request request = targetRequest(template);Response response = client.execute(request, options);return decode(response);
}
  • buildTemplateFromArgs 负责根据方法参数和注解生成请求模板。
  • client.execute 负责实际发送 HTTP 请求。
  • decode 负责将响应数据转换为 Java 对象。

四、 流程图

以下是 OpenFeign 的工作流程图:

用户 Feign接口定义 动态代理(内部处理) HTTP客户端 远程服务 调用Feign接口中的方法 请求被动态代理截获 根据方法注解构建并发送HTTP请求 发送请求到远程服务 接收响应数据 返回响应给动态代理 返回结果给用户代码 用户 Feign接口定义 动态代理(内部处理) HTTP客户端 远程服务

五、总结

OpenFeign 的核心思想是通过动态代理和注解简化 HTTP 调用。它的实现依赖于以下几个关键点:

  1. 动态代理:基于 JDK 动态代理生成接口的实现类。
  2. 方法拦截:通过 InvocationHandler 拦截接口方法调用。
  3. 请求构建:根据方法签名和注解生成 HTTP 请求。
  4. 请求执行:通过底层 HTTP 客户端(如 OkHttp、Apache HttpClient)发送请求并接收响应。
  5. 响应处理:通过解码器将响应数据转换为 Java 对象。

通过源码分析和流程图,我们可以清晰地看到 OpenFeign 的工作原理及其设计理念。希望本文能帮助你更好地理解 OpenFeign 的实现机制!

相关文章:

OpenFeign 的实现原理详解

前言 OpenFeign 是一个声明式的 HTTP 客户端&#xff0c;它简化了服务间的 HTTP 调用。通过简单的注解和接口定义&#xff0c;开发者可以轻松调用远程服务&#xff0c;而无需手动编写复杂的 HTTP 请求代码。本文将深入探讨 OpenFeign 的实现原理&#xff0c;并结合源码分析其核…...

const关键字理解

const关键字主要的作用是告诉编译器这个东西是个常量&#xff0c;不可被修改。 或者是用来和指针玩一些奇奇怪怪的东西&#xff0c;这玩意面试八股文常青树。 const int* p&#xff1a;//表示指针指向的内容不能更改&#xff0c;指针可以更改。 int* const p: //表示指针不能…...

操作系统 4.3-生磁盘的使用

磁盘的物理组成 盘面&#xff1a; 磁盘由多个盘面组成&#xff0c;每个盘面上都有数据存储的区域。 磁道&#xff1a; 每个盘面上都有若干个同心圆&#xff0c;这些同心圆称为磁道。磁道是数据存储的路径。 扇区&#xff1a; 磁道被进一步划分为若干个扇区&#xff0c;扇区…...

Uniapp Vue 实现当前日期到给定日期的倒计时组件开发

应用场景与需求分析 在移动端应用开发中&#xff0c;倒计时功能是常见的交互需求&#xff0c;例如限时促销活动、订单超时提醒、考试倒计时等场景。本文将基于 Uniapp 框架&#xff0c;实现一个从当前日期到给定日期的倒计时组件&#xff0c;支持显示 HH:mm:ss 格式的剩余时间…...

3dmax标准材质/vr/cr材质贴图转PBR材质贴图插件,支持多维子材质转换

3dmax标准材质/vr/cr材质贴图转PBR材质贴图插件,支持多维子材质转换 3dmax标准材质/vr/cr材质贴图转PBR材质贴图插件,支持多维子材质转换...

操作系统 3.3-多级页表和快表

分页的问题 这张幻灯片讨论了操作系统中内存管理的一个核心问题&#xff1a;页大小与页表大小之间的权衡。 页&#xff08;Page&#xff09;是内存管理中的一个基本概念&#xff0c;指的是将虚拟内存分割成固定大小的块&#xff0c;以便于管理和访问。页的大小直接影响内存空间…...

Java常用工具算法-7--秘钥托管云服务2(阿里云 KMS)

阿里云的KMS&#xff08;Key Management Service&#xff09;也是一种托管式密钥管理服务&#xff0c;帮助用户安全地创建、控制和使用密钥&#xff0c;保护敏感数据。通过使用KSM&#xff0c;您可以专注于构建和优化应用程序&#xff0c;而不必担心密钥管理的复杂性。 1、主要…...

游戏引擎学习第218天

构建并运行&#xff0c;注意一下在调试系统关闭前人物的移动速度 现在我准备开始构建项目。如果我没记错的话&#xff0c;我们之前关闭了调试系统&#xff0c;主要是为了避免大家在运行过程中遇到问题。现在调试系统没有开启&#xff0c;一切运行得很顺利&#xff0c;看到那个…...

城电科技 | 光伏太阳花:碳减排路上的璀璨新光光伏智慧花

当谈及 “碳减排” 与 “碳中和”&#xff0c;你脑海中率先浮现的是什么&#xff1f;想必很多人都会想到太阳能发电。太阳能光伏&#xff0c;作为人类取之不尽、用之不竭的绿色清洁能源&#xff0c;具备充分的清洁性、高度的安全性以及相对的广泛性。正因如此&#xff0c;在探讨…...

AI领域再突破,永洪科技荣获“2025人工智能+创新案例”奖

在2025年的今天&#xff0c;人工智能已从技术概念全面渗透至产业核心。中国作为全球AI技术应用的前沿阵地&#xff0c;正通过“人工智能”行动加速推进技术与实体经济深度融合。 这一背景下&#xff0c;永洪科技凭借其“国内某头部ICT人力资源板块GenAI项目”荣获“2025全国企业…...

大模型day1 - 什么是GPT

什么是GPT 全称 Generative Pre-trained Transformer 是一种基于 Transformer 架构的大规模 预训练 语言模型&#xff0c;由OpenAI研发&#xff0c;但GPT仅仅只是借鉴了Transformer 中 Decoder 的部分&#xff0c;并且做了升级 Transformer 架构 Transformer架构 是一种用于…...

飞凌嵌入式T527核心板正式发布OpenHarmony4.1系统,实现从芯片架构到操作系统的全链路国产化

飞凌嵌入式FET527N-C核心板正式发布OpenHarmony4.1系统&#xff0c;实现了从芯片架构到操作系统的全链路国产化。该产品具备灵活可编程、高效能运算、低成本控制等多重优势&#xff0c;通过多核异构设计同步支持边缘智能计算与精准实时控制&#xff0c;能够满足智能制造、能源管…...

机动车号牌管理系统设计与实现(代码+数据库+LW)

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对机动车号牌信息管理的提升&…...

测试模板1

本篇技术博文摘要 &#x1f31f; 引言 &#x1f4d8; 在这个变幻莫测、快速发展的技术时代&#xff0c;与时俱进是每个IT工程师的必修课。我是盛透侧视攻城狮&#xff0c;一名什么都会一丢丢的网络安全工程师&#xff0c;也是众多技术社区的活跃成员以及多家大厂官方认可人员&a…...

小试牛刀-抽奖程序

编写抽奖程序 需求&#xff1a;设计一个抽奖程序&#xff0c;点击抽奖按钮随机抽取一个名字作为中奖者 目标&#xff1a;了解项目结构&#xff0c;简单UI布局&#xff0c;属性方法、事件方法&#xff0c;程序运行及调试 界面原型 ​ 待抽奖&#xff1a; 点击抽奖按钮&#x…...

Foundry框架在FISCO BCOS区块链中的高级应用与实战技巧

引言:从入门到精通的进阶之路 在看过我发布的《FISCO BCOS区块链智能合约测试利器:Foundry框架从入门到实战》基础上,我们可以进一步深入探索Foundry框架在FISCO BCOS生态中的高级应用场景。Foundry作为一款强大的区块链开发工具集,其功能远不止于基础测试,它还能为FISCO…...

反转链表系列

206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int …...

算力租赁:数字经济时代的 “电力革命”—— 从资源租赁到创新生态的范式重构

引言&#xff1a;当算力成为新 “石油”&#xff0c;租赁模式如何重塑商业未来&#xff1f; 在数字经济浪潮中&#xff0c;算力早已超越传统硬件范畴&#xff0c;成为驱动企业创新的核心生产要素。据 IDC 预测&#xff0c;全球数据总量将在 2025 年突破 175 ZB&#xff0c;而人…...

Go:基本数据

文章目录 整数浮点数复数布尔值字符串字符串字面量UnicodeUTF - 8字符串和字节 slice字符串和数字的相互转换 常量常量生成器 iota无类型常量 整数 分类 Go 的整数类型按大小分有 8 位、16 位、32 位、64 位 &#xff0c;同时有符号整数包括int8、int16、int32、int64 &#…...

金融行业软件介绍

金融&#xff0c;本质为货币资金的融通&#xff0c;是经济活动中至关重要的领域。它围绕货币、信用、利率等核心要素运转&#xff0c;借助银行、证券机构、保险机构等众多主体&#xff0c;在货币市场与资本市场中实现资金的调配与流转&#xff0c;具有优化资源配置、分散风险及…...

Python的那些事第四十九篇:基于Python的智能客服系统设计与实现

基于Python的智能客服系统设计与实现 摘要 随着人工智能技术的飞速发展,智能客服系统逐渐成为企业提升客户服务质量和效率的关键工具。本文详细介绍了基于Python的智能客服系统的设计与实现方案,涵盖了系统架构、核心功能、技术选型及优化建议,旨在为企业构建高效、智能的客…...

vscode报错:unins000.exe 尝试在目标目录创建文件时发生一个错误

打开vscode&#xff0c;报错 这个错误提示表明在卸载或安装 Visual Studio Code 时&#xff0c;系统拒绝访问目标目录中的文件 unins000.exe。以下是解决此问题的有效方法&#xff1a; 检查文件权限 找到文件所在目录&#xff08;如 D:\software\Microsoft VS Code&#xff…...

当气象水文遇见R语言——破解时空数据的“达芬奇密码“

在气象水文科学领域&#xff0c;数据从来不只是简单的数字阵列。台风路径的时空跳跃、流域径流的非线性涨落、气候要素的混沌演变&#xff0c;这些充满不确定性的自然现象转化为数据时&#xff0c;呈现出多维时空交织的复杂图景。研究人员常常要在TB级遥感数据中捕捉毫米级降水…...

LEARNING DYNAMICS OF LLM FINETUNING【论文阅读笔记】

LEARNING DYNAMICS OF LLM FINETUNING 一句话总结 作者将LLM的学习动力机制拆解成AKG三项&#xff0c;并分别观察了SFT和DPO训练过程中​​正梯度信号​​和​​负梯度信号​​的变化及其带来的影响&#xff0c;并得到以下结论&#xff1a; ​​SFT通过梯度相似性间接提升无关…...

【射频仿真学习笔记】变压器参数的Mathematica计算以及ADS仿真建模

变压器模型理论分析 对于任意的无源电路或者等效电路&#xff0c;当画完原理图后&#xff0c;能否认为已经知道其中的两个节点&#xff1f;vin和vout之间的明确解析解 是否存在一个通用的算法&#xff0c;将这里的所有元素都变成了符号&#xff0c;使得这个算法本身就是一个函…...

改善 Maven 的依赖性

大家好&#xff0c;这里是架构资源栈&#xff01;点击上方关注&#xff0c;添加“星标”&#xff0c;一起学习大厂前沿架构&#xff01; 建议使用mvn dependency:analyze命令来摆脱已声明但未使用的依赖项&#xff1a; 还有另一个用例&#xff0c; mvn dependency:analyze 它可…...

循环神经网络 - LSTM 网络的各种变体

前面的博文中&#xff0c;我们了解和学习了长短期记忆网络&#xff0c;本文我们来学习LSTM 网络的各种变体。 目前主流的 LSTM 网络用三个门来动态地控制内部状态应该遗忘多少历史信息&#xff0c;输入多少新信息&#xff0c;以及输出多少信息.我们可以对门控机制进行改进并获…...

LangGraph 概述

LangGraph 介绍 LangGraph 是 LangChain 框架的扩展&#xff0c;专为创建基于大型语言模型&#xff08;LLMs&#xff09;的有状态、多角色应用而设计。它提供了一个灵活的架构&#xff0c;用于构建复杂的多步骤 LLM 应用&#xff0c;其中状态管理和流程控制至关重要。 为什么…...

Linux系统06---信号

目录 信号 1.1 进程间通信方式 1.2 信号的概念 1.3 查看信号 1.4 信号的产生 1.5 信号的处理 信号的 API 函数 2.1 函数名&#xff1a;kill() 2.2 函数名&#xff1a;raise() 2.3 函数名&#xff1a;alarm() 2.4 函数名&#xff1a;pause() 2.5…...

Java 程序调试与生产问题排查工具Arthas

好的&#xff0c;以下是修改后的博客内容&#xff0c;将公司信息替换为通用的占位符&#xff1a; 深入探索 Arthas&#xff1a;Java 程序调试与生产问题排查的利器 在 Java 开发中&#xff0c;调试和诊断问题往往是一个复杂且耗时的过程。Arthas&#xff08;Alibaba Java Dia…...

PH热榜 | 2025-04-11

1. Voicenotes Pages 标语&#xff1a;如果出版的感觉像是在和朋友聊天呢&#xff1f; 介绍&#xff1a;Voicenotes Pages 是一个极其简单的发布创意和故事的方式。它就像是一个简易的博客或播客&#xff0c;但更容易上手。你只需录制内容&#xff0c;点击发布&#xff0c;就…...

从三围学校项目看:中建海龙智能建造的崛起与突破

在建筑行业迈向智能化、数字化的浪潮里&#xff0c;中建海龙科技有限公司&#xff08;以下简称“中建海龙”&#xff09;从中脱颖而出&#xff0c;成为推动智能建造发展的重要力量。凭借深厚的技术积累、创新的理念以及先进的实践&#xff0c;中建海龙正引领着建筑行业的变革&a…...

aviator 自定义表达式

引入依赖 如果你使用的是 Maven 项目&#xff0c;在 pom.xml 中添加以下依赖&#xff1a; <dependency><groupId>com.googlecode.aviator</groupId><artifactId>aviator</artifactId><version>5.3.2</version> </dependency>…...

电商中的购物车(redis的hash类型操作)

购物车样式 ①、创建service-cart模块 spring:profiles:active: devserver:port: 8513 spring:application:name: service-cartcloud:nacos:discovery:server-addr: localhost:8848data:redis:host: localhostport: 6379启动类 SpringBootApplication(excludeDataSourceAutoC…...

Ubuntu 系统错误日志常见问题

一、Ubuntu 系统日志文件位置 1. 核心系统日志 日志文件用途说明/var/log/syslog所有系统级别的日志(包括内核、服务等)/var/log/kern.log内核相关的详细日志(如硬件驱动问题)/var/log/auth.log用户认证日志(SSH登录、sudo权限等)/var/log/dpkg.log软件包安装/卸载日志/…...

《Uniapp-Vue 3-TS 实战开发》TypeScript 泛型详解

泛型(Generics)是 TypeScript 中非常重要的特性,它允许我们创建可重用的组件,这些组件可以支持多种类型,而不会丢失类型安全性。 一、泛型基础 1. 基本概念 泛型允许我们在定义函数、接口或类时不预先指定具体类型,而是在使用时再指定类型。 // 不使用泛型 function …...

mysql 删除表等待

今天有个表加字段&#xff0c;语句是先删除&#xff0c;后重新建&#xff0c;表没有数据 &#xff0c;但是删除一个表的时候&#xff0c;语句drop table 提示超时 show processlist 后&#xff0c;等待类型是 Waiting for table metadata lock 取消重试几次后仍然是如此…...

如何深入理解protobuf

Protocol Buffers&#xff08;protobuf&#xff09;是一种轻便高效的结构化数据存储格式&#xff0c;用于数据序列化和反序列化&#xff0c;具有语言无关、平台无关、可扩展性强等特点&#xff0c;能有效提高数据存储和传输的效率。 一.协议的设计 我们在介绍protobuf之前我们…...

《分布式软总线牵手云服务,拓展应用新维度》

分布式软总线与云服务的融合&#xff0c;正掀起一场前所未有的变革&#xff0c;重塑着我们工作、生活和交互的方式。二者的结合&#xff0c;犹如天作之合&#xff0c;不仅打破了设备与数据之间的壁垒&#xff0c;更开启了一系列令人瞩目的全新应用场景。 分布式软总线&#xf…...

ReentrantLock 实现公平锁和非公平锁的原理!

&#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;可以多多支持一下&#xff0c;感谢&#x1f917;&#xff01; &#x1f31f;了解 ThreadLocal请看&#xff1a; ThreadLocal有趣讲解&#xff0c;小白也能听懂&#xff…...

算法训练之动态规划(四)——简单多状态问题

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...

【JavaScript】错误处理与调试

个人主页&#xff1a;Guiat 归属专栏&#xff1a;HTML CSS JavaScript 文章目录 1. JavaScript 错误处理基础1.1 错误类型1.2 try...catch 语句 2. 错误抛出与自定义错误2.1 throw 语句2.2 自定义错误类型 3. 异步错误处理3.1 Promise 错误处理3.2 async/await 错误处理 4. 调试…...

MySQL 管理与配置:查看端口、修改密码与数据存储位置

1.MySQL查看端口号 show global variables like port; 2.MySQL修改密码 grant all privileges on *.* to root% identified by 你的mysql密码 with grant option;flush privileges; 3.查询 MySQL 数据库的数据存储目录 MySQL 的所有数据库文件、表数据、索引、日志文件等都存…...

(四十二)Dart 中的接口与抽象类

Dart 中的接口与抽象类 Dart 的接口特性 在 Dart 中&#xff0c;接口的实现方式与 Java 有所不同。Dart 没有专门的 interface 关键字来定义接口&#xff0c;而是通过普通类或抽象类来实现接口的功能。以下是 Dart 接口的主要特点&#xff1a; 普通类或抽象类都可以作为接口 …...

Java习题:合并两个有序数组

文章目录 前言一、题目描述二、方法2.1 方法一2.2 方法二 前言 虽然这个题目很简单&#xff0c;但是在使用java语言实现的过程中&#xff0c;存在多种方法这是很有意思的一道题&#xff0c;所以小编在这里写下它的各种方法加深javase语法的学习。 提示&#xff1a;以下是本篇文…...

spm12_fMRI 2*4混合方差分析 Flexible factorial 对比矩阵

实验设计&#xff1a;2*4被试内设计 分析模型&#xff1a;spm 二阶分析中的 Flexible factorial 问题&#xff1a;Flexible factorial交互作用对比矩阵如何编写&#xff1f; 老师&#xff1a;deepseek老师【大神们看看这个矩阵是否可以如下编写&#xff1f;】 以下是来自de…...

力扣第272场周赛

周赛链接&#xff1a;竞赛 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 这场周赛是在课堂上模拟的, 总体来说比较简单, 但不幸被老师压力了。以下分享一下我的解题思路 如果你每天没有时间刷题的话, 可以看一下我写的东西, 我尽量讲解的通俗一些, 不会…...

【5】深入学习npm-Nodejs开发入门

深入学习npm npm详解npm的组成-registrynpm的组成-websitenpm的组成-clinpm-confignpm-initnpm-installnpm-startnpm-uninstallnpm-version其他命令 再谈registrypackage.json配置基本结构必填字段可选字段依赖管理其他配置完整配置 node_modules其他 npm详解 我们在前面安装N…...

2025.04.05 广东汕尾两日游记

2025.04.05 广东汕尾两日游记 文章目录 2025.04.05 广东汕尾两日游记一、前言二、我的两日游行程1、行程2、这两天吃喝玩乐的地方 三、其他1、汕尾两日游小结2、汕尾前十景点&#xff08;1&#xff09;玄武山旅游区&#xff08;2&#xff09;红海湾遮浪旅游区&#xff08;3&…...

【数学建模】(智能优化算法)鲸鱼优化算法(Whale Optimization Algorithm)详解与应用

鲸鱼优化算法(Whale Optimization Algorithm)详解与应用 文章目录 鲸鱼优化算法(Whale Optimization Algorithm)详解与应用1. 引言2. 算法原理2.1 生物学基础2.2 数学模型[^3]1. 包围猎物阶段2. 气泡网攻击&#xff08;螺旋更新&#xff09;3. 随机搜索猎物&#xff08;全局探索…...