Feign、Ribbon、Hystrix

news2025/7/22 21:41:34

🏆今日学习目标:

🍀Feign、Ribbon、Hystrix
创作者:林在闪闪发光
⏰预计时间:30分钟
🎉个人主页:林在闪闪发光的个人主页

 🍁林在闪闪发光的个人社区,欢迎你的加入: 林在闪闪发光的社区

高并发 Springcloud 解决方案

在微服务架构的应用中, Feign、Hystrix,Ribbon三者都是必不可少的,可以说已经成为铁三角。

概念介绍

一、Feign 是什么?

Feign 使得用 Java 写 Http 客户端更加容易,这是 Feign 的核心能力!!!

Feign 将其抽象为一套通用逻辑,类似于写普通方法调用一样,Feign 做一层代理,封装这些冗余操作。

feign 大致提供了这些核心能力:

Feign是一款Java语言编写的HttpClient绑定器,在Spring Cloud微服务中用于实现微服务之间的声明式调用。Feign 可以定义请求到其他服务的接口,用于微服务间的调用,不用自己再写http请求,在客户端实现,调用此接口就像远程调用其他服务一样,当请求出错时可以调用接口的实现类来返回

Feign是一个声明式的web service客户端,它使得编写web service客户端更为容易。创建接口,为接口添加注解,即可使用Feign。Feign可以使用Feign注解或者JAX-RS注解,还支持热插拔的编码器和解码器。Spring Cloud为Feign添加了Spring MVC的注解支持,并整合了Ribbon和Eureka来为使用Feign时提供负载均衡。

使用方式

引用方式

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--http连接池-->
<dependency>
   <groupId>org.apache.httpcomponents</groupId>
   <artifactId>httpclient</artifactId>
</dependency>
<!-- openfeign的http请求工具类修改httpclient -->
<dependency>
   <groupId>io.github.openfeign</groupId>
   <artifactId>feign-httpclient</artifactId>

启动方式

启动类增加 注解

 @EnableFeignClients

Feign内置了Ribbon  

Feign的标准写法

//创建服务提供者
@RestController
@RequestMapping("/provider")
public class ProviderController {
	
	@Autowired
	private UserService userService;
 
	@RequestMapping("/getUserById/{id}")
	public User getUserById(@PathVariable Integer id){
		return userService.getUserById(id);
	}
}

   2.创建feign接口     

/**
 * @FeignClient 一般采用服务名进行命名
 * name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现
 * url: url一般用于调试,可以手动指定@FeignClient调用的地址
 *
 * @RequestMapping 主要用于feign框架拼接传递url,弥补了Ribbon的url需要手动拼接的缺陷
 * @PathVariable("id") 当路径为restful风格时路径传参方式
 * @RequestParam("id") 当路径为?id=250 时传参方式
 * @RequestBody User user 当路径为对象时采用的传参方式,(集合、数组等都属于对象)
 */
@FeignClient("feign-provider")
@RequestMapping("/provider")
public interface UserFeign {
 
    @RequestMapping("/getUserById/{id}")
    User getUserById(@PathVariable("id") Integer id);
 
    @RequestMapping("/deleteUserById")
    User deleteUserById(@RequestParam("id") Integer id);//?形式拼接参数,?id=250
 
    @RequestMapping("/addUser")
    User addUser(@RequestBody User user);//pojo--->json
}
//服务消费者
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
 
    @Autowired
    private UserFeign userFeign;
 
    @RequestMapping("/getUserById/{id}")
    public User getUserById(@PathVariable Integer id){
        return userFeign.getUserById(id);
    }
}

  application.yml文件 

server:
  port: 80
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.209.129:8848
  application:
    name: feign-consumer

feign源码的github地址:

GitHub - OpenFeign/feign: Feign makes writing java http clients easier

二、什么是Ribbon?

Ribbon 作为负载均衡,在客户端实现,服务段可以启动两个端口不同但servername一样的服务

Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。简单地说,Ribbon是一个客户端负载均衡器。

