05.Spring Cloud 之 OpenFeign

使用Spring Cloud的openFeign组件踩坑纪实 背景 2021.05.25 晚上,刚要下班回家,突然被拉到一个群里,说是网关有问题,接入的一个应用接口死活注册不上去,新业务无法使用,而且业务方说已经发布过好几次都不生效,但是同一个应用的其他接口却可以正常注册。听起来还挺诡异的,想着重启大法,重启了下网关应用(其实网关好久没有迭代了,挺稳定的)。结果群里更是炸锅了,说原来可以用的接口也没有了,业务完全停滞(小心脏砰砰直跳)。这下搞大了,放下小书包,开始查问题... 解决过程 其实刚开始完全没有头绪,网关没有做任何改动,只是重启应用,怎么会导致业务方原 阅读详情

1. 概述

1.1 OpenFeign 是什么

OpenFeign 可以将提供者提供的 Restful 服务伪装为接口进行消费,消费者只需使用 feign 接口 + 注解的方式即可直接调用提供者提供的 Restful 服务,而无需再使用 RestTemplate

  • Feign 只与消费者端有关,与提供者端无关

  • Feign 本身是一个假的客户端,其不会额外地对请求做处理

  • Feign 是通过注解方式实现 RESTful 请求的

1.2 OpenFeign 与 Ribbon

说到 OpenFeign,不得不提的就是 Ribbon。Ribbon 是 Netflix 公司的一个开源的负载均衡项目,是一个客户端负载均衡器,运行在消费者端。

OpenFeign 也是运行在消费者端的,使用 Ribbon 进行负载均衡,所以 OpenFeign 直接内置了 Ribbon。即在导入 OpenFeign 依赖后,无需再专门导入 Ribbon 依赖了。

1.3 OpenFeign 与 Feign

Spring Cloud D 版及之前的版本使用的是 Feign,而该项目现已更新为了 OpenFeign。所以后续使用的依赖也发生了变化。

<!-- openFeign -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

<!-- feign -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

2. OpenFeign 环境搭建

代码已经上传至 https://github.com/masteryourself-tutorial/tutorial-spring ,详见 tutorial-spring-cloud/tutorial-spring-cloud-consumer/tutorial-spring-cloud-consumer-feign-6003 工程

2.1 配置文件
1. pom.xml
<dependencies>
    <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.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.1.4.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Greenwich.SR6</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
2. application.properties
# 端口号
server.port=6003
# 此实例注册到 eureka 服务端的 name
spring.application.name=tutorial-spring-cloud-consumer-feign
# 指定 eureka 服务注册中心地址
eureka.client.service-url.defaultZone=http://localhost:7001/eureka
# 此实例注册到 eureka 服务端的唯一的实例 ID
eureka.instance.instance-id=tutorial-spring-cloud-consumer-feign-6003
# 是否显示 IP 地址
eureka.instance.prefer-ip-address=true
# eureka 客户需要多长时间发送心跳给 eureka 服务器,表明它仍然活着,默认为 30 秒
eureka.instance.lease-renewal-interval-in-seconds=10
# eureka 服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为 90 秒
eureka.instance.lease-expiration-duration-in-seconds=30
# 设置 info 信息
info.app.name=tutorial-spring-cloud-consumer-feign
# feign 客户端默认连接超时
feign.client.config.default.connect-timeout=5000
# feign 客户端默认读取超时
feign.client.config.default.read-timeout=5000
2.2 代码
1. ConsumerApplication6003
@SpringBootApplication
@EnableFeignClients
public class ConsumerApplication6003 {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication6003.class, args);
    }

}
2. ConsumerController
@RestController
@RequestMapping("/consumer")
public class ConsumerController {

    @Autowired
    private ProviderFeign feign;

    @RequestMapping("/info")
    public Map<String, String> info() {
        return feign.info();
    }

}
3. ProviderFeign
@FeignClient(value = "tutorial-spring-cloud-provider-eureka")
@RequestMapping("/provider")
public interface ProviderFeign {

    @RequestMapping("/info")
    Map<String, String> info();
}

3. Ribbon

代码已经上传至 https://github.com/masteryourself-tutorial/tutorial-spring ,详见 tutorial-spring-cloud/tutorial-spring-cloud-consumer/tutorial-spring-cloud-consumer-feign-loadbalance-6004 工程

