侧边栏壁纸
  • 累计撰写 58 篇文章
  • 累计创建 67 个标签
  • 累计收到 1 条评论

SpringCloud | OpenFeign

lihaocheng
2022-02-15 / 0 评论 / 0 点赞 / 673 阅读 / 1,552 字
温馨提示:
晚上记得开启夜间模式哦

一、OpenFeign 原理

1. OpenFeign 动态代理

  1. 主动扫描所有有@FeginClient 的接口,并加载
  2. 对每一个 @FeginClient 接口生成动态代理对象
  3. 将动态代理对象添加到Spring 上下文
  4. LocalService 发起调用
    1-3 步均发生在启动时

二、使用 OpenFeign

  1. 添加 OpenFeign Maven 依赖

<!-- OpenFeign组件 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.创建远程调用的 service 并加上 @FeignClient 注解

@FeignClient(value = "my-server1", path = "/calculator")
public interface CalculationService{
	//其他代码
}

三、参数说明

1.统一路径配置 path

统一的路径参数可以配置在 url 中

2.指定远程调用地址 url

url一般用于调试,可以手动指定@FeignClient调用的地址

3.降级 fallback

使用 Hystrix + fallback 实现
实现一个TemplateServiceFallback,实现 TemplateService 接口
在FeignClient 中指定

@FeignClient(value = "coupon-template-serv", path = "/template",       // 通过fallback指定降级逻辑       fallback = TemplateServiceFallback.class)

四、注意事项

1. 日志级别配置

微服务之间的调用,是测试的一个难点。因此我们可以单独调整远程调用接口的日志级别

logging:
  level:
    com.lhc.inner.feign.AService: debug
    com.lhc.inner.feign.BService: debug

在日志配置类中,改变日志级别为 FULL,记录完整的调用信息


@Bean
Logger.Level feignLogger() {
    return Logger.Level.FULL;
}

2.必须配置超时

OpenFeign 默认的读取超时时间是 1 秒,对于大部分业务场景来说,这个时间都过于短了。
我就亲身经历过,因为数据量太大,OpenFeign 调用的接口读取超时,导致不可用的情况。

因此,对于 OpenFeign,我们必须在配置中配置合适的超时时间。

这里 OpenFeign 还有一个坑———— 配置读取超时(readTimeout)时,必须配置连接超时(connectTimeout)才能生效。

我一般会将 readTimeout 设置在 5s-30s。而 connectTimeout 设置在 1s-5s 之间。
这里的逻辑是这样的,超过 30s 的读取很有可能拖慢下游的业务。而超过 5s 都没有连接上,肯定不是因为网络波动,而是需要看看对应的服务是不是挂了。


feign:
  client:
    config:
      # 全局超时配置
      default:
        # 网络连接阶段5秒超时
        connectTimeout: 5000
        # 服务请求响应阶段30秒超时
        readTimeout: 30000
      # 针对某个特定服务的超时配置
      my-server:
        connectTimeout: 1000
        readTimeout: 2000

在上面的配置中,我还加入针对某个特定服务的超时配置。对于特殊的业务我们可以自行来调整超时时间。
(注:上面的单位都是毫秒)

0

评论区