问题: 微服务提供的接口, 一般情况下在每个调用方都需要定义一份接口, 供调用方内部使用. 这种方案会使得同一份接口在不同微服务项目/模块中多次重复定义.
解决方案: 定义一个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 {@Autowiredprivate DemoSearchServiceClient demoSearchServiceClient;@GetMappingpublic String hello() {return demoSearchServiceClient.hello();}@PostMappingpublic DemoDTO createDemoDTO(@RequestBody DemoDTO demoDTO) {return demoSearchServiceClient.createDemoDTO(demoDTO);}}
补充: 若web项目启动报没有demoSearchServiceClient这个Bean, 注意在@EnableFeignClients(basePackages = "org.example")注解上指定扫描的包路径
该注解一般打在启动类上, 默认包路径是启动类同级的包路径
