【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】
方式一(继承):给消费者的FeignClient和提供者的controller定义统一的父接口作为标准。
看看我们之前写的接口

可以看到,这两个方法居然基本上一毛一样【但是必须得一样】
因为orderservice 之所以能够访问到userservice,就是基于我们写的 UserClient 接口才能够实现的
【既然一样,那可以做个抽取吗? 答案是当然的】

接口继承接口,controller 类实现接口
但是这个样子存在一些问题:

大概意思就是:一般我们不推荐在服务和客户端之间共享接口,因为它会造成紧耦合,而且这种解决方案对SpringMVC 不起作用【方法参数是继承不下来的】
即:
尽管这种方式有缺点,但是它遵循 了面向契约编程的思想,在企业中还是有用的
方式二(抽取):将FeignClient抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用

服务多了以后,就会出现超级多的UserClient,于是有了下面的模式
UserClient 被抽取成 独立的模块

最后服务去引用就行了

但是这种方式也不是完美的,如果说feign-api 中有了巨多的接口方法,我一个order-service 可能只需要其中的一个,那引入的时候就会有很多东西 冗余 了
【两种方式按照实际业务需要选择】
Feign的最佳实践:
①让controller和FeignClient继承同一接口
②将FeignClient、POJO、Feign的默认配置都定义到一个项目中,供所有消费者使用