【OpenFeign】基础使用

【OpenFeign】基础使用

  • 1. Feign介绍
    • 1.1 使用示例
    • 1.2 Feign与RPC对比
    • 1.3 SpringCloud Alibaba快速整合OpenFeign
      • 1.3.1 详细代码

1. Feign介绍

1.什么是 Feign

Feign 是 Netflix 开发的一个 声明式的 HTTP 客户端,在 Spring Cloud 中被广泛使用。它的目标是:让我们调用远程 HTTP API 的方式,像调用本地接口一样简单。

换句话说:

  • 不用手写 RestTemplate 的各种请求
  • 只要定义一个接口 + 注解,Spring Cloud Feign 就会帮你生成实现类,并通过 HTTP 调用对应的远程服务。

2.Feign 的核心特点

  • 声明式调用:只需在接口上加注解 (@FeignClient),不用写具体实现。

  • 与 Spring Cloud 集成:能和 Eureka、Nacos 等注册中心结合,实现服务发现。

  • 内置负载均衡:在 Spring Cloud Netflix 时代默认结合 Ribbon,现在一般结合 Spring Cloud LoadBalancer。

  • 支持拦截器:可以统一处理请求头(如 token)、日志打印、重试等。

  • 支持编码解码:内置 JSON 编解码,可以和 Jackson、Gson 等整合。

3.Feign 的发展

Netflix Feign(早期版本):最初由 Netflix 开发,后被 Spring Cloud 整合。
OpenFeign(现在常用的版本):Spring Cloud 现在默认使用的是 Spring Cloud OpenFeign,它是对 Feign 的增强版本。

1.1 使用示例

假设有一个 user-service 提供 REST 接口:

@RestController
@RequestMapping("/user")
public class UserController {@GetMapping("/{id}")public User getUser(@PathVariable Long id) {return new User(id, "张三");}
}

在另一个服务(比如 order-service)中,我们要调用 user-service:
① 定义 Feign 接口

@FeignClient(name = "user-service")  // user-service 是注册在 Nacos/Eureka 上的服务名
public interface UserClient {@GetMapping("/user/{id}")User getUserById(@PathVariable("id") Long id);
}

② 注入并调用

