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

Spring Cloud OpenFeign快速入门demo

一、应用场景

Spring Cloud OpenFeign 是一个声明式的 HTTP 客户端,旨在简化微服务之间的通信。它使得开发者能够通过简单的接口定义和注解来调用 RESTful API,极大地减少了样板代码。以下是一些典型的应用场景:

  1. 微服务间调用:在微服务架构中,服务之间需要频繁地进行 HTTP 调用,OpenFeign 提供了一种简洁的方式来实现这些调用。
  2. RESTful API 客户端:当需要与外部 RESTful API 进行交互时,OpenFeign 可以帮助快速构建客户端。
  3. 服务发现:与 Eureka 等服务发现组件结合使用时,OpenFeign 可以自动处理服务的负载均衡和故障转移。
  4. 动态配置:在需要根据不同环境或条件动态配置请求时,OpenFeign 提供了灵活的解决方案。

二、原理

Spring Cloud OpenFeign 的核心原理是利用 Java 的动态代理和注解来简化 HTTP 请求的构建。开发者只需定义接口,并使用注解描述请求的细节(如 HTTP 方法、路径、参数等),在运行时,OpenFeign 会生成实现类并处理请求。

主要组件

  1. Feign Client:定义服务接口,使用注解描述请求。
  2. Request Interceptor:用于在请求发送之前对请求进行修改(如添加 header)。
  3. Encoder/Decoder:用于请求和响应的编码和解码,支持 JSON、XML 等格式。
  4. 错误处理:提供自定义的错误处理机制,以便在请求失败时进行处理。

三、代码示例

1. 添加依赖

在 Maven 项目的 pom.xml 中添加 OpenFeign 依赖:

<?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"><parent><artifactId>springcloud-demo</artifactId><groupId>com.et</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>spring-cloud-openfeign</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>
</project>

2. 启用 OpenFeign

在 Spring Boot 应用的主类上添加 @EnableFeignClients 注解:

package com.et;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication
@EnableFeignClients
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}

3. 定义 Feign Client

创建一个 Feign Client 接口,使用注解定义请求:

package com.et.service;import com.et.model.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;@FeignClient(name = "user-service", url = "http://localhost:8088")
public interface UserServiceClient {@GetMapping("/user/{id}")User getUserById(@PathVariable("id") Long id);
}

4. 使用 Feign Client

在服务中使用 Feign Client:

package com.et.controller;import com.et.model.User;
import com.et.service.UserService;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/users/{id}")public User getUser(@PathVariable Long id) {return userService.getUser(id);}@GetMapping("/user/{id}")public User user(@PathVariable Long id, HttpServletRequest request) {// get username and password from headerString userHeader = request.getHeader("user");String passwordHeader = request.getHeader("password");// print paramsSystem.out.println("User Header: " + userHeader);System.out.println("Password Header: " + passwordHeader);User  user =   new User();user.setId(id);user.setEmail("xxx@xx.com");user.setName("test");return user;}
}

四、拦截器

OpenFeign 允许你使用请求拦截器来修改请求,例如添加 header、日志记录等。以下是如何实现一个简单的请求拦截器:

1. 创建拦截器

package com.et.interceptor;import feign.RequestInterceptor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author liuhaihua* @version 1.0* @ClassName JSONPlaceHolderInterceptor* @Description todo* @date 2024/12/23/ 14:18*/
@Configuration
public class JSONPlaceHolderInterceptor  {@Value("${feign.client.config.default.username}")private String username;@Value("${feign.client.config.default.password}")private String password;@Beanpublic RequestInterceptor requestInterceptor() {return requestTemplate -> {requestTemplate.header("user", username);requestTemplate.header("password", password);requestTemplate.header("Accept", "application/json");};}
}

2. 在 Feign Client 中使用拦截器

server:port: 8088
feign:client:config:default:username: xxxxpassword: passwordrequestInterceptors:com.et.interceptor.JSONPlaceHolderInterceptor

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

  • https://github.com/Harries/springcloud-demo(Spring Cloud Openfeign)

五、测试

启动Spring CLoud应用,访问http://127.0.0.1:8088/users/1,返回结果如下

{"id":1,"name":"test","email":"xxx@xx.com"}

查看控制台,发现获得拦截器设置的值

User Header: xxxx
Password Header: password

l六、总结

