这个是我看网上的一个前辈设计的这种结构!

一、你需要在通用项目(例如: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接口中正常写就可以了。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