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 里面有介绍到详细一些。

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

发布了13 篇原创文章 · 获赞 33 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/hjq_ku/article/details/89552113