引言
在使用Feign进行远程调用的实际工作当中,你会发现,feign的客户端与服务提供者的Controller代码十分类型。
//Feign客户端
@FeignClient("")
public interface UserClient{
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
//Controller
@RestController
public class UserController{
@GetMapping("/user/{id}")
public User findById(@PathVariable("id") Long id){
return userService.getUserById(id);
}
}
通过以上代码分析,可以使用两种方法来优化远程调用。
第一种,抽取父接口。众所周知,Feign的客户端实际上是一个接口,而Controller则是一个类。我们可以抽取相同的代码,编写一个共同的接口A。Feign客户端extends该接口A,Controller则实现该implement该接口A。
第二种,抽取独立模块。将所有的Feign的客户端抽取成一个独立模块,在需要使用的工程上,引入该模块依赖,使用即可。
第一种:抽取父接口
//父接口
public interface UserAPI{
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
//Feign客户端
@FeignClient("")
public interface UserClient extends UserAPI{
//无需编写。
}
//Controller
@RestController
public class UserController implement UserAPI{
@GetMapping("/user/{id}")
public User findById(@PathVariable("id") Long id){
return userService.getUserById(id);
}
}
第二种:抽取独立模块
将所有的Client端单独放在一个模块或者工程里面,包括POJO。
如下:
比如:order工程下需要用到该远程调用,则在pom文件下引入该依赖坐标。
<dependency>
<groupId>xxxxx</groupId>
<artifactId>feign-api</artifactId>
<version>1.0</version>
</dependency>
之后在需要进行远程调用的地方进行调用即可。
注意:如出现扫描包问题,可在开启Feign的注解上增加其路径,可以在注解上指定要加载的client接口。
@EnableFeignClients(basePackages = "xxx.xxx.clients")
//或者
@EnableFeignClients(clients = {xxxClient.class})
总结:
两种都是很不错的Feign远程调研的实践例子。第一种充分利用了Java的特性来实现。第二种则利用模块划分及引入来实践。希望在工作中能帮助到各位小伙伴。谢谢~