news 2026/5/9 1:45:59

【微服务之服务调用OpenFeign】OpenFeign应用示例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【微服务之服务调用OpenFeign】OpenFeign应用示例

一 OpenFeign介绍

OpenFeign是一种基于Spring Cloud的声明式REST客户端,它简化了与HTTP服务交互的过程。它将REST客户端的定义转化为Java接口,并且可以通过注解的方式来声明请求参数、请求方式、请求头等信息,从而使得客户端的使用更加方便和简洁。同时,它还提供了负载均衡和服务发现等功能,可以与Eureka、Consul等注册中心集成使用。
参考文档:官方文档

二 调用组件Spring Cloud OpenFeign示例

1. 引入OpenFeign依赖

在父模块或服务模块引入依赖

<!-- 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>

2. 在启动类开启@EnableFeignClients注解

// 开启feign 功能@EnableFeignClients@EnableDiscoveryClient@SpringBootApplicationpublicclassOrderServiceApplication{publicstaticvoidmain(String[]args){SpringApplication.run(OrderServiceApplication.class,args);}}

3.编写OpenFeign客户端

// 调用自有服务@FeignClient(value="user-service")publicinterfaceUserFeignClient{@GetMapping("/user/{id}")UserEntitygetUserById(@PathVariable("id")Longid);}
//调用第三方应用服务,可以设置调用接口url@FeignClient(value="xxxxx-service",url="https://xxxxx")publicinterfaceXxxxFeignClient{@GetMapping("/xxxx/{id}")XxxxEntitygetXxxxById(@PathVariable("id")Longid);}

4.像调用本地方式一样调用远程微服务提供者

@RequestMapping("/api/order")@RestControllerpublicclassOrderController{@AutowiredUserFeignClientuserFeignClient;@GetMapping("/orderUser/{id}")publicUserEntitygetUSerById(@PathVariable("id")Longid){returnuserFeignClient.getUserById(id);}}

5.OpenFeign调用流程

三 OpenFeign其他功能支持

1. 日志配置

每个创建的 Feign 客户端都会创建一个logger。在调试程序时,配置Feign的日志了,打印出Feign的请求信息来。

  • NONE, 没日志(默认)。

  • BASIC, 只记录请求方法和URL以及响应状态代码和执行时间。

  • HEADERS, 记录基本信息以及请求和响应头。

  • FULL, 记录请求和响应的header、正文和元数据。

配置javaBean

@ConfigurationpublicclassOrderConfig{@BeanLogger.LevelfeignLoggerLevel(){returnLogger.Level.FULL;}}

添加yml 配置

spring:cloud:openfeign:client:config:#全局default:logger-level:full#对应feign服务名user-service:logger-level:full

2. 超时时间设置

open Feign使用两个超时参数:

  • connect Timeout 连接超时,可以防止由于较长的服务器处理时间而阻塞调用者。
  • readTimeout 请求处理超时,从连接建立时开始应用,当返回响应花费太长时间时触发。

添加yml 配置

spring:cloud:openfeign:client:config:#全局default:logger-level:fullconnect-timeout:3000read-timeout:3000#对应feign服务名user-service:logger-level:fullconnect-timeout:3000read-timeout:5000

3. 客户端组件配置

Feign 中默认使用 JDK 原生的 URLConnection 发送 HTTP 请求,没有连接池,可以集成别的组件来替换掉 URLConnection,比如 Apache HttpClient5,OkHttp。
父pom 引入依赖

<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-hc5</artifactId></dependency>

添加yml 配置

spring:cloud:openfeign:#使用 Apache HttpClient 5httpclient:hc5:enable:trueclient:config:#全局default:logger-level:fullconnect-timeout:3000read-timeout:3000#对应feign服务名user-service:logger-level:fullconnect-timeout:3000read-timeout:5000

4.拦截器配置