Ribbon工作时分为两步:第一步先选择 Eureka Server, 它优先选择在同一个Zone且负载较少的Server;第二步再根据用户指定的策略,在从Server取到的服务注册列表中选择一个地址。其中Ribbon提供了多种策略,例如轮询、随机、根据响应时间加权等。

使用方式

引用方式

(如果不使用ribbon的方式调用,直接使用feign即可;可不引用)

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

 调用的时候直接使用服务名

String url="http://EUREKA-PROVIDE/goods/findOne/"+id;
Goods goods = restTemplate.getForObject(url, Goods.class);

负载均衡:

在provider中加上几行代码,显示调用的端口号

@Autowired
private GoodsService goodsService;
@Value("${server.port}")
private Integer port;
@RequestMapping("/findOne/{id}")
public Goods findOne(@PathVariable Integer id){
    Goods goods = goodsService.findOne(id);
    goods.setTitle(goods.getTitle()+":"+port);//将端口号,设置到了 商品标题上
    return goods;
}

Ribbon负载均衡策略:

随机 :RandomRule
轮询 :RoundRobinRule(默认的负载均衡策略)
最小并发:BestAvailableRule(服务A-1,服务A-2,服务A-3,这三个服务中谁最闲一般认为是性能高)
过滤:AvailabilityFilteringRule(坏的服务过滤掉)
响应时间:WeightedResponseTimeRule(发送一个数据包到三个服务中,看谁最先响应,谁快就调用谁)
轮询重试:RetryRule(默认轮询10次,如果节点出现问题,会去找第二个,如果轮询到10次都挂了那就响应失败)
性能可用性:ZoneAvoidanceRule(综合考虑性能和可用性,看谁分数高就用谁)

三、Hystrix是什么?

hystrix 专注于解决分布式系统延迟和容错问题。换句话说,hystrix 主要解决服务通信间的网络延时、异常等,提供降级和熔断等能力。

还不够通俗?当你在服务 A 调用服务 B 的接口时,可能出现超时、异常的情况,很有可能是服务 B 压力过大,已不堪重负。这时,服务 A 该如何做?

我们可以考虑一些策略,比如,请求失败了,我们返回默认结果;失败率超过多少多少,直接短暂停用接口调用。

Hystrix 便是致力于解决这类问题,实现以上的各种处理策略,熔断、降级等。

遗憾的是,官方已经声明不在维护

Hystrix 在 Netflix 稳定运行多年,足够稳健,我们可以放心在生产环境使用。

使用方式

引用方式

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

 启动类开启熔断

@EnableCircuitBreaker

调用方式

定义@HystrixCommand

@RestController
public class RemoteCallerController {
 
 
    @Autowired
    private IUserService iUserService;
 
 
    @GetMapping("/user/sayHi/{name}")
    @HystrixCommand(fallbackMethod="sayHiFallback")
    public CommonRsp<String> sayHi(@PathVariable("name") String name) throws Exception {
        return iUserService.sayHi(name);
    }
 
 
    public CommonRsp<String> sayHiFallback(@PathVariable("name") String name) throws Exception {
        return CommonRspUtils.buildSuccessRsp("接口失败");
    }
 
 
}

铁三角关系介绍

如果微服务项目加上了spring-cloud-starter-netflix-hystrix依赖,那么,feign会通过代理模式, 自动将所有的方法用 hystrix 进行包装。

在Spring Cloud微服务体系下,微服务之间的互相调用可以通过Feign进行声明式调用,在这个服务调用过程中Feign会通过Ribbon从服务注册中心获取目标微服务的服务器地址列表,之后在网络请求的过程中Ribbon就会将请求以负载均衡的方式打到微服务的不同实例上,从而实现Spring Cloud微服务架构中最为关键的功能即服务发现及客户端负载均衡调用。

另一方面微服务在互相调用的过程中,为了防止某个微服务的故障消耗掉整个系统所有微服务的连接资源,所以在实施微服务调用的过程中我们会要求在调用方实施针对被调用微服务的熔断逻辑。而要实现这个逻辑场景在Spring Cloud微服务框架下我们是通过Hystrix这个框架来实现的。