3.1 更换内置策略
1. 配置类
/**
 * 方式一:使用代码覆盖默认负载均衡策略
 * 默认使用轮询策略
 *
 * @return {@link IRule}
 */
@Bean
public IRule randomRule() {
    return new RandomRule();
}
2. 配置文件
# 方式二:使用配置文件覆盖默认负载均衡策略,配置格式为 微服务名称.ribbon.NFLoadBalancerRuleClassName
tutorial-spring-cloud-provider-eureka.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
3.2 自定义负载均衡策略
1. CustomRule
public class CustomRule extends AbstractLoadBalancerRule {

    @Value("${ribbon.exclude.ips:}")
    private String excludeIps;

    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {
    }

    @Override
    public Server choose(Object o) {
        // 获取到所有可用的 servers
        List<Server> reachableServers = super.getLoadBalancer().getReachableServers();
        if (reachableServers.size() == 1) {
            return reachableServers.get(0);
        }
        // 排除指定 ip
        List<Server> availableServers = this.excludeIp(reachableServers);
        if (availableServers.size() == 0) {
            return reachableServers.get(new Random().nextInt(reachableServers.size()));
        }
        // 随机抽取一个 server
        return availableServers.get(new Random().nextInt(availableServers.size()));
    }

    private List<Server> excludeIp(List<Server> reachableServers) {
        return reachableServers.stream()
                .filter(server -> !(excludeIps.contains(server.getHost() + ":" + server.getPort())))
                .collect(Collectors.toList());
    }

}
2. application.properties
# 自定义负载均衡策略
ribbon.exclude.ips=192.168.0.113:5003
tutorial-spring-cloud-provider-eureka.ribbon.NFLoadBalancerRuleClassName=pers.masteryourself.tutorial.spring.cloud.consumer.feign.CustomRule
USB之ch376s数据手册          最近师兄交给我一个项目,虽说刚学嵌入式起步,但上手一个项目怎说都是最好的快速学习方式。因为刚了解ch376s管理U盘的数据,所以先是看了ch376s的数据手册。那我就把数据手册直接放上来吧。。。。      1、概述 CH376 是文件管理控制芯片,用于单片机系统读写 U 盘或者 SD 卡中的文件。 CH376 支持 USB 设备方式和 USB 主机方式,并且内置了 USB 通... 阅读详情

相关推荐

DeepSeek-OCR又更新:一起看下OCR1和OCR2

DeepSeek-AI 最近又又开源了,这次是DeepSeek-OCR2,结合之前发布的DeepSeek-OCR ,可以发现DeepSeek走出了一条不同于主流 OCR 方案的技术路线。第一代模型探索了**“视觉作为文本压缩介质”的可行性,打破了传统的序列长度限制;第二代模型则通过“Visual Causal Flow(视觉因果流)”**架构,将因果推理引入视觉编码器,解决了复杂排版下的阅读顺序难题。本文将从架构设计、逻辑结构、训练范式及工程实现四个维度,深度剖析这两代模型的异同与创新。

kakaZhui的博客 623

负载均衡-Feign(二)

Feign 是Spring Cloud Netflix 组件中的一个轻量级RESTFul的HTTP服务客户端,实现了负载均衡和Rest调用的开源框架,封装了Ribbon和RestTemplate;实现了WebService的面向接口编程,进一步降低了项目的耦合度

华小灼 2794

AMBA总线—APB总线协议详解

文章目录一、APB总线介绍1.1.什么是APB总线1.2.典型的基于 AMBA 总线的系统架构1.3.APB信号列表(重点)二、APB总线传输(时序)2.1.APB 状态机2.2.写操作(重要)2.3.读操作(重要)2.4.APB组件接口(重要)2.4.1.APB Bridge框图2.4.2.APB Slave框图三、APB到AHB的接口3.1.读操作3.2.写操作3.3.读写交替传送 一、APB...

Mr.翟的博客 4万+

SpringCloud gateway (史上最全)

前言 疯狂创客圈(笔者尼恩创建的高并发研习社群)Springcloud 高并发系列文章,将为大家介绍三个版本的 高并发秒杀: 一、版本1 :springcloud + zookeeper 秒杀 二、版本2 :springcloud + redis 分布式锁秒杀 三、版本3 :springcloud + Nginx + Lua 高性能版本秒杀 以及有关Springcloud 几篇核心、重要的文章: 一、Springcloud 配置, 史上最全 一文全懂 二、Springcloud 中 Sprin

骏马逸动,心随你动的博客 3万+