Spring Cloud OpenFeign 是一个强大的工具,能够简化微服务之间的 HTTP 调用。通过声明式的方式,开发者可以快速构建 RESTful 客户端,减少样板代码,提高开发效率。结合请求拦截器,OpenFeign 还可以灵活地处理请求的各种需求,如身份验证和日志记录。

在微服务架构中,使用 OpenFeign 可以有效地提高服务间的通信效率和可维护性,是构建现代分布式系统的重要组成部分。通过简单的配置和注解,开发者能够专注于业务逻辑,而不必过多关注底层的 HTTP 请求细节。

相关文章:

Spring Cloud OpenFeign快速入门demo

一、应用场景 Spring Cloud OpenFeign 是一个声明式的 HTTP 客户端&#xff0c;旨在简化微服务之间的通信。它使得开发者能够通过简单的接口定义和注解来调用 RESTful API&#xff0c;极大地减少了样板代码。以下是一些典型的应用场景&#xff1a; 微服务间调用&#xff1a;在…...

研发效能DevOps: Vite 使用 Element Plus

目录 一、实验 1.环境 2.初始化前端项目 3.安装 vue-route 4.安装 pinia 5.安装 axios 6.安装 Element Plus 7.gitee创建工程 8. 配置路由映射 9.Vite 使用 Element Plus 二、问题 1.README.md 文档推送到gitee未自动换行 2.访问login页面显示空白 3.表单输入账户…...

sfnt-pingpong -测试网络性能和延迟的工具

sfnt-pingpong 是一个用于测试网络性能和延迟的工具&#xff0c;通常用于测量不同网络环境下的数据包传输性能、吞吐量、延迟等指标。 它通常是基于某种网络协议&#xff08;如 TCP&#xff09;执行“ping-pong”式的测试&#xff0c;即客户端和服务器之间相互发送数据包&…...

Kubernetes、Docker 和 Docker Registry 关系是是什么?

Kubernetes&#xff08;常简称为 k8s&#xff09;、Docker 和 Docker Registry 是现代云原生应用中三个关键的组件&#xff0c;它们各自承担不同的职责&#xff0c;但在容器化部署和管理过程中紧密协作。以下是它们之间关系的详细解释&#xff1a; 一、核心概念简介 1. Docker…...

docker部署微信小程序自动构建发布和更新

通过 Jenkins 和 Docker 部署微信小程序&#xff0c;并实现自动构建、发布和版本更新&#xff0c;主要涉及以下几个步骤&#xff1a; 设置 Jenkins 环境配置 GitLab 与 Jenkins 的集成构建 Docker 镜像部署和发布微信小程序配置 Jenkins 自动构建 以下是详细的步骤说明&#…...

模仿elementui的Table,实现思路

vue2子组件使用render&#xff0c;给子子组件插槽传值 和elementui的Table一样使用render 在 Vue 2 中&#xff0c;子组件使用render函数向子子组件插槽传值可以通过以下步骤实现&#xff1a; 1、创建子组件 首先创建一个子组件&#xff0c;在子组件中使用render函数来渲染内容…...

Unity中使用环形缓冲区平滑抖动值

环形缓冲数据结构&#xff0c;就是如下图一样的一个收尾相接的列表 在index指针指到4时&#xff0c;再往里添加数据&#xff0c;index就会指向0&#xff0c;并覆盖已有数据。 如何绘制Sin函数&#xff0c;请看下面一篇文章 Unity中如何实现绘制Sin函数图像-CSDN博客 接下来要…...

【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?

文章目录 前言问题描述问题分析问题解决1.允许所有用户上传驱动文件2.如果是想只上传白名单的驱动 前言 该方法适合永洪BI系列产品&#xff0c;包括不限于vividime desktop&#xff0c;vividime z-suit&#xff0c;vividime x-suit产品。 问题描述 当我们连接数据源的时候&a…...

SpringBoot使用 AOP 实现自定义日志记录并保存在Mysql

本文主要介绍在 Spring Boot 中使用 AOP 实现自定义日志记录并保存在 Mysql 的方法。先阐述记录日志的重要性及传统方式的弊端&#xff0c;提出新方式&#xff0c;即通过创建自定义注解、切面类等&#xff0c;将重要日志存到数据库&#xff0c;还给出了创建日志表、注解类、切面…...

谷歌开源最强天气预报AI模型 GenCast

