前言
因为自己在使用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依赖关系
可以看到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依赖关系
可以看到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>
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会员服务
- 引入依赖:openfeign+loadbalancer
- 编写feign接口.
@FeignClient("gulimall-coupon")
public interface CouponClient {
@RequestMapping("/coupon/coupon/getCoupon")
public R getCoupon();
}
- @FeignClient注解:声明式注解,表示该接口是一个feign接口客户端,通过该客户端提供远程调用服务。你要远程调用哪个服务,就写该服务在注册中心的服务名
- feign接口要与目标接口的方法结构一致(方法名、参数列表、返回值等)
- 开启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);
}
}
- 使用
@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"));
}
}
- 测试:http://localhost:9000/member/member/getMemberCoupons
远程调用成功!