OTA(Over-The-Air)升级

OTA(Over-the-Air)是一种通过无线方式进行数据传输和更新的技术,通常用于电子设备(如智能手机、汽车、物联网设备等)的软件、固件或配置更新。OTA可以在设备与服务器之间进行远程传输,用户无需将设备接入电脑或进行有线操作。通过OTA,用户只需要通过Wi-Fi或移动网络连接,便能自动接收并安装最新的更新,而无需手动干预。OTA的优点是便捷和高效,能够确保设备随时保持最新状态,同时减少用户的操作负担。:如智能家居设备、路由器、汽车等硬件设备的固件更新。:确保设备上的应用保持最新版本。

weixin_50127894的博客 5066

别再为EPI形变头疼了!FSL的topup+eddy实战保姆级教程(含AP/PA数据采集要点)

本文详细介绍了如何使用FSL的topup和eddy工具解决EPI形变问题,包括数据采集要点、参数设置和实战操作步骤。通过AP/PA双编码数据和精确的形变场估计,有效矫正MRI图像中的几何畸变,提升弥散数据质量。特别适合需要处理高场强MRI数据的研究人员和技术人员。

weixin_28725949的博客 401

第五章 Feign负载均衡详解

参考官网: https://github.com/OpenFeign/feign在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端。我们可以使用JDK原生的URLConnection、Apache的Http Client、Netty的异步HTTP Client,Spring的RestTemplate。但是,用起来最方便的还是要属Feign了。Feign是一个声明式WebService客户端。

qq_41946216的博客 5852

告别Keil!用VSCode+PlatformIO玩转STC单片机(附自动下载配置)

本文详细介绍了如何从Keil迁移到VSCode+PlatformIO进行STC单片机开发,包括环境搭建、自动下载配置等实用技巧。通过对比传统IDE与现代工具链的差异,展示了VSCode+PlatformIO在代码编辑体验、跨平台支持和开发效率上的优势,帮助开发者实现更流畅的STC单片机开发流程。

weixin_27252001的博客 458

SpringCloud-Feign:负载均衡(基于服务端)

Feign是一个开源的声明式HTTP客户端,它可以简化HTTP API的调用过程。Feign的设计目标是使得使用者可以像调用本地方法一样调用远程服务,使得编写和维护HTTP客户端变得更加简单。类似controller调用service。SpringCloud集成了Ribbon和Eureka,可以使用Feigin提供负载均衡的http客户端只需要创建一个接口,然后添加注解即可~使用Feign时,需要先定义一个接口,该接口中定义了需要远程调用的方法、URL、请求方法、请求头等信息。

小孔靠得住的博客 3920

AutoJs调用DeepSeek大模型接口实战教程 AutoJs接入DeepSeek、 DeepSeek API调用 、 手机脚本接入大模型

通过这篇文章,我们用 AutoJs 成功接入了 DeepSeek Chat API。使用发送请求在 Header 里正确携带 API Key从里拿到最终返回结果这样一来,你就可以在 AutoJs 里实现一个智能助手脚本,甚至做更复杂的 AI 自动化工具。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 469

科研——ICONIP论文修改和提交

ICONIP说明文档

Blackoutdragon的博客 6647

Spring Cloud Gateway

在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去调用。这样的话会产生很多问题,例如:客户端多次请求不同的微服务,增加客户端代码或配置编写的复杂性认证复杂,每个微服务都有独立认证存在跨域请求,在一定场景下处理相对复杂为解决上面的问题所以引入了网关的概念:所谓的API网关,就是指系统的统一入口。

杀神lwz的博客 2万+

【图像超分】论文精读:RepSR: Training Efficient VGG-style Super-Resolution Networks with Structural Re-Paramete

摘要: 本文提出RepSR,一种基于结构重新参数化和批量归一化(BN)的高效VGG式超分辨率网络。针对SR任务中BN易引发伪影的问题,作者通过分析发现训练-测试阶段的不一致性是主因,并提出先使用小批量统计训练、后期切换为总体统计的优化策略。RepSR块设计包含干净的残差路径和带改进BN的扩展-压缩卷积路径,有效平衡了训练非线性与推理效率。实验表明,RepSR在不同模型规模下优于现有重参数化方法,且实际推理速度更快。该工作为SR提供了性能与效率兼优的解决方案,相关代码未开源。 关键词: 超分辨率、结构重参数化

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 305

Feign 系列(05)Spring Cloud OpenFeign 源码解析

