声明:本站文章均为作者个人原创,图片均为实际截图。如有需要请收藏网站,禁止转载,谢谢配合!!!

1、给消费者的FeignClient和提供者的controller定义统一的父接口作为标准

统一父接口

public interface UserApi{
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

FeignClient

@FeignClient(value = "userservice")
public interface UserClient extentds  UserApi{}

Controller(接收方,提供对外接口)

@RestController
public class UserController implements UserApi{
    //实现父接口
    public User findById(@PathVariable("id") Long id){
        //
    }
}
但是不建议此种方式,因为它导致项目紧耦合,而且在spring mvc无法正常运行,接收参数不同,代码污染。

2、将FeginClient作为独立模块抽取出来

并把接口有关的pojo 默认的Feign配置都放到这个模块中,提供给所有消费者使用

2.1 创建feign-api的module模块、引入相关依赖

 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.2 把order-service中的UserClient UserPojo DefaultFeignConfiguration都复制到feign-api模块中

 <dependency>
     <groupId>cn.itcast.demo</groupId>
     <artifactId>feign-api</artifactId>
     <version>1.0</version>
</dependency>

2.3 在order-service中引入feign-api依赖并修改相关import

import cn.itcast.feign.clients.UserClient;
import cn.itcast.feign.pojo.User;

2.4 解决UserClient无法引入的问题

由于spring默认只扫描当前模块包,所以无法使用autowired注入UserClient。有两种解决方案

2.4.1 扫描所有client

@EnableFeignClients(basePackages = "cn.bdbk.feign.clients")

2.4.2 直接指定具体的Client

@EnableFeignClients(clients = UserClient.class) //单个client
@EnableFeignClients(clients = {UserClient.class,AbcClient.class}) //多个client