问题: 微服务提供的接口, 一般情况下在每个调用方都需要定义一份接口, 供调用方内部使用. 这种方案会使得同一份接口在不同微服务项目/模块中多次重复定义.
    解决方案: 定义一个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

    1. 先将demo-search独立出client包, 其中定义search-service对外提供的feign接口, common包放置client以及service通用的类

      1. @FeignClient("SEARCH-SERVICE")
      2. public interface DemoSearchService {
      3. @GetMapping("/search")
      4. String hello();
      5. @PostMapping("/search")
      6. DemoDTO createDemoDTO(@RequestBody DemoDTO demoDTO);
      7. }
    2. demo-web直接依赖demo-search-client, 进行接口调用

      1. @RestController
      2. @RequestMapping("/web/search")
      3. public class DemoSearchController {
      4. @Autowired
      5. private DemoSearchServiceClient demoSearchServiceClient;
      6. @GetMapping
      7. public String hello() {
      8. return demoSearchServiceClient.hello();
      9. }
      10. @PostMapping
      11. public DemoDTO createDemoDTO(@RequestBody DemoDTO demoDTO) {
      12. return demoSearchServiceClient.createDemoDTO(demoDTO);
      13. }
      14. }

    补充: 若web项目启动报没有demoSearchServiceClient这个Bean, 注意在@EnableFeignClients(basePackages = "org.example")注解上指定扫描的包路径

    该注解一般打在启动类上, 默认包路径是启动类同级的包路径