最近的项目采用了Feign进行微服务之间的调用,因为是第一次使用,遇到了很多坑,现在简单整理了下,希望能帮到码友们。

首先先来看第一个问题:

启动类如果不加@EnableHystrix @EnableDiscoveryClient @EnableFeignClients三个注解,Feign是无效的,所以还是得继续

第二个问题:

同一个项目,同时开了多个接口,value是同一个,比如下边EncodeRuleService 和BusinessRulesManageService 都是同system项目的接口,当然熔断类必须不同。记得要开启

spring:
  main:
    allow-bean-definition-overriding: true #允许覆盖bean,暂时用户多个feign定义

@FeignClient(value="system",fallback = EncodeRuleServiceFallBack.class)

public interface EncodeRuleService

@FeignClient(value="system",fallback = BusinessRulesManageServiceFallBack.class)
public interface BusinessRulesManageService 

 第三个问题:

如果加了熔断机制,项目启动后,第一次调用上面提到的system服务接口,有可能失败,这是因为熔断的超时时间太短了,还没初始化完成就结束了,记得配置加上

首次运行服务时,出现熔断降级原因:

Hystrix默认的超时时间是1秒,如果超过这个时间尚未响应,将会进入fallback代码。而首次请求往往会比较慢(因为Spring的懒加载机制,要实例化一些类),这个响应时间可能就大于1秒了 上面设置为10秒(也可设置为5秒)

#熔断超时时间
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 10000 #10秒

第四个问题:使用feign,正常都会配置网关gateway。如果配置不对,也访问不了

比如yml文件配置时,千万记住格式要正确,yml很容易写错。好像也没有格式化。记得gateway是在cloud下,稍不注意就平级了,起不来。

spring:
 cloud:
  gateway:
    discovery: #是否与服务发现组件进行结合,通过 serviceId(必须设置成大写) 转发到具体的服务实例。默认为false,设为true便开启通过服务中心的自动根据 serviceId 创建路由的功能
      locator:
        lowerCaseServiceId: true
        enabled: true

第五个问题:在工作中遇到了服务与服务之间通过feign调用时报404的问题 原因是因为feign提供者在配置文件中增加了

context-path: /xxxx
这时feign拼出的url为  http://服务名称/方法名称

但是实际的url为 http:// http://服务名称/xxxx/方法名称

最终的解决方案为在feign提供者中增加path:

@FeignClient(
    name = "服务名称",
    path = "/xxxx",
    fallback = Fallback.class,
    configuration = FeignClientConfiguration.class)

第一次写博客,简单粗暴。后续慢慢熟悉后再好好写,主要是把自己项目中遇到的坑分享下,希望能帮到下码友们。期待下期更新。你们的点赞是我继续努力的动力。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