相信大家在项目开发应用服务过程中都曾遇到很头疼的事情,比如服务中依赖的中间件升级,必须要强制升级应用系统,让应用服务系统做些与之无关的事情,下面给大家简单介绍一个场景
_
上面中 RPCServiceFacade 为 RPC 服务接口,RPCServiceFacadeAdapter 为本地代理接口,实现了RPC
服务接口, BusinessMgrServiceImpl
为本地应用服务类,RPCServiceFacadeAdapterAgent为RPC代理实现类,封装了获取RPC服务代理过程,RPCProxyHandler
为jdk动态代理,新增内容为中间件升级代码内容。
public class CredentialsCenterFacadeAdapterAgent<T extends CredentialsCenterFacade> implements IBaseAdapter<T>{
private CredentialsCenterFacadeAdapter credentialsCenterFacadeAdapter = null;
@Override
public T getProxy() throws Exception {
if(null == credentialsCenterFacadeAdapter){
throw new RuntimeException("CredentialsCenterFacadeAdapterAgent error , credentialsCenterFacadeAdapter is empty .");
}
return (T) Proxy.newProxyInstance(credentialsCenterFacadeAdapter.getClass().getClassLoader(),
credentialsCenterFacadeAdapter.getClass().getInterfaces(), new RpcJDKProxyHandler(credentialsCenterFacadeAdapter));
}
public CredentialsCenterFacadeAdapterAgent(CredentialsCenterFacadeAdapter credentialsCenterFacadeAdapter) {
this.credentialsCenterFacadeAdapter = credentialsCenterFacadeAdapter;
}
public CredentialsCenterFacadeAdapterAgent() {
}
}
以上代码为RPC服务的代理实现类,代理的核心是要拥有被代理类的引用,此引用继承了RPC服务接口。 Spring 提供了jdk自带及
cglib 两种代理方式实现aop切面编程,之所以没有借助Spring的功能,是希望加深对代理的理解
。
后续还会提供非侵入的方式解决此类问题,敬请关注。