@Service
public class OrderService {@Autowiredprivate UserClient userClient;public void createOrder(Long userId) {User user = userClient.getUserById(userId); // 直接像调用本地方法一样System.out.println("下单用户: " + user.getName());}
}

这样,Feign 就会帮你把 getUserById() 变成 HTTP 调用。

1.2 Feign与RPC对比

特性Feign(HTTP 客户端)RPC(Dubbo/gRPC 等)
协议HTTP/HTTPS (REST)TCP/HTTP2/自定义协议
序列化方式JSON / XMLProtobuf / Hessian / Thrift
调用方式HTTP 请求,返回 JSON远程方法调用(接近本地调用)
性能中等(HTTP+JSON 有开销)高效(协议二进制、TCP直连)
跨语言支持很好(所有语言都支持 HTTP)较好(需官方 SDK,如 gRPC)
常见场景Web 微服务调用高性能微服务 / 内部系统调用

1.3 SpringCloud Alibaba快速整合OpenFeign

1.引入依赖

在这里插入图片描述
2.编写调用接口+@FeignClient注解
在这里插入图片描述
3.调用端在启动类上添加@EnableFeignClients注解
在这里插入图片描述
4.发起调用,像本地方法一样调用

1.3.1 详细代码

在这里插入图片描述

调用方

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.beijing</groupId><artifactId>springcloudalibaba</artifactId><version>0.0.1-SNAPSHOT</version></parent><groupId>com.beijing</groupId><artifactId>order-openFeign</artifactId><version>1.0.1-SNAPSHOT</version><name>order</name><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></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></dependency><!-- 添加openFeign --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency></dependencies></project>
server:port: 14031management:endpoints:web:exposure:include=*:spring:application:name: order-openFeigncloud:nacos:discovery:server-addr: 115.190.126.xxx:8848namespace: prodgroup: demo-1
package com.beijing.controller;import com.beijing.order.feign.StockFeignService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;/*** @author aaa* @version 1.0* @date 2025/08/27*/
@RestController
@RequestMapping("/order")
public class OrderController {@Resourceprivate StockFeignService stockFeignService;@RequestMapping("/add")public String add() {String reduct = stockFeignService.reduct();return "add order" + reduct;}
}
package com.beijing;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;/*** @author aaa* @version 1.0* @date 2025/08/27*/
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class OrderFeignApplication {public static void main(String[] args) {SpringApplication.run(OrderFeignApplication.class, args);}
}
package com.beijing.order.feign;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;@FeignClient(name = "stock", path = "/stock")
public interface StockFeignService {@RequestMapping("/reduct")public String reduct();
}

被调用方

package com.beijing;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;/*** @author aaa* @version 1.0* @date 2025/08/27*/
@EnableDiscoveryClient
@SpringBootApplication
public class StockApplication {public static void main(String[] args) {SpringApplication.run(StockApplication.class, args);}
}
package com.beijing.Controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author fanzhen@ict.ac.cn* @version 1.0* @date 2025/08/27*/
@RestController
@RequestMapping("/stock")
public class StockController {@RequestMapping("/reduct")public String reduct() {System.out.println("扣减库存开始");return "扣减库存成功";}
}
server:port: 14029management:endpoints:web:exposure:include=*:spring:application:name: stockcloud:nacos:discovery:server-addr: 115.190.126.xxx:8848namespace: prodgroup: demo-1
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.beijing</groupId><artifactId>springcloudalibaba</artifactId><version>0.0.1-SNAPSHOT</version></parent><groupId>com.beijing</groupId><artifactId>stock</artifactId><version>1.0.1-SNAPSHOT</version><name>stock</name><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></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></dependency></dependencies></project>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

访问相同的url,相同入参的请求,Apifox/Postman可以正常响应结果,而本地调用不行(或结果不同)

文章目录问题概述Apifox查看实际请求总结问题概述 开发中有一个需求需要去别的系统中拿数据&#xff0c;配置好相关参数后发起请求时发现响应结果和在Apifox上不同&#xff0c;Apifox上正常显示数据&#xff0c;而本地调用后返回数据不存在。 这就很奇怪了&#xff0c;想了很多…

数据结构(C语言篇):(七)双向链表

目录 前言 一、概念与结构 二、双向链表的实现 2.1 头文件的准备 2.2 函数的实现 2.2.1 LTPushBack( )函数&#xff08;尾插&#xff09; &#xff08;1&#xff09;LTBuyNode( ) &#xff08;2&#xff09;LTInit( ) &#xff08;3&#xff09;LTPrint( ) &#x…

从拿起简历(resume)重新找工作开始聊起

经济萧条或经济衰退在经济相关学术上似乎有着严格的定义&#xff0c;我不知道我们的经济是否已经走向了衰退或者萧条&#xff0c;但有一点那是肯定的&#xff0c;那就现在我们的经济肯定是不景气的。经济不景气会怎么样&#xff1f;是的&#xff0c;会有很多人失业&#xff0c;…

OS+MySQL+(其他)八股小记

鲁迅先生曾经说过&#xff0c;每天进步一点点&#xff0c;妈妈夸我小天才。 依旧今日八股&#xff0c;这是我在多个文档整合一起的&#xff0c;可能格式有些问题&#xff0c;请谅解。 操作系统 1.进程和线程的区别&#xff1f; 进程是代码在数据集合的一次执行活动&#xff0c;…

Transformer的并行计算与长序列处理瓶颈总结

&#x1f31f; 第0层&#xff1a;极简版&#xff08;30秒理解&#xff09;一句话核心&#xff1a;Transformer像圆桌会议——所有人都能同时交流&#xff08;并行优势&#xff09;&#xff0c;但人越多会议越混乱&#xff08;长序列瓶颈&#xff09;。核心问题 并行优势&#x…

Vue 3 useId 完全指南:生成唯一标识符的最佳实践

&#x1f4d6; 概述 useId() 是 Vue 3 中的一个组合式 API 函数&#xff0c;用于生成唯一的标识符。它确保在服务端渲染&#xff08;SSR&#xff09;和客户端渲染之间生成一致的 ID&#xff0c;避免水合不匹配的问题。 &#x1f3af; 基本概念 什么是 useId&#xff1f; useId…

CGroup 资源控制组 + Docker 网络模式

1 CGroup 资源控制组1.1 为什么需要 CGroup - 容器本质 宿主机上一组进程 - 若无资源边界&#xff0c;一个暴走容器即可拖垮整机 - CGroup 提供**内核级硬限制**&#xff0c;比 ulimit、nice 更可靠1.2 核心概念 3 件套 | 概念 | 一句话解释 | 查看方式 | | Hierarchy | 树…

【ArcGIS微课1000例】0150:如何根据地名获取经纬度坐标

本文介绍了三种获取地理坐标的方法:1)在ArcGIS Pro中通过搜索功能定位目标点(如月牙泉)并查看其WGS84坐标;2)使用ArcGIS内置工具获取坐标;3)推荐三个在线工具(maplocation、地球在线、yanue)支持批量查询和多地图源坐标转换。强调了使用WGS84坐标系以减少误差,并展示…

HTML应用指南:利用GET请求获取MSN财经股价数据并可视化

随着数字化金融服务的不断深化&#xff0c;及时、准确的财经信息已成为投资者决策与市场分析的重要支撑。MSN财经股价数据服务作为广受信赖的金融信息平台&#xff0c;依托微软强大的技术架构与数据整合能力&#xff0c;持续为全球用户提供全面、可靠的证券市场数据。平台不仅提…

