统一管理SpringCloud中的Feign接口
·
这个是我看网上的一个前辈设计的这种结构!
一、你需要在通用项目(例如:Common项目)中,定义一个接口(例如:UserManageAPI),对应着分布式项目中的一个基础项目(UserManage)。
/**
*这个是在通用项目Common中定义的
*/
public interface UserManageAPI {
@PostMapping("/usermanage/feign/findUser")
UserInfo findUser(@RequestParam("userId") String userId);
}
二、你需要在其他业务项目(例如:Order项目)中,定义一个feign接口,IUserManageFeign继承UserManageAPI。
<!-- order项目中引用了Common项目-->
<dependency>
<groupId>com.test</groupId>
<artifactId>Common</artifactId>
<version>1.0</version>
</dependency>
/**
*这个是在你要使用feign接口的order项目中定义的
*/
@FeignClient(value = "UserManage", fallback = UserManageFeignFallBack.class)
public interface IUserManageFeign extends UserManageAPI {
/**
* 根据生日查用户列表接口
* @param birthday 生日
* @return 用户信息列表
* */
@PostMapping("/usermanage/feign/findUserByBirthday")
List<UserInfo> findUserByBirthday(@RequestParam("birthday") String birthday);
//这里你也可以继续写其他的feign接口
}
你会发现UserManageFeignFallBack类中,因为继承了UserManageAPI 会生成一个findUser()方法的熔断方法。
@Component
public class UserManageFeignFallBack implements IUserManageFeign {
@Override
public UserInfo findUser(String s) {
return null;
}
}
三、这样在order项目中,就可以正常使用findUser()方法
@PostMapping("/testMethod")
Result testMethod(String id) {
UserInfo userinfo = userManageFeign.findUser(id);
return Result.success(userinfo);
}
总结
这样设计的目的是什么呢?
1、省事。我们把常用的feign接口中的方法,如:findUser(),放到通用的工具类(Common项目)UserManageAPI接口中,这样我们每一个引入了Common的项目(order项目),都可以用IUserManageFeign继承UserManageAPI接口,而无需再IUserManageFeign中,重写findUser()。但仍需要在fallback类中,一键生成熔断方法。
2、统一管理。只要继承了UserManageAPI 接口,我就在业务项目中,直接调用想要用的方法即可。而在UserManageAPI发生变化时,我们也方便修改业务项目中的使用方式,而不会发生遗漏。
3、不影响正常新建feign中的方法。例如:findUserByBirthday(),这种不常用的方法我们仍然在IUserManageFeign接口中正常写就可以了。
更多推荐

所有评论(0)