

微服务系列文章 重生之我在暑假学习微服务第一天《MybatisPlus-上篇》重生之我在暑假学习微服务第二天《MybatisPlus-下篇》重生之我在暑假学习微服务第三天《Docker-上篇》重生之我在暑假学习微服务第四天《Docker-下篇》重生之我在暑假学习微服务第五天《Docker部署项目篇》重生之我在暑假学习微服务第六天《微服务之拆分项目篇》重生之我在暑假学习微服务第七天《微服务之服务治理篇》未完待续....
特别声明:本系列所涉及资料皆为黑马程序员课程中的资料
不知道昨天的大家学习的如何了,今天和昨天学的东西大致一致,就是利用新技术(OpenFeign )来简化我们的代码。
OpenFeign 是一个声明式的 HTTP 客户端框架,主要用于简化 RESTful API 的调用。它通过注解和接口定义的方式,让开发者能够以更简洁的方式编写 HTTP 请求逻辑,而无需手动处理底层的 HTTP 通信细节。
<!-- openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 负载均衡器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

先导入

这样就直接将上面这一段简化成了一行代码

启动成功!!!

┌─────────────────┐ 启动时扫描 ┌───────────────────────────────┐
│ @EnableFeignClients ────────→ 扫描@FeignClient标记的接口 │
└─────────────────┘ └──────────────┬────────────────┘
│
┌─────────────────┐ 生成动态代理 ┌────────────▼────────────────┐
│ Spring容器注册 ←────────────── 为接口创建JDK动态代理对象 │
└────────┬────────┘ └───────────────────────────────┘
│
┌────────▼────────┐ 调用接口方法 ┌───────────────────────────────┐
│ 业务代码注入接口 ───────────────→ 触发动态代理的invoke方法 │
└─────────────────┘ └────────────┬────────────────┘
│
┌────────────────────────────────────────────▼─────────────────────────┐
│ 解析请求信息 │
│ 1. 解析@FeignClient的服务名、@GetMapping等注解的HTTP方法/路径 │
│ 2. 提取方法参数(@PathVariable/@RequestParam等) │
│ 3. 拼接基础URL(服务名 + 接口路径) │
└────────────────────────────────────┬─────────────────────────────────┘
│
┌────────────────────────────────────▼─────────────────────────────────┐
│ 服务地址解析 │
│ 1. 若集成服务发现(Eureka/Nacos),通过服务名获取实例列表 │
│ 2. 若集成负载均衡(Ribbon),选择具体服务实例(如轮询/随机策略) │
│ 3. 生成最终请求地址(如http://192.168.1.100:8080/users/1) │
└────────────────────────────────────┬─────────────────────────────────┘
│
┌────────────────────────────────────▼─────────────────────────────────┐
│ 构建HTTP请求 │
│ 1. Encoder将请求参数序列化(如JSON) │
│ 2. 组装请求头(默认头 + 自定义Interceptor添加的头) │
│ 3. 构建完整请求对象(Method/URL/Body/Headers) │
└────────────────────────────────────┬─────────────────────────────────┘
│
┌────────────────────────────────────▼─────────────────────────────────┐
│ 发送HTTP请求 │
│ 1. 通过Client组件(默认HttpURLConnection,可替换为OkHttp)发送请求 │
│ 2. 若配置Retryer,失败时执行重试逻辑 │
└────────────────────────────────────┬─────────────────────────────────┘
│
┌────────────────────────────────────▼─────────────────────────────────┐
│ 处理响应结果 │
│ 1. 接收响应(状态码/响应体) │
│ 2. 若状态码非2xx,抛出FeignException(或触发fallback) │
│ 3. Decoder将响应体反序列化为返回值对象(如User) │
└────────────────────────────────────┬─────────────────────────────────┘
│
┌─────────────────┐ 返回结果 ┌─────▼───────────┐
│ 业务代码接收结果 ←────────── 动态代理返回数据 │
└─────────────────┘ └─────────────────┘OpenFeign 的工作流程可分为四个关键步骤:
@EnableFeignClients 注解触发扫描,Spring 会扫描指定包下所有被 @FeignClient 注解标记的接口。@FeignClient 接口,OpenFeign 会通过 Feign.Builder 创建一个动态代理对象(JDK 动态代理),并将其注册到 Spring 容器中。 当调用代理对象的接口方法时,代理会触发以下操作:
@RequestMapping、@GetMapping、@PostMapping 等注解,提取 HTTP 方法(GET/POST 等)、URL 路径、请求参数、请求头等信息。@FeignClient 中的 value(服务名)和方法上的路径,生成完整的请求 URL(如 http://服务名/路径)。 Client 组件发送 HTTP 请求。默认使用 JDK 原生的 HttpURLConnection,也可配置为 OkHttp、Apache HttpClient 等。 FeignException)。FeignClient 注解:标记接口为 Feign 客户端,包含服务名、URL、 fallback 等配置。Contract:定义注解 解析规则,默认支持 Spring MVC 的注解(如 @RequestMapping),也可自定义。Encoder/Decoder: Encoder:将请求参数对象转换为 HTTP 请求体(如 JSON 序列化)。Decoder:将 HTTP 响应体转换为接口方法的返回值对象。Client:实际执行 HTTP 请求的组件,可替换为 OkHttp、HttpClient 等。Retryer:请求失败时的重试策略,默认不重试,可自定义重试逻辑。Interceptor:请求 / 响应拦截器,可用于统一添加 header、日志打印等。OpenFeign 的核心是通过动态代理将接口方法调用映射为 HTTP 请求,其实现依赖于:

直接在最后添加即可

引入相关依赖

将cart服务中的Item相关的都剪切过来


最后修改下启动类使得他们能够连接起来

可以看到数据正常显示,修改成功!

可以看到我们这里发起请求的时候并没有日志

先添加一个类来存储日志级别

在启动类中应用一下

重新启动项目发起请求查看日志,可以看到这里的日志十分完整了

本文介绍了微服务开发中使用OpenFeign的技术要点。主要内容包括:1)OpenFeign的基本使用,通过声明式接口简化HTTP调用;2)核心原理分析,包括动态代理生成、注解解析、请求构建和响应处理流程;3)优化实践,如引入连接池提高性能;4)最佳使用方式,通过api模块统一管理服务接口;5)日志配置方法,便于调试监控。文章结合具体代码示例,详细讲解了如何利用OpenFeign简化微服务间的远程调用,并给出了性能优化和规范使用的建议。