谷歌 DeepMind 开源新一代天气预测 AI 模型 GenCast&#xff0c;GenCast 以最先进的精度预测天气和极端条件的风险 天气预报对人们生活和决策至关重要&#xff0c;但传统 NWP 模型存在不确定性&#xff0c;且计算资源需求大、运行慢。机器学习在天气预报中虽有进展&#xff0c;…...

C++打造局域网聊天室第十课: 客户端编程及数据发送

文章目录 前言一、补充内容&#xff0c;设置显示框换行二、客户端编程三、封装消息发送函数四、所处的身份状态总结 前言 C打造局域网聊天室第十课&#xff1a; 客户端编程及数据发送 一、补充内容&#xff0c;设置显示框换行 编辑框的显示内容默认是不会换行的&#xff0c;这…...

Nginx整合Lua脚本

Nginx-Lua Nginx整合Lua脚本 Lua环境搭建 下载地址 linux环境下 yum install lua安装后验证 lua -vLua脚本执行 lua xxx.luaNginx整合Lua nginx需要添加lua模块 嵌入内容 示例如下 修改nginx.conf如下 location /lua {default_type text/plain;content_by_lua ngx.sa…...

【C++】C++11 STL容器emplace方法原理剖析

在 C 11 STL 容器中&#xff0c;push/insert > emplace 新的方法&#xff0c;push 和 emplace 的区别在于&#xff1a; 1. push push 通常用于将一个元素添加到容器的末尾&#xff08;在 std::vector、std::deque 等序列容器中&#xff09;&#xff0c;或者在关联容器中插入…...

QT-简单视觉框架代码

文章目录 简介1. 整体架构2. 关键类功能概述3. 详细代码实现hikcameraworker.h 和 hikcameraworker.cpp&#xff08;海康相机工作线程类&#xff09;imageviewerwidget.h 和 imageviewerwidget.cpp&#xff08;图像查看部件类&#xff09;构造函数 ImageViewerWidget析构函数 ~…...

AI新书推荐:深度学习和大模型原理与实践(清华社)

本书简介 在这个信息爆炸、技术革新日新月异的时代&#xff0c;深度学习作为人工智能领域的重要分支&#xff0c;正引领着新一轮的技术革命。《深度学习和大模型原理与实践》一书&#xff0c;旨在为读者提供深度学习及其大模型技术的全面知识和实践应用的指南。 本书特色在于…...

[spring]处理器

我们可以通过spring来管理我们的类&#xff0c;之后我们可以通过spring的容器来获取我们所需要的Bean类对象。Spring的处理器是Spring对外开发的重要扩展点&#xff0c;它允许我们介入到Bean的整个实例化流程中来&#xff0c;可以动态添加、修改BeanDefinition、动态修改Bean 首…...

重温设计模式--中介者模式

中介者模式介绍 定义&#xff1a;中介者模式是一种行为设计模式&#xff0c;它通过引入一个中介者对象来封装一系列对象之间的交互。中介者使得各个对象之间不需要显式地相互引用&#xff0c;从而降低了它们之间的耦合度&#xff0c;并且可以更方便地对它们的交互进行管理和协调…...

重温设计模式--设计模式七大原则

文章目录 1、开闭原则&#xff08;Open - Closed Principle&#xff0c;OCP&#xff09;定义&#xff1a;示例&#xff1a;好处&#xff1a; 2、里氏替换原则&#xff08;Liskov Substitution Principle&#xff0c;LSP&#xff09;定义&#xff1a;示例&#xff1a;好处&#…...

LeetCode429周赛T4

最小化二进制字符串中最长相同子字符串的长度 在处理二进制字符串问题时&#xff0c;优化字符串结构以满足特定条件是一项常见的挑战。本文将探讨一个具体的问题&#xff1a;给定一个长度为 n 的二进制字符串 s 和一个整数 numOps&#xff0c;通过最多 numOps 次位翻转操作&am…...

详解MySQL在Windows上的安装

目录 查看电脑上是否安装了MySQL 下载安装MySQL 打开MySQL官网&#xff0c;找到DOWNLOADS 然后往下翻&#xff0c;找到MySQL Community(GPL) Downloads>> 然后找到MySQL Community Server 然后下载&#xff0c;选择No thanks,just start my download. 然后双击进行…...

YOLOv12与Matlab联合仿真:用于算法原型验证与性能分析

YOLOv12与Matlab联合仿真&#xff1a;用于算法原型验证与性能分析 如果你正在研究目标检测算法&#xff0c;尤其是像YOLOv12这样的前沿模型&#xff0c;那你肯定知道&#xff0c;从拿到一个模型到真正理解它的性能&#xff0c;中间有很长一段路要走。直接部署到硬件上跑&#…...

Qwen3-0.6B-FP8快速上手:用Chainlit打造专属聊天机器人实战

Qwen3-0.6B-FP8快速上手&#xff1a;用Chainlit打造专属聊天机器人实战 1. 准备工作与环境检查 1.1 了解Qwen3-0.6B-FP8模型 Qwen3-0.6B-FP8是Qwen系列最新一代的语言模型&#xff0c;采用FP8精度优化&#xff0c;在保持高性能的同时显著降低计算资源需求。这个60亿参数的模…...

Qwen3.5-4B-Claude-Opus实际作品:安全合规GDPR条款技术映射

Qwen3.5-4B-Claude-Opus实际作品&#xff1a;安全合规GDPR条款技术映射 1. 模型介绍 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF是基于Qwen3.5-4B的推理蒸馏模型&#xff0c;特别强化了结构化分析、分步骤回答以及处理代码与逻辑类问题的能力。该版本以GGUF量化形…...

Phi-3-mini-4k-instruct-gguf企业实操:HR部门员工制度问答机器人快速上线

Phi-3-mini-4k-instruct-gguf企业实操&#xff1a;HR部门员工制度问答机器人快速上线 1. 项目背景与价值 HR部门每天都会收到大量关于员工制度的咨询&#xff0c;从考勤规则到福利政策&#xff0c;重复性问题占据了大量工作时间。传统的人工回复方式效率低下&#xff0c;且难…...

保姆级教程:GPT-SoVITS一键部署,5秒语音克隆你的专属AI助手

保姆级教程&#xff1a;GPT-SoVITS一键部署&#xff0c;5秒语音克隆你的专属AI助手 1. 引言&#xff1a;为什么选择GPT-SoVITS 想象一下&#xff0c;你只需要录制5秒钟的语音&#xff0c;就能让AI用你的声音朗读任何文字——这就是GPT-SoVITS带来的神奇体验。作为当前最先进的…...

从0到1搭建可靠消息链路:RocketMQ重试 + Redis幂等实战

三方消息对接为什么总翻车&#xff1f;一套 RocketMQ Redis 幂等 的工业级解法&#xff08;含架构图伪代码&#xff09; &#x1f525; 适合收藏&#xff1a;三方平台对接、商品/订单同步、消息中台治理 ✅ 你将收获&#xff1a;一套可直接落地的“拉取-发送-消费-重试-幂等-补…...

mysql主键设计原则_InnoDB聚簇索引对性能的影响

主键不必是自增整数但强烈推荐&#xff1b;非自增主键&#xff08;如UUID、字符串&#xff09;易引发页分裂、随机IO和索引碎片&#xff0c;增大二级索引体积并降低缓存效率&#xff1b;更新主键等于全行重建&#xff0c;必须禁止&#xff1b;无显式主键时InnoDB会生成隐藏ROW_…...

【JavaScript高级编程】拆解函数流水线 上郴

一、什么是setuptools&#xff1f; setuptools 是一个用于创建、分发和安装 Python 包的核心库。 它可以帮助你&#xff1a; 定义 Python 包的元数据&#xff08;如名称、版本、作者等&#xff09;。 声明包的依赖项&#xff0c;确保你的包能够正确运行。 构建源代码分发包&…...

Claude频发Bug,AI安全引担忧

近日&#xff0c;Claude被爆出存在严重Bug&#xff0c;分不清用户与系统发言&#xff0c;甚至将恶意指令当合法请求。此问题在Hacker News引发热议&#xff0c;也暴露出大模型的安全隐患。Claude现身份识别障碍Claude 3.5和Claude 4系列在处理复杂或恶意上下文时&#xff0c;出…...

用40块钱的Luckfox Pico玩转无线图传:手把手教你用UDP+OpenCV把摄像头画面传到Ubuntu

40元Luckfox Pico打造无线图传系统&#xff1a;UDPOpenCV全链路实战指南 当一块比外卖还便宜的Linux开发板遇上计算机视觉&#xff0c;会碰撞出怎样的火花&#xff1f;这个周末项目将带你用40元的Luckfox Pico配合50元的摄像头模组&#xff0c;搭建一套完整的无线图像传输系统。…...