通常我们调用的接口都是有权限控制的,很多时候可能认证的值是通过参数传递的,还有就是通过请求头去传递认证信息。设置feign拦截器,每次 feign 发起http调用之前,会去执行拦截器中的逻辑。
使用场景:统一添加 header 信息;对 body 中的信息做修改或替换;

packageorg.example.interceptor;importfeign.RequestInterceptor;importfeign.RequestTemplate;importjakarta.servlet.http.HttpServletRequest;importlombok.extern.slf4j.Slf4j;importorg.springframework.stereotype.Component;importorg.springframework.web.context.request.RequestContextHolder;importorg.springframework.web.context.request.ServletRequestAttributes;importjava.util.UUID;@Slf4j@ComponentpublicclassXTokenRequestInterceptorimplementsRequestInterceptor{/** * feign请求拦截器,将共享数据传到下游 * @param template */@Overridepublicvoidapply(RequestTemplatetemplate){// 业务逻辑 模拟认证逻辑ServletRequestAttributesattributes=(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();if(null!=attributes){HttpServletRequestrequest=attributes.getRequest();Stringaccess_token=request.getHeader("Authorization");//设置tokentemplate.header("Authorization",access_token);}}/** * 自定义拦截器 * @return */@BeanpublicXTokenRequestInterceptorfeignAuthRequestInterceptor(){returnnewXTokenRequestInterceptor();}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/4 8:42:04

DeepSeek-R1-Distill-Qwen-1.5B数学能力测试:从部署到实战全流程

DeepSeek-R1-Distill-Qwen-1.5B数学能力测试&#xff1a;从部署到实战全流程 1. 引言 1.1 业务场景描述 在当前大模型广泛应用的背景下&#xff0c;轻量级但具备强推理能力的模型成为边缘计算、教育辅助和自动化编程等场景的理想选择。DeepSeek-R1-Distill-Qwen-1.5B 正是在…

作者头像 李华
网站建设 2026/5/7 4:21:53

TensorFlow-v2.9命名实体识别:BERT+CRF联合训练

TensorFlow-v2.9命名实体识别&#xff1a;BERTCRF联合训练 1. 技术背景与问题提出 命名实体识别&#xff08;Named Entity Recognition, NER&#xff09;是自然语言处理中的基础任务之一&#xff0c;旨在从非结构化文本中识别出具有特定意义的实体&#xff0c;如人名、地名、…

作者头像 李华
网站建设 2026/5/8 7:01:00

BSHM镜像推理脚本详解,参数设置不踩坑

BSHM镜像推理脚本详解&#xff0c;参数设置不踩坑 1. 引言 1.1 技术背景与应用场景 人像抠图&#xff08;Human Matting&#xff09;是计算机视觉中一项关键的细粒度图像分割任务&#xff0c;其目标不仅是识别出人物轮廓&#xff0c;还需精确到发丝、透明区域等细节&#xf…

作者头像 李华
网站建设 2026/5/7 0:39:24

通义千问3-Embedding-4B应用指南:多语言翻译辅助

通义千问3-Embedding-4B应用指南&#xff1a;多语言翻译辅助 1. 引言 随着全球化信息流动的加速&#xff0c;跨语言内容理解与检索需求日益增长。在自然语言处理任务中&#xff0c;高质量的文本向量化模型成为支撑多语言语义搜索、文档对齐、bitext挖掘等关键能力的核心基础设…

作者头像 李华
网站建设 2026/4/23 18:58:41

PyTorch 2.7学术福利:教育邮箱认证,GPU时长免费送

PyTorch 2.7学术福利&#xff1a;教育邮箱认证&#xff0c;GPU时长免费送 作为一名在科研一线挣扎多年的“老博士”&#xff0c;我太懂那种为了跑一个实验、验证一个模型&#xff0c;不得不排队等服务器、省着用GPU时长的窘境了。尤其是当你手头的项目明确要求使用 PyTorch 2.…

作者头像 李华