调用方会针对被调用微服务设置调用超时时间,一旦超时就会进入熔断逻辑,而这个故障指标信息也会返回给Hystrix组件,Hystrix组件会根据熔断情况判断被调微服务的故障情况从而打开熔断器,之后所有针对该微服务的请求就会直接进入熔断逻辑,直到被调微服务故障恢复,Hystrix断路器关闭为止。

三者之间的关系图,大致如下:

 建议使用配置

Fegin配置说明

feign:
  hystrix:
    enabled: true
# feign 的 http 客户端支持 3 种框架;
#HttpURLConnection、httpclient、okhttp;默认是HttpURLConnection(并不支持连接池)。
  httpclient:
    enabled: true # 开启 httpclient
  client:
    config:
      default:
       #默认日志记录NONE【性能最佳,适用于生产】:不记录任何日志(默认值)。
#BASIC【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及执行时间。
#HEADERS:记录BASIC级别的基础上,记录请求和响应的header。
#FULL【比较适用于开发及测试环境定位问题】:记录请求和响应的header、body和元数据。
        loggerLevel: HEADERS
       #连接超时时间
        connectTimeout: 5000
       #读取超时时间
        readTimeout: 5000

Hystrix配置说明

hystrix:
  propagate:
    request-attribute:
      enabled: true
  command:
    #全局默认配置
    default:
      #线程隔离相关
      execution:
        timeout:
          #是否给方法执行设置超时时间,默认为true。一般我们不要改。
          enabled: true
        isolation:
          #配置请求隔离的方式,这里是默认的线程池方式。还有一种信号量的方式 THREAD semaphore,使用比较少。
          strategy: THREAD
          thread:
            #方式执行的超时时间,默认为1000毫秒,在实际场景中需要根据情况设置
            timeoutInMilliseconds: 10000
            #发生超时时是否中断方法的执行,默认值为true。不要改。
            interruptOnTimeout: true
            #是否在方法执行被取消时中断方法,默认值为false。没有实际意义,默认就好!
            interruptOnCancel: false
  circuitBreaker:   #熔断器相关配置
    enabled: true   #是否启动熔断器,默认为true,false表示不要引入Hystrix。
    requestVolumeThreshold: 20     #启用熔断器功能窗口时间内的最小请求数,假设我们设置的窗口时间为10秒,
    sleepWindowInMilliseconds: 5000    #所以此配置的作用是指定熔断器打开后多长时间内允许一次请求尝试执行,官方默认配置为5秒。
    errorThresholdPercentage: 50   #窗口时间内超过50%的请求失败后就会打开熔断器将后续请求快速失败掉,默认配置为50

Ribbon配置说明 

ribbon:
  eager-load:
    enabled: true
  #说明:同一台实例的最大自动重试次数,默认为1次,不包括首次
  MaxAutoRetries: 1
  #说明:要重试的下一个实例的最大数量,默认为1,不包括第一次被调用的实例
  MaxAutoRetriesNextServer: 1
  #说明:是否所有的操作都重试,默认为true
  OkToRetryOnAllOperations: true
  #说明:从注册中心刷新服务器列表信息的时间间隔,默认为2000毫秒,即2秒
  ServerListRefreshInterval: 2000
  #说明:使用Apache HttpClient连接超时时间,单位为毫秒
  ConnectTimeout: 3000
  #说明:使用Apache HttpClient读取的超时时间,单位为毫秒
  ReadTimeout: 3000

希望对未知的你们有所帮助

❤林林在闪闪发光

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/368492.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TensorFlow-Keras - FM、WideAndDeep、DeepFM、DeepFwFM、DeepFmFM 理论与实战

目录 一.引言 二.浅层模型概述 1.LR 2.FM 3.FMM 4.FwFM 5.FmFM 三.常用推荐算法实现 Pre.数据准备 1.FM 2.WideAndDeep 3.DeepFM 4.DeepFwFM 5.DeepFmFM 四.总结 1.函数测试 2.函数效果与复杂度对比[来自FmFM论文] 3.More 一.引言 推荐系统中常见的 CTR 模型…

