OpenFeign避坑指南

前言

因为自己在使用SpringCloud OpenFeign组件的时候,因为版本的原因导致踩了不少坑,所以在此做一个记录,防止以后犯相同的错误,以及希望能够给予其他犯相同错误的小白一些避雷的经验。

  • 说明

SpringCloud Feign在Hoxton.M2 RELEASED版本之后不再使用Ribbon作为负载均衡,取而代之的是loadbalancer。因此如果你的SpringCloud使用的版本在M版之前,那么你直接引入openfeign依赖即可,它会自动引入ribbon依赖;如果你的SpringCloud使用的版本在M之后,那么除了引入openfeign依赖,还需要手动地引入loadbalancer依赖,否则会报相关负载均衡找不到错误。下面针对两种版本都做以示例说明:

SpringCloud M版之前

这里假设我使用的是SpringCloud H版,父工程依赖如下:

<!--spring cloud Hoxton.SR1-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>Hoxton.SR1</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

在项目里引入openfeign依赖:

<!--openfeign-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  • 查看openfeign依赖关系

image.png

可以看到openfeign会自动引入ribbon相关依赖,因此不需要我们再手动地引入ribbon了。

SpringCloud M版之后

这里假设我使用的是spring cloud 2021.0.4版,父工程依赖如下:

<!--spring cloud 2021.0.4-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>2021.0.4</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

在项目里引入openfeign依赖:

<!--openfeign-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  • 查看openfeign依赖关系

image.png

可以看到openfeign并不会自动引入ribbon
直接启动服务就会抛出异常:No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer?

  • 引入loadbalancer
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

image.png

OpenFeign快速开始

准备两个服务:服务生产者–coupon、服务消费者–member

coupon消费券服务

  • 提供服务接口即可!
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
    @RequestMapping("/getCoupon")
    public R getCoupon(){
        CouponEntity couponEntity = new CouponEntity();
        couponEntity.setCouponName("满100减10元");
        return R.ok().put("coupons", Arrays.asList(couponEntity));
    }
}

member会员服务

  1. 引入依赖:openfeign+loadbalancer
  2. 编写feign接口.
@FeignClient("gulimall-coupon")
public interface CouponClient {

    @RequestMapping("/coupon/coupon/getCoupon")
    public R getCoupon();
}
  1. @FeignClient注解:声明式注解,表示该接口是一个feign接口客户端,通过该客户端提供远程调用服务。你要远程调用哪个服务,就写该服务在注册中心的服务名
  2. feign接口要与目标接口的方法结构一致(方法名、参数列表、返回值等)
  1. 开启feign远程调用功能。方式:在主启动类上添加@EnableFeignClients注解即可!
@SpringBootApplication
@EnableFeignClients(basePackages = "com.liucc.gulimall.member.feign")
@MapperScan("com.liucc.gulimall.member.dao")
public class MemberApplication {
    public static void main(String[] args) {
        SpringApplication.run(MemberApplication.class, args);
    }
}
  1. 使用
@RestController
@RequestMapping("member/member")
public class MemberController {

    @Autowired
    private CouponClient couponClient;

    /**
     * 获取会员优惠卷
     * 测试openfeign使用
     * @return
     */
    @RequestMapping("/getMemberCoupons")
    public R getMemberCoupons(){
        R result = couponClient.getCoupon();
        return R.ok().put("memberCoupons", result.get("coupons"));
    }
}
  1. 测试:http://localhost:9000/member/member/getMemberCoupons

image.png

远程调用成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值