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
百度慧眼人口位置数据:从原理到实战的GIS处理全流程 本文详细解析百度慧眼人口位置数据的处理全流程,从基本原理到实战应用。通过空间网格划分、终端数量统计等技术手段,百度慧眼数据能准确反映人群分布特征。文章涵盖坐标系转换、核密度分析、热力图制作等GIS处理技巧,并分享商业选址、城市规划等典型业务场景的解决方案,帮助读者高效利用这一数据资源。 阅读详情

相关推荐

OPA(运放)与MOS管组成的恒流源电路

电路图 这是一种由运放组成的恒流源电路。 原理分析: 1. OPA OPA (集成运算放大器)具有开源增益高,输入阻抗大,输出阻抗小的特点。 2. MOS管工作原理 我们知道三极管是利用 Ib 的电流控制 IC 的电流,属于电流控制电流器件。 而MOS则是利用Ugs的电压去控制电流 Id 的,所以说 MOS 管是电压控制电流的器件。 对于N沟道增强型的MOS管,当Ugs>Ugs(th)时,MOS就会开始导通,如果在D极和S极之间加上一定的电压,就会有电流Id产生。 在一定的Uds下,D极电流Id的

暖暖_的_纠结的博客 3万+

负载均衡-Feign(二)

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

华小灼 2794

ThinkPHP+Layui开发的ERP管理系统

ERP采购生产销售系统,一款基于ThinkPHP+Layui开发的ERP管理系统,帮助中小企业实现ERP管理规范化,此系统能为你解决五大方面的经营问题:1.采购管理 2.销售管理 3.仓库管理 4.资金管理 5.生产管理,适用于:服装鞋帽、化妆品、机械机电、家具装潢、建材行业、快销品、母婴用品、办公用品、汽配汽修、生鲜农贸、手机通讯、数码家电、医药用品、制造业、信息技术服务行业等。提供全部无加密服务端和前端源代码,独立部署,不受限制。

u011092458的博客 788

SpringCloud gateway (史上最全)

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

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

A robust and easy to implement method for IMU calibration without external equipments(IMU标定)

A robust and easy to implement method for IMU calibration without external equipments 1 标定原理1 亲试可用,还有动态演示效果不错。相比商用产品的简易标定流程,该标定方法有以下几点不同: 给出了加速度计和陀螺仪更复杂的模型。 利用Allan方差的定义,标定陀螺仪的偏置。 大量冗余数据,保证最优化收敛。利用数十...

擦擦擦大侠的博客 3948

电力现货市场出清机制与节点电价计算实战解析

本文深入解析了电力现货市场的出清机制,特别是节点边际电价的计算原理与实战应用。通过一个基于Matlab和IEEE30节点系统的完整案例,详细演示了如何利用最优潮流模型求解市场出清价格,并提取节点电价,揭示了电网阻塞如何影响实时电价的形成。

weixin_29061425的博客 950

第五章 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

用 CL_ABAP_ZIP 在 ABAP 里打包任意文件:从前端多选到 ZIP 交付的一条龙实践

本文介绍了在SAP ABAP中实现文件打包交付的完整解决方案。文章首先区分了ZIP和GZIP的不同用途:ZIP用于多文件归档,GZIP用于单数据流压缩。核心流程包括四个步骤:文件选择、二进制上传、内存打包和ZIP输出,并提供了关键对象与函数的速查表。针对实际项目中常见的乱码、大文件处理等问题给出了解决方案,最后展示了一个完整的可运行示例代码,涵盖了从文件选择到下载的全流程实现。该方案适用于财务、质量、运维等多种业务场景,能够有效解决多文件交付的最后一公里问题。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 216

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

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

小孔靠得住的博客 3920

ArcGIS实验教程——实验十七:缓冲区分析(Buffer Analysis)

【实验描述】缓冲区(Buffer)是为了识别某一地理实体对周围地物的影响而在其周围建立的一定宽度多边形区域,缓冲区分析(Buffer Analysis)是用来确定不同地理要素的空间临近性或接近程度的一种分析方法。作为GIS的空间分析方法之一,缓冲区分析的应用范围特别广泛,常用于分析矢量实体对周围的影响。例如,工厂排放的废水废气所影响的空间范围等等。 一、缓冲区的基本概念 1、缓冲区 是地理空间目标的一种影响范围或服务范围。 2、缓冲区分析 指根据分析对象的点、线、面实体,自动建立它们周围一定距离的带

智慧空间实验室 1万+

借助Gemini 3 Pro高效解决课题申报中的五大核心痛点,亲测有效经验分享

之前给大家分享过关于AI辅助课题申报的相关的内容,涵盖了申报书部分撰写技巧,但没针对性拆解各位同仁在实际申报时遇到的卡壳的地方。比如选题范围拿捏不准,定的太大,根本没法落地完成;定的太小,研究价值则体现不了;写综述时,容易单纯罗列文献,缺乏批判性视角,没办法自然融入自己的判断,找不到研究缺口;研究方法部分,可能担心方法设计不够严谨,别人难以复现.....针对这些申报中的高频痛点,接下来七哥会从五个核心要点出发,借助Gemini 3 Pro高效解决这些痛点。

智能AI让学术科研更容易 701

Spring Cloud Gateway

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

杀神lwz的博客 2万+

垂直领域论坛数据挖掘:Python突破Discuz!加密与用户画像构建指南

在垂直领域论坛,如专业技术论坛、兴趣爱好社区等,积累了大量有价值的信息和用户数据。这些数据不仅可以帮助我们了解用户的行为模式和兴趣点,还能为社区运营、产品优化、商业决策等提供有力支持。然而,许多基于Discuz!系统的论坛对数据进行了加密保护,给数据挖掘带来了一定的挑战。本文将详细探讨如何使用Python突破Discuz!论坛的加密机制,并构建用户画像,实现数据掘金。

u014481728的博客 1694

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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

尹煜的博客 3465

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

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

tukaliu的专栏 394

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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、付费专栏及课程。

余额充值