SpringCloud的Fegin,Ribbon详解

SpringCloud的Fegin,Ribbon详解

大家好,我是酷酷的韩~ 下面将继续分享springcloud中的feign和ribbon。
在这里插入图片描述
一.fegin简介?
1.feign是netflix开发的声明式,模板化的HTTP客户端,Feign可以帮我们更快捷,优雅的调用HTTP API

2.feign采用的是基于接口的注解

3.feign整合了ribbon,具有负载均衡的能力。

4.整合了hystrix,具有熔断的能力。

二.fegin的使用:
1.添加pom文件

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

2.启动类添加@EnableFeignClients

3.定义一个接口@FeignClient(name=“xxx”)指定调用哪个服务

4.fallback调用失败回调方法,需要使用如下配置:

feign:
 hystrix:
  enabled:true

5.一般情况下 ribbon的超时时间<hystrix超时时间(因为涉及到ribbon的重试机制)
因为ribbon中重试机制与feign的重试机制有冲突,源码中默认关闭feign的重试机制。

 ribbon:
  ReadTimeout: 3000
  ConnectTimeout: 3000
  MaxAutoRetries: 1 #同一台实例最大重试次数,不包括首次调用
  MaxAutoRetriesNextServer: 1 #重试负载均衡其他的实例最大重试次数,不包括首次调用
  OkToRetryOnAllOperations: false  #是否所有操作都重试 

根据上面的参数计算重试的次数:MaxAutoRetries+MaxAutoRetriesNextServer+(MaxAutoRetries *MaxAutoRetriesNextServer) 即重试3次 则一共产生4次调用
如果在重试期间,时间超过了hystrix的超时时间,便会立即执行熔断,fallback。所以要根据上面配置的参数计算hystrix的超时时间,使得在重试期间不能达到hystrix的超时时间,不然重试机制就会没有意义
hystrix超时时间的计算: (1 + MaxAutoRetries + MaxAutoRetriesNextServer) * ReadTimeout 即按照以上的配置 hystrix的超时时间应该配置为 (1+1+1)3=9秒
当ribbon超时后且hystrix没有超时,便会采取重试机制。当OkToRetryOnAllOperations设置为false时,只会对get请求进行重试。如果设置为true,便会对所有的请求进行重试,如果是put或post等写操作,如果服务器接口没做幂等性,会产生不好的结果,所以OkToRetryOnAllOperations慎用。
如果不配置ribbon的重试次数,默认会重试一次
默认情况下,GET方式请求无论是连接异常还是读取异常,都会进行重试
非GET方式请求,只有连接异常时,才会进行重试
三.示例:
1.这里有两个服务,hjq-provider-mh,hjh-provider-rw。首先在hjq-provider-rw中写一个接口,如下:

  /**
     * 测试熔断
     */
    @GetMapping(value = "user/test")
    public String test() {
        try {
            Thread.sleep(2000);
            return "测试1";
        } catch (InterruptedException e) {

        }
        return "测试2";
    }

全路径为/rw/user/test
2.在hjq-provider-mh中写一个接口

@RestController
@Slf4j
public class TestFeignController {
    @Autowired
    private TestFeign testFeign;

    @GetMapping("/test/test")
    public String test(@RequestParam("number") Integer number) {
        if (number == 1) {
            return "success";
        }
        return testFeign.test();
    }
}

feign调用方:

@FeignClient(value = "hjq-provider-rw",fallback = TestFeign.TestFeignA.class)
public interface TestFeign {
    @GetMapping(value = "/rw/user/test")
    public String test();

    @Component
    @Slf4j
    static class TestFeignA implements TestFeign{
        @Override
        public String test() {
            log.error("挤爆了!");
            return "挤爆了!";
        }
    }
}

其中@FeignClient中value是指定服务名,fallback指降级后的返回,当被调用方(这里是hjq-provider-rw)服务停止时会出现服务降级,返回’“挤爆了”,feign默认是不开启服务熔断,不能够走fallback,需要添加如下配置:

#开启hystrix配置
feign:
  hystrix:
    enabled: true #开启feign熔断

3.两个服务都启动,调用hjq-provider-mh中的接口,正常情况如下
在这里插入图片描述
当断开hjq-provider-rw服务,或者里面的服务报错,异常,则是以下:
在这里插入图片描述
4.监控熔断,当多次出现此情况时,出现熔断如下:
在这里插入图片描述
Circuit:Open熔断器打开,默认是20个服务 50%出错,则出现服务熔断,此时可以参考另一篇文章:https://blog.csdn.net/hjq_ku/article/details/89520168 里面有介绍到详细一些。

天行健,君子以自強不息,地勢坤,君子以厚德载物。------酷酷的韩~

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Spring Cloud是一个基于Spring Boot的开发工具集,提供了一系列用于构建分布式系统的解决方案。其中,FeignRibbon是Spring Cloud中常用的两个组件。 Feign一个声明式的Web服务客户端,用于简化使用Spring Cloud的服务之间进行通信的过程。它通过支持注解方式来定义和使用服务接口,底层使用的是基于反射的动态代理技术,将接口和实际调用的服务进行映射。Feign通过集成Ribbon来实现负载均衡的功能。 Ribbon一个负载均衡的组件,它根据一系列的负载均衡策略,从多个服务实例中选择一个要调用的实例。Ribbon通过监听Eureka注册中心上已注册的服务列表,并通过默认的轮询算法选择一个实例。在Feign中,Ribbon用于根据服务接口定义的URL和方法,选择一个具体的服务进行调用。 FeignRibbon的原理可以简单总结如下:首先,Feign通过使用@EnableFeignClients注解开启Feign功能,扫描包中带有@FeignClient注解的接口定义。接着,Feign将这些接口定义转化为动态代理对象,在调用接口方法时,实际上是通过动态代理对象进行了解析和转发,最终会调用到具体的服务实例上。此时,Ribbon会根据一定的策略从多个服务实例中选择一个实例进行调用,并返回调用结果。整个调用过程是通过HTTP协议进行通信的。 总之,Spring Cloud中的FeignRibbon组件能够实现微服务之间的通信和负载均衡功能。Feign简化了基于HTTP的服务接口定义和调用的过程,而Ribbon则负责根据一定的负载均衡策略选择合适的服务实例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韩金群

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值