相同应用在不同区域的实例跨区域调用
程序员文章站
2022-03-24 15:26:49
...
有以下场景:同一个应用被部署到公有云上不同区域,区域之间跨公网,应用访问的数据库是使用公有云的数据库产品,采用一主多从模式,数据同步采用单向同步;例如部署在区域A的user服务要修改用户数据,它必须要要调用区域B的user服务,因为区域A的数据库是只读副本,区域B的数据才是主库;这样user服务需要开放修改接口,当user服务在区域B,直接本地修改接口,否则调用区域B的接口;这样就需要把和业务逻辑无关的代码,例如判断当前区域、开放接口、远程调用接口、解析结果等操作能够抽取出来,下沉到框架中。
用户登录场景也可能存在相同应用在不同区域的实例跨区域调用的情况。用户的数据进行了分区管理例如session,只保存在用户注册时选择的区域的应用内;如果用户在其它区域登录,应用可能的做法是先调用用户所在区域的应用进行登录操作,然后把结果返回给客户端,并让客户端再重定向到他所在区域。
// 用户代码示例
@Service
public class UserService {
public String getUserName(int userId){
// 访问本地只读副本数据库
return "test";
}
@SupportRemote //表示该方法会调用其它区域的应用实例的saveUserName,默认访问主库区域应用实例
public boolean saveUserName(int userId, String userName){
// 主库所在区域的应用实例会执行以下代码
return true;
}
@SupportRemote
public LoginInfo login(int userId, @RegionParam String userRegion){
// 被@RegionParam注解的参数用来指定当前应用是调用哪个区域的应用
return null;
}
}
以上自定义的SupportRemote、RegionParam会被框架读取,被注释的方法并被AOP代理,在代理类中完成上面描述的跨区域调用逻辑;以下是整体框架和一些主要类或接口,远程调用主要是使用了Spring的HttpInvoker相关类,并扩展增加了接口请求签名机制:
RPC部分参考了dubbo;
public interface Protocol {
Exporter export(Method method, Object target) throws RpcException;
Function refer(Method method, URL url) throws RpcException;
}
推荐阅读