问题: 微服务提供的接口, 一般情况下在每个调用方都需要定义一份接口, 供调用方内部使用. 这种方案会使得同一份接口在不同微服务项目/模块中多次重复定义.
解决方案: 定义一个client端, 里面由服务提供方来统一维护对外的接口, 若是同一项目其他微服务模块, 可直接依赖client端直接调用接口, 若不同项目, 则需要将client端打jar包以提供接口
示例项目结构如下:  由demo-search提供一个搜索服务, demo-web模块为调用方
demo-cloud
—demo-eureka-server
—demo-search
—demo-search-client
—demo-search-common
—demo-search-service
—demo-web
- 先将demo-search独立出client包, 其中定义search-service对外提供的feign接口, common包放置client以及service通用的类 - @FeignClient("SEARCH-SERVICE")
- public interface DemoSearchService {
- @GetMapping("/search")
- String hello();
- @PostMapping("/search")
- DemoDTO createDemoDTO(@RequestBody DemoDTO demoDTO);
- }
 
- demo-web直接依赖demo-search-client, 进行接口调用 - @RestController
- @RequestMapping("/web/search")
- public class DemoSearchController {
- @Autowired
- private DemoSearchServiceClient demoSearchServiceClient;
- @GetMapping
- public String hello() {
- return demoSearchServiceClient.hello();
- }
- @PostMapping
- public DemoDTO createDemoDTO(@RequestBody DemoDTO demoDTO) {
- return demoSearchServiceClient.createDemoDTO(demoDTO);
- }
- }
 
补充: 若web项目启动报没有demoSearchServiceClient这个Bean, 注意在@EnableFeignClients(basePackages = "org.example")注解上指定扫描的包路径
该注解一般打在启动类上, 默认包路径是启动类同级的包路径
 
                         
                                

