我們姑且稱服務(wù)請求的發(fā)起者為客戶端氮帐,那么客戶端為了發(fā)出請求椰拒,
首先需要獲取該服務(wù)對象笔咽,通過ServiceFactory類中的getService方法可以獲取某個服務(wù)對象鳍徽。其中該方法需要傳入一個invokerconfig的對象,主要是一些配置參數(shù)首昔。getService主要做了兩件事情寡喝,第一個是獲取之前provider在zk上注冊的數(shù)據(jù),第二個是利用jdk proxy獲得服務(wù)接口代理類勒奇。
public Object proxyRequest(InvokerConfig<?> invokerConfig) throws SerializationException {
return Proxy.newProxyInstance(ClassUtils.getCurrentClassLoader(invokerConfig.getClassLoader()),
new Class[] { invokerConfig.getServiceInterface() }, new ServiceInvocationProxy(invokerConfig,
InvokerProcessHandlerFactory.selectInvocationHandler(invokerConfig)));
}
以上就是利用jdk proxy來生成代理類的過程预鬓,后面請求的分析當(dāng)然也是從這里開始。
當(dāng)然還有一大堆初始化的事情赊颠,
if (!isStartup) {
ServiceInvocationRepository.getInstance().init();
InvokerProcessHandlerFactory.init();
SerializerFactory.init();
LoadBalanceManager.init();
RegionPolicyManager.INSTANCE.init();
Monitor monitor = MonitorLoader.getMonitor();
if (monitor != null) {
monitor.init();
}
ResponseProcessorFactory.selectProcessor().getResponseProcessThreadPool().prestartAllCoreThreads();
isStartup = true;
logger.warn("pigeon client[version:" + VersionUtils.VERSION + "] has been started");
}
分別會初始化服務(wù)倉庫格二、process組件、序列化組件竣蹦、負(fù)載均衡組件顶猜、區(qū)域策略、監(jiān)控相關(guān)和響應(yīng)處理器痘括。這些部分會在之后一一敘述长窄。
利用spring的ioc,很容易將這些proxy作為bean注冊到容器中纲菌,以便后面方便調(diào)用挠日。
接下來當(dāng)客戶端發(fā)出請求后,根據(jù)JDK Proxy的實(shí)現(xiàn)翰舌,就會調(diào)用ServiceInvocationHandler類的handle方法嚣潜,而proxy中的handler又是通過InvokerProcessHandlerFactory類來初始化的,看看工廠類的init方法椅贱,
public static void init() {
if (!isInitialized) {
if (Constants.MONITOR_ENABLE) {
registerBizProcessFilter(new RemoteCallMonitorInvokeFilter());
}
registerBizProcessFilter(new TraceFilter());
registerBizProcessFilter(new DegradationFilter());
registerBizProcessFilter(new ClusterInvokeFilter());
registerBizProcessFilter(new GatewayInvokeFilter());
registerBizProcessFilter(new ContextPrepareInvokeFilter());
registerBizProcessFilter(new SecurityFilter());
registerBizProcessFilter(new RemoteCallInvokeFilter());
bizInvocationHandler = createInvocationHandler(bizProcessFilters);
isInitialized = true;
}
}
這一點(diǎn)設(shè)計(jì)上利用了chain-filter的模式懂算,進(jìn)行鏈?zhǔn)教幚怼F渲蠺raceFilter是進(jìn)行監(jiān)控的一些處理夜涕,DegradationFilter是用于降級犯犁,ClusterInvokeFilter是用來處理集群中的調(diào)用方式,GatewayInvokeFilter是獲取具體的服務(wù)者女器,ContextPrepareInvokeFilter組要是處理了一些請求參數(shù)相關(guān)的東西酸役,SecurityFilter是安全相關(guān)的事情,而RemoteCallInvokeFilter是進(jìn)行真正的服務(wù)調(diào)用驾胆。
這里主要關(guān)注下RemoteCallInvokeFilter里面做了些什么涣澡。
Pigeon的請求目前分為四種模式, SYNC丧诺、CALLBACK入桂、FUTURE和ONEWAY。SYNC就是指同步返回請求結(jié)果驳阎;CALLBACK是指有返回后會自動調(diào)用客戶端傳進(jìn)來的CALLBACK對象抗愁,其實(shí)就是回調(diào)模式馁蒂;FUTURE和JDK中的FUTURE概念基本一致,會先返回FUTURE這個占位符蜘腌,然后客戶端可以利用這個占位符來獲得結(jié)果沫屡;ONEWAY的意思就是一去不復(fù)返,表示客戶端并不關(guān)心服務(wù)端響應(yīng)的結(jié)果撮珠。
具體執(zhí)行的過程也很簡單沮脖,pigeon會將參數(shù)序列化后,利用netty的方法直接把數(shù)據(jù)write出去芯急,然后應(yīng)答回來后勺届,按照不同的模式返回給客戶端,當(dāng)然這些過程都是異步的娶耍。