雅思听力第四课:配对题核心技巧与词汇深化

现在&#xff0c;请拿出剑桥真题&#xff0c;开始你的刻意练习&#xff01; 内容大纲 课程核心目标旧题回顾与基础巩固配对题/匹配题核心解题策略考点总结与精听训练表 一、课程核心目标 掌握第二部分配对题的解题策略攻克第三部分匹配题的改写难点系统整理高频场景词汇与特…

SQL Server从入门到项目实践(超值版)读书笔记 25

第12章 存储过程的应用 &#x1f389;学习指引 存储过程&#xff08;Stored Procedure&#xff09;是在大型数据库系统中&#xff0c;一组为了完成特定功能的SQL语句集&#xff0c;存储过程时数据库中的一个重要对象&#xff0c;它代替了传统的逐条执行SQL语句的方式。本章就来…

20.29 QLoRA适配器实战:24GB显卡轻松微调650亿参数大模型

QLoRA适配器实战:24GB显卡轻松微调650亿参数大模型 QLoRA 适配器配置深度解析 一、QLoRA 适配器核心原理 QLoRA 作为当前大模型微调领域的前沿技术,通过量化与低秩适配的协同设计,在保证模型效果的前提下实现了显存占用的革命性降低。其核心由三大技术支柱构成: 4位量化…

QMainWindow使用QTabWidget添加多个QWidget

QTabWidget添加其它Wdiget的2个函数如下&#xff1a; QTabWidget的介绍可参考官网QTabWidget Class | Qt Widgets | Qt 6.9.1 直接上代码&#xff0c;代码如下&#xff1a; #include <QMainWindow>#include <QApplication> #include <QVBoxLayout> #includ…

AI学习机哪个好?选这几款步步高就对了

随着新教改政策的推进&#xff0c;教育对孩子的综合素养提出了更高要求。英语更重听说、数学更重思维&#xff0c;这让许多家长在辅导孩子时感到压力倍增。因此&#xff0c;如何选择一款能真正帮助孩子提升能力的学习机&#xff0c;成为了大家普遍关心的问题。面对市场上功能各…

【设计模式】--重点知识点总结

题1 1、工厂和产品之间是依赖关系 2、工厂方法模式&#xff1a;工厂方法不能为静态方法。如果是静态方法&#xff0c;子类无法重写行为。 简单工厂可以用静态方法 3、采用设计模式&#xff0c;以保证成功的设计和体系结构 4、建造者模式&#xff1a;&#xff08;1&#xf…

轻量实现 OCPP 1.6 JSON 协议(欧洲版)的充电桩调试平台

1 项目概览 1.1 目标与适用场景 1.1.1 简介 本文介绍的开源项目 ocpp_charge&#xff0c;是一个 自研轻量实现 OCPP 1.6 JSON 协议&#xff08;欧洲版&#xff09; 的充电桩调试平台。 它没有依赖官方 OCPP 1.6J 库&#xff0c;而是从零实现协议解析与会话管理&#xff0c;适…

Ubuntu 搭建 Solana 区块链开发环境 + Anchor 智能合约完整教程

文章目录简介特征核心概念Solana 的工作原理&#xff08;简单版&#xff09;为什么人们选择 Solana开发环境准备Solana 官网Solana 文档Anchor 文档GithubRust SDK快速安装 Solana&#xff08;推荐&#xff09;单独安装 Solana安装依赖项安装 Solana CLI安装 Anchor CLI安装 AV…

curl 介绍及使用教程

文章目录 什么是 curl? 1. 解析用户输入与初始化 2. 建立网络连接 3. 构建并发送请求 4. 接收并处理响应 5. 清理资源 核心特点总结 基本语法 常用功能及示例 1. 基本 HTTP 请求 2. 发送 GET 请求 3. 发送 POST 请求 4. 设置请求头 5. 处理认证 6. 断点续传 7. 跟随重定向 8. …

【第十一章】Python 队列全方位解析:从基础到实战

Python 队列全方位解析&#xff1a;从基础到实战 本文将从基础概念到高级应用&#xff0c;用 “文字解释 代码示例 图表对比 实战案例” 的方式&#xff0c;全面覆盖 Python 队列知识&#xff0c;零基础也能轻松掌握。 文章目录Python 队列全方位解析&#xff1a;从基础到实…

跨平台开发框架实测:React Native vs Flutter vs Kotlin Multiplatform

本文聚焦 React Native、Flutter 和 Kotlin Multiplatform 三大跨平台开发框架&#xff0c;从性能表现、开发效率、生态系统、跨平台一致性及学习成本五个关键维度展开实测对比。通过具体场景的测试数据与实际开发体验&#xff0c;剖析各框架的优势与短板&#xff0c;为开发者在…