ONLYOFFICE中的chatGPT 是如何编写毕业论文以及翻译多种语言的

前言 chatGPT这款软件曾被多个国家的大学禁用&#xff0c;我们也多次在网上看到chatGPT帮助应届毕业生编写毕业答辩论文&#xff0c;但是这款软件目前还没有在国内正式上线&#xff0c;ONLYOFFICE7.3版本更新后呢&#xff0c;就添加了chatGPT该功能&#xff0c;并且正常使用。 …

springboot+vue.js学生作业管理系统idea java

由于学校教学功能的特殊定位&#xff0c;致使教师和学生必须在除了简单的师生区别外&#xff0c;还有合作意味的关系。学生上交作业和老师批改作业&#xff0c;这本身除了学习交流外&#xff0c;还是一个合作的范畴。所以&#xff0c;这其中的信息管理流程&#xff0c;需要以一…

SpringBoot中获取wav音频文件的属性

前言 wav文件定义 WAV 文件是以 WAVE 格式保存的音频文件&#xff0c;这是一种用于存储波形数据的标准数字音频文件格式。WAV 文件可能包含具有不同采样率和比特率的音频记录&#xff0c;但通常以 44.1 kHz、16 位、立体声格式保存&#xff0c;这是用于 CD 音频的标准格式。 …

在React项目中引入字体文件并使用

一、背景 设计稿里某些文字所用的字体&#xff0c;系统默认不支持。 比如设计需要的这个字体&#xff1a;EmerlandRegular&#xff0c;即使在css里将文字字体设置为他们&#xff0c;实际效果也显示不出来。 二、现象及原因 1、样式 2、期待效果 3、实际效果 实际上是因为这个…

java设计模式之装饰器设计模式

介绍 装饰器设计模式是一种结构型设计模式&#xff0c;它允许动态地将行为添加到对象中&#xff0c;而无需在对象的类中使用子类化。它允许您通过将对象封装在一个具有新行为的对象中来动态地修改对象的行为。 这种模式是基于组合的思想&#xff0c;而不是继承。 可动态地将责…

CFS三层内网渗透

目录 环境搭建 拿ubuntu主机 信息收集 thinkphp漏洞利用 上线msf 添加路由建立socks代理 bagecms漏洞利用 拿下centos主机 msf上线centos 添加路由&#xff0c;建立socks代理 拿下win7主机 环境搭建 设置三块虚拟网卡 开启虚拟机验证&#xff0c;确保所处网段正确&a…

展会邀约 | 昂视与您相约BTF第12届上海锂电展

BTF第12届上海国际新能源锂电展将于3月7日在上海新国际博览中心举办。此次展会以“锂想动力&#xff0c;共创未来”为主题&#xff0c;汇聚行业内一众翘楚企业与专业观众&#xff0c;为各位展商以及观众提供专业的锂电交流平台&#xff0c;了解与碰撞新产品、新技术与解决方案&…

APISIX网关系列之Dashboard配置路由(二)

APISIX网关系列之Dashboard配置路由(二) 1.概述 APISIX作为系列介绍&#xff0c;将它所有的功能按照职责划分输出到每篇文章中。 上篇文章作为系列的开篇文章对APISIX进行了分析和安装介绍&#xff0c;查看详情地址&#xff1a;https://blog.csdn.net/m0_38039437/article/de…

【经典数据结构OJ讲解】你知道如何用两个队列实现一个栈,如何用两个栈实现一个队列吗?

目录 0.前言 1.回顾什么是队列和栈 2.如何用两个队列实现一个栈 2.1思路讲解 2.2按照思路实现仿生栈的各接口 2.2.1栈的初始化 2.2.2栈的销毁 2.2.3栈的插入 2.2.4栈的删除 2.2.5 栈的栈顶数据 2.2.6 判断当前栈是否为空 3.如何用两个栈实现一个队列 3.1 思路分析…

