问题: 微服务提供的接口, 一般情况下在每个调用方都需要定义一份接口, 供调用方内部使用. 这种方案会使得同一份接口在不同微服务项目/模块中多次重复定义.
解决方案: 定义一个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")
注解上指定扫描的包路径
该注解一般打在启动类上, 默认包路径是启动类同级的包路径