Feign 系列(05)Spring Cloud OpenFeign 源码解析 文章目录Feign 系列(05)Spring Cloud OpenFeign 源码解析1. Spring Cloud OpenFeign 最简使用1.1 引入 maven1.2 @EnableFeignClients 注解扫描包1.3 @FeignClient 配置2. Feign 整体装配流程分析3. Feign 自...

binarylei的博客 421

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【Java开发】Spring Cloud 05 :远程服务调用Openfeign 替代 WebClient

在前边章节中,我们借助 Nacos 的服务发现能力,使用 WebClient 实现了服务间调用。从功能层面上来讲,我们已经完美地实现了微服务架构下的远程服务调用,但是从易用性的角度来看,这种实现方式似乎对开发人员并不怎么友好。为了发起一个服务请求,我把整个服务调用的所有信息都写在了代码中,从请求类型、请求路径、再到封装的参数和返回类型。编程体验相当麻烦不说,更关键的是这些代码没有很好地践行职责隔离的原则。

尹煜的博客 3465

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Spring Cloud Alibaba实战05|OpenFeign 进阶:全场景传参、超时配置、异常容错、生产优化

本文是 SCA 实战第 05 篇,基于 JDK17 高版本落地 OpenFeign 生产实操,覆盖四类主流传参写法,配置双层超时与完整调用日志。规范禁用 Feign 原生重试避免重复提交资损,适配 SpringCloud3.x 负载均衡依赖,汇总本地实测踩坑点,配套完整可运行源码。

tukaliu的专栏 394

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

sentinel 05 在spring cloud alibaba中的使用 配合openfeign使用

1.2.2.12.2。

qq_38757863的博客 380

spring-cloud-openfeign 原理浅析

openfeign在使用层面比较简单(几个注解就搞定了),底层逻辑依赖了Feign, Spring ,SpringCloud 本文尝试理下spring-cloud-openfeign底层运行机制(这样才能记得更牢啊 哈哈哈),有问题的地方大家也可以指出来。

d1451545368的博客 1437

Feign和openFeign区别和openFeign教程

一、Feign与OpenFeign的区别 1)Feign是Spring Cloud组件中一个轻量级RESTful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用接口,就可以调用服务注册中心的服务。 Feign的依赖 1 <dependency> 2 <groupId>org.springframework.cloud</groupId> 3

Java后端技术栈 3万+

Spring Cloud OpenFeign官方文档学习

Feign是一个声明式的web服务客户端,让编写web服务客户端变得非常容易,只需创建一个接口并在接口上添加注解即可。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡(也可以配合Spring Cloud CircuitBreaker、Spring Cloud LoadBalancer一起使用)。

pscool的博客 2741

Spring Cloud 集成 Nacos、openfeign 错误解决

前言: 在集成 Nacos 和 openfeign 的时候,过程出现了一点小曲折,这里简单分享一下,希望可以帮助到有需要的朋友。 Spring boot 版本如下: <version>2.4.5</version> Spring Alibaba 版本如下: <version>2021.1</version> 错误一: 关键错误信息: 没有定义用于负载平衡的 Feign 客户端。您是否忘记包含 spring-cloud-starter-netflix-rib

weixin_42118323的博客 746

Spring Boot集成Spring Cloud OpenFeign进行声明式REST客户端

Spring Cloud OpenFeign是一个声明式的REST客户端,它使得编写Web服务客户端变得更加简单。Spring Cloud OpenFeign为Spring Boot应用提供了一种声明式的服务调用方式,简化了客户端的开发。OpenFeign是Netflix的一个开源项目,Spring Cloud OpenFeign是它的Spring Cloud兼容版本。它简化了编写Web服务客户端的过程,允许开发者通过定义Java接口的方式来声明对其他服务的调用。:Feign支持请求和响应的GZIP压缩。

技术研究中心 965

Spring Cloud OpenFeign 客户端

当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。OpenFeign对Http请求做了优雅的伪装,不过其底层发起http请求,依赖于其它的框架。OpenFeign只会在FeignClient所在包的日志级别为DEBUG时,才会输出日志。HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息。FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。BASIC:仅记录请求的方法,URL以及响应状态码和执行时间。

ling_zhi_xin的博客 458
上一篇: 04.Spring Cloud 之 Eureka Server 源码解析
下一篇: 03.Dubbo 应用之扩展机制
masteryourself
博客等级 码龄9年 13粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值