梯度下降优化器:SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -> Nadam -> AdamW

目录 1 前言 2 梯度概念 3 一般梯度下降法 4 BGD 5 SGD 6 MBGD 7 Momentum 8 SGDM&#xff08;SGD with momentum&#xff09; 9 NAG(Nesterov Accelerated Gradient) 10 AdaGrad 11 RMSProp 12 Adadelta 13 Adam 13 Nadam 14 AdamW 15 Lion&#xff08;EvoLve…

js 实现 Logo(图片)根据图片后面的图片颜色而变化成相反的颜色【解决logo固定后 会出现与不同板块的颜色相同导致于看不清logo的情况】

效果展示&#xff1a; <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <meta http-equiv"X-UA-Compatible" content"ieedge"><style type"text/css…

进程概念(二)

文章目录进程概念&#xff08;二&#xff09;1. 进程状态1.1 阻塞和挂起状态1.2 进程状态1.2.1 进程查看S状态R状态1.2.2 D状态1.2.3 T状态1.2.4 t状态1.2.5 Z状态(僵尸状态)1.3 孤儿进程2. 环境变量2.1 背景2.2 认识环境变量2.3 获取环境变量2.4 环境变量是什么2.5 认识命令行…

vue:pdf.js使用细节/隐藏按钮/设置、获取当前页码/记录阅读进度/切换语言(国际化)

需求描述 在网页中预览pdf时&#xff0c;希望实现3点需求&#xff1a;1、隐藏一些功能按钮&#xff08;比如下载&#xff09;&#xff1b;2、打开pdf时自动定位到最后浏览的页&#xff08;记录阅读进度&#xff09;&#xff1b;3、实现国际化&#xff08;在代码中更改pdf插件使…

Java面试题-Spring框架

Spring框架 1. BeanFactory和ApplicationContext有何区别 BeanFactory是Spring最底层的接口&#xff0c;是IoC的核心&#xff0c;定义IoC的基本功能。 ​ BeanFactory具有&#xff1a;延迟实例化的特性。在启动的时候&#xff0c;不会实例化Bean&#xff0c;只有有需要从容器…

ESMM的理解和高频面试问题

ESMM的理解首先&#xff0c;理解部分主要是ESMM要解决什么问题&#xff0c;以及解决方案。弱未度过原文的可以查阅原论文。论文地址&#xff1a;https://arxiv.org/pdf/1804.07931.pdf实现代码&#xff1a;https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multi…

2023最新谷粒商城笔记之购物车篇(全文总共13万字,超详细)

购物车 环境搭建 创建购物车项目 第一步、创建gulimall-cart服务&#xff0c;并进行降版本处理 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.8.RELEASE<…

angular框架表格自定义导出,ui组件库为【devExpress by devExtreme】导出插件为exceljs、file-saver

前言 使用的ui组件库为devExtreme注意&#xff1a;如果你没有使用这个组件库&#xff0c;那后续的代码可能对你不适用&#xff01;&#xff01;&#xff01;&#xff0c;因为devExtreme和exceljs是结合着来的 其地址如下&#xff1a; devexpress https://js.devexpress.com/ …

一文速学-Pandas查询索引操作详解+实例代码展示

目录 前言 一、按列表索引查询 查询单值 1.at(单值查询-loc) 2.iat(单值查询-iloc) 3. loc(行/列名索引查询) 4. iloc(行/列索引查询) 二、按条件查询 单条件查询 多条件查询 嵌套筛选 总结 前言 关于一文速学Pandas系列已经将基础部分内容更完&#xff0c;基础部分的…

ASEMI高压MOS管ASE65R330参数,ASE65R330图片

编辑-Z ASEMI高压MOS管ASE65R330参数&#xff1a; 型号&#xff1a;ASE65R330 漏极-源极电压&#xff08;VDS&#xff09;&#xff1a;650V 栅源电压&#xff08;VGS&#xff09;&#xff1a;20V 漏极电流&#xff08;ID&#xff09;&#xff1a;12.5A 功耗&#xff08;P…