1:不要出现相互依赖 或者循环依赖, 最好是单向依赖 (之前pb出现循环依赖)
2:api之间不相互依赖, 只是实现之间相互依赖api,这样就不会出现循环依赖了
比如 现在的需求是 查询达人需要查询达人的行程, 查询达人的行程,也需要查询行程属于哪个达人 这个看起来似乎是
class User{
private Journey journey;
}
class Journey{
private User user;
}
达人模块依赖于行程模块 行程模块也依赖达人模块 如果按照之前的设计一定是这样的
也就是 user-api 里面有个方法 需要根据userId来获取行程对象Journey 而Journey对象在journey-api里面 所以 user-api 依赖了 journey-api
同理, 需要根据journeyId 来获取User对象 那么 journey-api依赖了user-api. 那么问题来了,maven打包 很可能就会因为两者相互依赖编译通不过
如果改进一下呢?是这样的
那么现在,实现只依赖api,api之间不依赖 , 然后通过dubbo的暴露服务的方式,自动去查找对应的实现
事实上,设计也是合理的, 细想一下, user-api为什么要依赖行程 journey-api 呢
要依赖也是具体的实现的时候 才会获取到行程
那么,问题又来了,我需要获取达人和他的行程 怎么办, 也就是最上面的User对象带journey
别急,如果是这样的需求,那么这样的一个接口, 不应该是user-api 单独提供,也不应该是 journey-api单独提供.
那么,怎么返回呢.答案应该是这样的,这一个controller里面调用2次
1: 获取User对象 User user=userService.getById(userId);
2:获取Journey对象 Journey journey=journerService.getByUserId(userId);
class UserResp{
privatee User user;
private Journey journey;
}
UserResp resp =new UserResp ();
resp .serUser(user);
resp .setJourney(journey);
这样是不是解决了呢 ,如果为了减少远程调用,那么是不是可用使用一个base-api 依赖 user-api 和 journey-api 一次返回
那么对于最开始提到的pb循环依赖也是一样,2个对象相互依赖,那么怎么解决呢,那就是加一个对象,就像UserResp 把2个对象组合到一起
所以解决这种循环依赖的本质,还是抽象一个第三方模块, 来分别依赖User和Journey。而不是两者互相嵌套,相互依赖
写到这里,你是不是觉得,这个循环依赖,像是死锁,两个人都需要对方的锁,但是都不给,导致都拿不到,然后互相等待。
这就跟2个小朋友都喜欢对方的玩具一样,都想交换来玩,但是谁都不想先给对方,怕对方不给自己,当然小孩子的心理是这样的。
那么这样依赖怎么促成这个交易呢, 这就需要一个中间人了,比如爸爸妈妈说:你们先把玩具都给我,我不会要你们的玩具吧,这样说孩子肯定相信爸爸妈妈
于是,当爸爸妈妈都拿到玩具之后,再分别给2个小朋友,这样是不是就顺利完成了?
那么在这里爸爸妈妈充当了一个什么角色呢?没错,就是中间人。就是上面的第三方模块。就是上面的UserResp的
上面的情况是A---B 而且B---A的情况
那么 A---B B---C C---A的情况呢 这个是一个环状
这个情况怎么解决呢? 有没有办法?
其实,没错,还是可以用上述方法实现